研究LCD128128驱动程序时,看到一个语句LCD_SDA = CY; 当时明白C51中CY是进位标志,这种写法有点意思,好象很简洁。原程序见下: //传送指令 voidtransfer_command_lcd(unsigned char cmd) { int k; LCD_CS = 0; LCD_RS= 0; for (k=0; k<8; k++) { cmd = cmd<<1; LCD_SCL = 0; LCD_SDA = CY; LCD_SCL = 1; } LCD_CS=1; } 因为要用MSP430驱动,很多语句要改,这个CY也估计要改。查msp430的h文件,是用C代替CY,但感觉不对。改完其它语句后,来实测这MSP430状态存器STATUS REGISTER BITS(SR)这个C是否能正常使用。 找到的SR定义及说明仅有如下的内容: 状态寄存器SR的位定义: C :进位标志位,发生进位时置1 Z :零位 N :负数位 GIE :通用中断允许位,1开全部中断,0关全部中断。 CPUOFF :CPU关闭位,既除RAM内容,端口、寄存器和特别允许的外围模块保持活动外,全部停止活动,所有允许的中断可以唤醒。 OSCOFF :晶震关闭位,既除RAM内容,端口和寄存器保持活动外,全部活动停止,只可能在GIE置位条件下有外部中断或由NMI唤醒,如果不同时对CPUOFF置位,则不能对它置位; SCG0/1 :系统时钟发生器控制位0和1,控制系统时钟发生器的4种状态; V :溢出位,当运算结果超出有符号数范围时置位,对字和字节格式均有效。
原来知道并使用的设置和清除SR的指令是bis、bic,见下例: __bis_SR_register(LPM0_bits); __bis_SR_register(LPM2_bits); __bic_SR_register_on_exit(LPM2_bits); 先测试if(C)这样的写法,编译执行没有问题,但C每次==1,error。原因是C仅仅是BIT0定义,不指定是谁的bit0,一直==1,并非指向SR地址。 当然原来常用的写法是if(data &0x80) ...;高位先,传完一次再前移1位。 找SR的地址,不知道,后找到个函数。 __get_SR_register(); __get_SR_register_on_exit(); 最初想到的作用: 1、如本文的作用,取C、Z、N的值等; 2、判断CPU状态,如晶振是否正常,是在哪种LPM(LPM0、1、2、3),但不能用于LPM4(CPU全停,只有外部中断可唤醒)。 3、其它作用,暂不知。 顺便测试了一下网上找到的“ C :进位标志位,发生进位时置1”这话的意思,描述对不对?中间有进位时,是否置1?测试结果:如0001+1=0010,C为0,重复加一直为0!只有0xff+1时才C==1,OK,测试完成。这话的描述有岐义! 总结: 1、使用SRC=__get_SR_register()&C;if(SRC)...;与使用if(aa&0x80)...;需注意及关注的重点是,前者先在取值前data<<=1;移位(数据破坏),后者在判断完MSB(最高位)后才data<<=1;移位(数据破坏)。 2、读取SR相对复杂,没有多少好处,语句多,稍不注意有可能出错。不如用&0x80来的方便,16位的则用&0x8000,也很方便直观。 3、对各种编译器而言,后的兼容性更好。所以大部分程序中和人员常用0x80这个很强悍的数。 如果反响好,改天上贴,再写液晶驱动调试的艰难历程及UC1617s的驱动程序。
|