AT89S51I2C控制PCF8576段码LCD模块
void main(void)
{
uchar i,k,m;
uchar cnt[5];
SubAdr=0x80; //为显示缓冲区赋首地址
SlvAdr=PCF8576; //赋器件总线地址
ByteCnt=5; //显示位数赋值
PCF8576SET(); //总线初始化
//ClearLcd(); //清除屏显
while(1)
{
for(m=1;m<11;m++) //0-9 10个数字计数
{
for(k=0;k<5;k++) //循环5次形成稳定显示
{
for(i=0;i<5;i++) //5位显示
{
/***************************************************************************************
以下的程序含义:
显示数据寄存器cnt[5]设定后,在没有装填前只是5个空位置,此时cnt[0]=0;cnt[1]=0---cnt[i]=0;
在第一次执行tmp[i]=Digit[cnt[i]];时,屏幕显示5位全0,接下来执行cnt[4]++;后cnt[4]=1
此后在下一次执行tmp[i]=Digit[cnt[i]];时tmp[0]=Digit[cnt[0]]=Digit[0]=0(0xd7)其它依次同上
直至tmp[4]=Digit[cnt[4]]=Digit[1]=1(0x06);此时屏显为00001;循环重复直至当第一字符位累计
为9时屏显为99999此后屏显清0如上重复。
****************************************************************************************/
tmp[i]=Digit[cnt[i]]; //显示数据装入显示缓存区
Display_Da
delay_long(50); //通过延时控制显示字符的变换速度
}
}
/*********************************************************************
以下的程序含义:
首先在第5位累加,满10进位1至99999时清0重复
能力所限、终未能将下面单调的重复语句变为一个算式模型。
*********************************************************************/
cnt[4]++;
if(cnt[4]>9)
{
cnt[4]=0;
cnt[3]++;
}
if(cnt[3]>9)
{
cnt[3]=0;
cnt[2]++;
}
if(cnt[2]>9)
{
cnt[2]=0;
cnt[1]++;
}
if(cnt[1]>9)
{
cnt[1]=0;
cnt[0]++;
}
if(cnt[0]>9)
break;
}
}
}
程序中0-9的数字编码是根据实际测绘的硬件电路图编制的,至于别人程序中或PDF资料中的编码方式,是绝不可以照搬的,因为每一种模块的内部接线都不尽相同,编码也就不同了,这种电路在控制时,最主要的一点就是,一定要根据段码位数先建立一个数组(显示数据存储区),在数据显示之前,先把显示数据装填到数组当中,再把它按位送入显示缓冲区就OK了,至于开总线,关总线,送指令,送数据等等都是模式化操作,只要按规定做好即可,控制起来也没什么太复杂的;因为只是玩玩,不求甚解,至此,这只模块也就玩完了,如果日后需要数字显示的话或许还能用到它,别的用途我就想不出来了,至于做时间显示,我总觉得它土不土、洋不洋没劲。这种器件已流传很久了,或许已经过时了,或许还有新出的我不知道,虽然我玩过了,但这些资料可能还会有人有用,所以就放在这里共享吧。还是老办法,程序是在μV2编译软件窗口中粘贴过来的,若有用的话反向操作即可;如果用到了就知会一声,可以共享可以转载,但不可做为网站的登陆下载资源,发现必究,仅此而已,别无它求。
附硬件电路图:
AT89S51I2CPCF8576段码LCD模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)