用驅(qū)動串行LCD1602 手頭有一塊HC89S105C8開發(fā)板, 打算做一個電容測試器. 首先需要連接和驅(qū)動1602的LCD顯示屏, 由于開發(fā)板上的引出端口并不連續(xù), 如圖01所示, 如果用8位數(shù)據(jù)線的話, 接線將十分不方便. 因此使用了帶PCF8574驅(qū)動的1602顯示屏.
圖01.JPG (41.71 KB, 下載次數(shù): 63)
下載附件
HC89S105C8開發(fā)板端口
2020-11-22 15:01 上傳
考慮到HC89S105系列單片機端口具有多種輸入輸出配置方式的特點, 本程序的開發(fā)關(guān)鍵在于端口的配置處理上.
1. 配置時, 首先需要定義IIC通訊端口: sbitIIC_SDA = P1^7; sbitIIC_SCL = P3^0;
2. 然后, 配置端口的輸入輸出定義: //端口輸入輸出控制定義 #defineSetSclOut P3M0 = P3M0 & Bin(11110000) | Bin(00001000) //IIC_SCL(P3_0)端口為推挽輸出 #defineSetSdaOut P1M3 = P1M3 & Bin(00001111) | Bin(10000000) //IIC_SDA(P1_7)端口為推挽輸出 #defineSetSdaOutOD P1M3 = P1M3 &Bin(00001111) | Bin(10100000) //IIC_SDA(P1_7)端口為帶上拉開漏輸出 由于SDA數(shù)據(jù)線在發(fā)送數(shù)據(jù)后需要讀取應答脈沖, 所以還需要設(shè)置輸入方向 #defineSetSdaIn P3M1 = P3M1 &Bin(00001111) | Bin(01100000) //IIC_SDA(P3_1)端口為帶上拉輸入
3.在控制程序中, 需要設(shè)置端口為輸出方向時, 只要直接輸入以下指令即可: SetSclOut; SetSdaOut;或SetSdaOutOD;
4. SDA數(shù)據(jù)線在發(fā)送數(shù)據(jù)后需要讀取應答脈沖時, 設(shè)置為: SetSdaIn; 讀取完成后, 再重新設(shè)置到輸出方式: SetSdaOut;或SetSdaOutOD;
程序中, 為了使顯示數(shù)據(jù)美觀和符合習慣, 還設(shè)置了顯示數(shù)據(jù)高位無效零消除程序: //------------------------------------------------------------------- //按指定位置(列,行)顯示一個Int數(shù)字 void LCD_DispInt(unsigned char Col,unsigned char Row, unsigned int Numb) { unsignedchar i;
BreakInt(Numb); /* //全部顯示方式 for(i= 0; i < 5; i++) { LCD_DispChar(Col+i,Row, One[ i]+48); } */ //無效零消除模式 if(One[0]==0) LCD_DispChar(Col+0,Row, ' '); else LCD_DispChar(Col+0, Row, One[0]+48);
if(One[0]==0&& One[1]==0) LCD_DispChar(Col+1,Row, ' '); else LCD_DispChar(Col+1, Row, One[1]+48);
if(One[0]==0&& One[1]==0 && One[2]==0) LCD_DispChar(Col+2,Row, ' '); else LCD_DispChar(Col+2, Row, One[2]+48);
if(One[0]==0&& One[1]==0 && One[2]==0 && One[3]==0) LCD_DispChar(Col+3,Row, ' '); else LCD_DispChar(Col+3, Row, One[3]+48);
LCD_DispChar(Col+4,Row, One[4]+48); }
//---------------------------------------------------------------------------- //分解Int數(shù)為單個整數(shù)數(shù)組 void BreakInt(unsigned int iNum) { One[0]= (unsigned char)(iNum / 10000); iNum= iNum % 10000; One[1]= (unsigned char)(iNum / 1000); iNum= iNum % 1000; One[2]= (unsigned char)(iNum / 100); iNum= iNum % 100; One[3]= (unsigned char)(iNum / 10); One[4]= (unsigned char)(iNum % 10); }
這樣, 當顯示數(shù)值的最高位等于零時, 顯示屏就自動消除了.
圖02.jpg (1.16 MB, 下載次數(shù): 50)
下載附件
2020-11-22 15:02 上傳
|