研究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狀態(tài)存器STATUS REGISTER BITS(SR)這個C是否能正常使用。 找到的SR定義及說明僅有如下的內容: 狀態(tài)寄存器SR的位定義: C :進位標志位,發(fā)生進位時置1 Z :零位 N :負數(shù)位 GIE :通用中斷允許位,1開全部中斷,0關全部中斷。 CPUOFF :CPU關閉位,既除RAM內容,端口、寄存器和特別允許的外圍模塊保持活動外,全部停止活動,所有允許的中斷可以喚醒。 OSCOFF :晶震關閉位,既除RAM內容,端口和寄存器保持活動外,全部活動停止,只可能在GIE置位條件下有外部中斷或由NMI喚醒,如果不同時對CPUOFF置位,則不能對它置位; SCG0/1 :系統(tǒng)時鐘發(fā)生器控制位0和1,控制系統(tǒng)時鐘發(fā)生器的4種狀態(tài); V :溢出位,當運算結果超出有符號數(shù)范圍時置位,對字和字節(jié)格式均有效。
原來知道并使用的設置和清除SR的指令是bis、bic,見下例: __bis_SR_register(LPM0_bits); __bis_SR_register(LPM2_bits); __bic_SR_register_on_exit(LPM2_bits); 先測試if(C)這樣的寫法,編譯執(zhí)行沒有問題,但C每次==1,error。原因是C僅僅是BIT0定義,不指定是誰的bit0,一直==1,并非指向SR地址。 當然原來常用的寫法是if(data &0x80) ...;高位先,傳完一次再前移1位。 找SR的地址,不知道,后找到個函數(shù)。 __get_SR_register(); __get_SR_register_on_exit(); 最初想到的作用: 1、如本文的作用,取C、Z、N的值等; 2、判斷CPU狀態(tài),如晶振是否正常,是在哪種LPM(LPM0、1、2、3),但不能用于LPM4(CPU全停,只有外部中斷可喚醒)。 3、其它作用,暫不知。 順便測試了一下網上找到的“ C :進位標志位,發(fā)生進位時置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;移位(數(shù)據破壞),后者在判斷完MSB(最高位)后才data<<=1;移位(數(shù)據破壞)。 2、讀取SR相對復雜,沒有多少好處,語句多,稍不注意有可能出錯。不如用&0x80來的方便,16位的則用&0x8000,也很方便直觀。 3、對各種編譯器而言,后的兼容性更好。所以大部分程序中和人員常用0x80這個很強悍的數(shù)。 如果反響好,改天上貼,再寫液晶驅動調試的艱難歷程及UC1617s的驅動程序。
|