用驱动串行LCD1602 手头有一块HC89S105C8开发板, 打算做一个电容测试器. 首先需要连接和驱动1602的LCD显示屏, 由于开发板上的引出端口并不连续, 如图01所示, 如果用8位数据线的话, 接线将十分不方便. 因此使用了带PCF8574驱动的1602显示屏.
HC89S105C8开发板端口
考虑到HC89S105系列单片机端口具有多种输入输出配置方式的特点, 本程序的开发关键在于端口的配置处理上.
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数据线在发送数据后需要读取应答脉冲, 所以还需要设置输入方向 #defineSetSdaIn P3M1 = P3M1 &Bin(00001111) | Bin(01100000) //IIC_SDA(P3_1)端口为带上拉输入
3.在控制程序中, 需要设置端口为输出方向时, 只要直接输入以下指令即可: SetSclOut; SetSdaOut;或SetSdaOutOD;
4. SDA数据线在发送数据后需要读取应答脉冲时, 设置为: SetSdaIn; 读取完成后, 再重新设置到输出方式: SetSdaOut;或SetSdaOutOD;
程序中, 为了使显示数据美观和符合习惯, 还设置了显示数据高位无效零消除程序: //------------------------------------------------------------------- //按指定位置(列,行)显示一个Int数字 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数为单个整数数组 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); }
这样, 当显示数值的最高位等于零时, 显示屏就自动消除了. |