標(biāo)題: 用HC89S105C8單片機(jī)驅(qū)動(dòng)串行LCD1602 附程序 [打印本頁(yè)]
作者: Well2000 時(shí)間: 2020-11-22 15:03
標(biāo)題: 用HC89S105C8單片機(jī)驅(qū)動(dòng)串行LCD1602 附程序
用驅(qū)動(dòng)串行LCD1602
手頭有一塊HC89S105C8開(kāi)發(fā)板, 打算做一個(gè)電容測(cè)試器. 首先需要連接和驅(qū)動(dòng)1602的LCD顯示屏, 由于開(kāi)發(fā)板上的引出端口并不連續(xù), 如圖01所示, 如果用8位數(shù)據(jù)線(xiàn)的話(huà), 接線(xiàn)將十分不方便. 因此使用了帶PCF8574驅(qū)動(dòng)的1602顯示屏.
圖01.JPG (41.71 KB, 下載次數(shù): 63)
下載附件
HC89S105C8開(kāi)發(fā)板端口
2020-11-22 15:01 上傳
考慮到HC89S105系列單片機(jī)端口具有多種輸入輸出配置方式的特點(diǎn), 本程序的開(kāi)發(fā)關(guān)鍵在于端口的配置處理上.
1. 配置時(shí), 首先需要定義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)端口為帶上拉開(kāi)漏輸出
由于SDA數(shù)據(jù)線(xiàn)在發(fā)送數(shù)據(jù)后需要讀取應(yīng)答脈沖, 所以還需要設(shè)置輸入方向
#defineSetSdaIn P3M1 = P3M1 &Bin(00001111) | Bin(01100000) //IIC_SDA(P3_1)端口為帶上拉輸入
3.在控制程序中, 需要設(shè)置端口為輸出方向時(shí), 只要直接輸入以下指令即可:
SetSclOut;
SetSdaOut;或SetSdaOutOD;
4. SDA數(shù)據(jù)線(xiàn)在發(fā)送數(shù)據(jù)后需要讀取應(yīng)答脈沖時(shí), 設(shè)置為:
SetSdaIn;
讀取完成后, 再重新設(shè)置到輸出方式:
SetSdaOut;或SetSdaOutOD;
程序中, 為了使顯示數(shù)據(jù)美觀(guān)和符合習(xí)慣, 還設(shè)置了顯示數(shù)據(jù)高位無(wú)效零消除程序:
//-------------------------------------------------------------------
//按指定位置(列,行)顯示一個(gè)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);
}
*/
//無(wú)效零消除模式
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ù)為單個(gè)整數(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);
}
這樣, 當(dāng)顯示數(shù)值的最高位等于零時(shí), 顯示屏就自動(dòng)消除了.
圖02.jpg (1.16 MB, 下載次數(shù): 50)
下載附件
2020-11-22 15:02 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |