为了可以让大家清楚的了解到lcd1602显示数字程序,小编用89S52单片机做了个程序实验。先来科普一下88S52单片机,AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
用89S52单片机写了个驱动1602液晶显示输入数字程序,大家看看如何简化if部分代码。如果需要输入数字10位以上,if代码会很长,是否必须这样写?另一个问题,想把显示的数字读出来放到一个数组里供其他函数调用,这部分还没有思路。也不知如何写?
这个程序运行是这样的。初次加电,1602液晶第1行显示“please input dat”,第2行首列显示数字1。有两个按键,SW1移动光标,SW2调数字。本程序是4位数字输入。也算是给初学者一个驱动1602液晶的例子。这是关于以下程序的一个说明。
基于89S52单片机的lcd1602显示数字程序
#include《reg51.h》
#define uchar unsigned char
#define uint unsigned int
#define lcd_DO P2
uchar code TAB[]={“1234567890”};
uchar code TAB1[]={“please-input-dat”};
sbit SW1=P0^0;
sbit SW2=P0^1;
sbit lcdrs=P3^7;
sbit lcdrw=P3^6;
sbit lcden=P3^5;
void delay(); //延时
void write_com(); //写命令
void write_data();//写数据
void lcd_init(); //lcd初始化
void main();
void delay(uchar z) //延时
{
uint x,y;
for(x=z;x》0;x--);
for(y=110;y》0;y--);
}
void write_com(uchar com) //写命令
{
lcdrw=0;
lcdrs=0;
delay(5);
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //写数据
{
lcdrw=0;
lcdrs=1;
delay(5);
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
lcd_init() //lcd初始化
{
write_com(0x38);//两行显示
write_com(0x0c);//开显示不显示光标
write_com(0x01);//清屏
}
void main()
{
uchar a=0;
uchar n=0;
uchar k=0;//光标
lcd_init();
SW1=SW2=1;
write_com(0x80); //第1行1列
for(n=0;n《16;n++)
write_data(TAB1[n]);
write_com(0x80+0x40);//第2行第1列
write_data(TAB[a]);
while(1)
{
if(SW1==0)
{
k++;
delay(10);
if(SW1==0)
{
if(k==1)
{
while(!SW1);
write_com(0x80+0x40);第2行第1列
write_com(0x0f);//光标闪烁
}
if(k==2)
{
while(!SW1);
write_com(0x80+0x40+1);第2行第2列
write_com(0x0f);
}
if(k==3)
{
while(!SW1);
write_com(0x80+0x40+2);第2行第3列
write_com(0x0f);
}
}
if(k==4)
{
while(!SW1);
write_com(0x80+0x40+3);第2行第4列
write_com(0x0f);
}
if(k==5)
{
while(!SW1);
k=0;//光标标志清零
write_com(0x0c);//光标关闭
}
}
if(k==1)
{
if(SW2==0)
{
delay(10);
if(SW2==0)
{
while(!SW2);
a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0
write_com(0x80+0x40);//在第2行第1列位置写入新数据
write_data(TAB[a]);
}
}
}
if(k==2)
{
if(SW2==0)
{
delay(10);
if(SW2==0)
{
while(!SW2);
a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0
write_com(0x80+0x40+1);//在第2行第2列位置写入新数据
write_data(TAB[a]);
}
}
}
if(k==3)
{
if(SW2==0)
{
delay(10);
if(SW2==0)
{
while(!SW2);
a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0
write_com(0x80+0x40+2);//在第2行第3列位置写入新数据
write_data(TAB[a]);
}
}
}
if(k==4)
{
if(SW2==0)
{
delay(10);
if(SW2==0)
{
while(!SW2);
a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0
write_com(0x80+0x40+3);//在第2行第4列位置写入新数据
write_data(TAB[a]);
}
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)