51单片机实现1602字符液晶显示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//*********************************************************************
//1602液晶显示和一些功能
//12M晶振、8951。
//***********************************************************************
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs = P2^0;//液晶端口定义
sbit rw = P2^1;
sbit en = P2^2;
sbit k1 = P1^4;
sbit k2 = P1^5;
sbit k3 = P1^6;
sbit k4 = P1^7;
sbit P3_7 = P3^7;
uchar num,count;
char second,minute,hour;
uchar code str0[] = {"2009-08-31"};
uchar code str1[] = {"00:00:00"};
uchar code str2[] = {"1602 LCD"};
uchar code str3[] = {""};
//===============延时程序========================
void delay(uint z)
{ uint x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0; y--);
}
//============蜂鸣器程序=================================
void BEEP(void)
{
P3_7 = 0;
delay(100);
P3_7 = 1;
}
//===========写命令=============================
void write_com(uchar com)
{
rs = 0;//定义写指令
rw = 0;
en = 1;//允许读写
P0 = com;
delay(5);//延时5ms
en = 0; // 禁止读写
}
//============写数据================================
void write_date(uchar date)
{
rs = 1;//定义写数据
rw = 0;
en = 1;
P0 = date;//写入数据
delay(5);
en = 0;
}
//===============初始化=====================================
void init()
{
write_com(0x38);//显示2行,5*7
write_com(0x0c);//开显示
write_com(0x06);//光标的移动设置
write_com(0x01);//清屏
write_com(0x80+0x03);//写入指令,显示第一行,从第4位开始显示。
for(num = 0; num < 8; num++)
{
write_date(str2[num]);
delay(5);
}
write_com(0x80+0x41);//显示第二行,第2位开始显示。
for(num = 0; num < 14; num++)
{
write_date(str3[num]);
delay(5);
}
TMOD = 0x01;//选择T0,工作方式1
EA = 0;//总中断禁止。
ET0 = 1;//T0中断允许
TR0 = 1;//T0为定时器
TH0 = (65536-50000)/256;//初值50MS
TL0 = (65536-50000)%256;
}
//==============写入变化时间=====================================
void write_shijian(uchar add,uchar date)
{
uchar shi,ge;
shi = date/10;
ge = date%10;
write_com(0x80 + 0x40 + add);//写入命令
write_date(0x30 + shi);//写数据
write_date(0x30 + ge);
}
//==============键盘扫描==========================================
void key_scan()
{
//******************k1*********************************
if(k1 == 0)
delay(10);
if(k1 == 0)
{
BEEP();//调用蜂鸣器
write_com(0x01);//清屏
write_com(0x80+0x02);//显示第一行,从第3位开始显示。
for(num = 0; num < 10; num++)//写入10位字符
{
write_date(str0[num]);
delay(5);
}
write_com(0x80+0x44);//显示第二行,第5位开始显示。
for(num = 0; num < 8; num++)
{
write_date(str3[num]);
delay(5);
}
}
wh
ile(!k1);
//****************k2*************************************
if(k2 == 0)
delay(10);
if(k2 == 0)
{
BEEP();//
EA = ~EA;//开或关总中断
}
while(!k2);
//****************k3*************************************
if(k3 == 0)
delay(10);
if(k3 == 0)
{
BEEP();
hour++;
if(hour == 24)
hour=0;
write_shijian(4,hour);
write_com(0x80+0x40+4);
delay(30);
}
//*****************k4*************************************
if(k4 == 0)
delay(10);
if(k4 == 0)
{
BEEP();
minute++;
if(minute == 60)
minute = 0;
write_shijian(7,minute);
write_com(0x80+0x40+7);
delay(30);
}
}
//===============定时器中断 1 ==============================================
void timer0() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
count++;
if(count >= 20)
{
count = 0;
second++;
if(second >= 60)
{
second = 0;
minute++;
if(minute >= 60)
{
minute = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
write_shijian(4,hour);
}
write_shijian(7,minute);
}
write_shijian(10,second);
}
}
//=============主程序=============================================
void main()
{
init();//程序初始化.
while(1)
{
key_scan();
}
}