我打算用89c52做个电子表 ,就显示时间就是。显示屏用的是lcd1602.
程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a}; /*CGROM中0~9中的字符码 和 : */
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
uchar hour2,hour1, min2,min1,sec2, sec1,num,num1,num2,aa;
void delay(uint z) /*延时 z ms*/
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_com(uchar com) /*在P1口写命令 ,如: lcd_com(0x38) 【初始化命令】*/
{
rs=0;
rw=0;
P1=com;
delay(1);
e=1;
e=0;
}
void lcd_dat(uchar dat) /*在P1口写数据*/
{
rs=1;
rw=0;
P1=dat;
delay(1);
e=1;
e=0;
}
void init()
{
lcd_com(0x38); /*置功能: 8位总线、双行显示、5*7点阵字符*/
delay(1);
lcd_com(0x0c); /*显示开关控制:整体显示开、光标无、光标不闪 */
delay(1);
lcd_com(0x01); /*清显示*/
delay(1);
TMOD=0X01; /*方式寄存器:
设置定时器0采用16位定时方式,定时器通过TR0置位启动
设置定时器1采用13位定时方式,定时器通过TR1置位启动*/
/*设初值为50000,定时50ms*/
TH0=(65536-50000)/256; /* 高8位,TH1 = 60 (0011 1100)*/
TL0=(65536-50000)%256; /* 低8位,TL1 = 176(0001 0000) */
EA=1; /*CPU中断总允许位 , CPU开放所有中断源的中断请求*/
ET0=1; /*定时器T0中断允许位,允许定时器T0中断*/
TR0=1; /*启动定时器0*/
}
void display(uchar hour2,uchar hour1,uchar min2,uchar min1,uchar sec2,uchar sec1)
{
lcd_com(0x80); /*在00H地址处显示数据*/
lcd_dat(table[hour2]);
lcd_com(0x81);
lcd_dat(table[hour1]);
lcd_com(0x82);
lcd_dat(table[10]); /*显示 :*/
lcd_com(0x83);
lcd_dat(table[min2]);
lcd_com(0x84);
lcd_dat(table[min1]);
lcd_com(0x85);
lcd_dat(table[10]); /*显示 :*/
lcd_com(0x86);
lcd_dat(table[sec2]);
lcd_com(0x87);
lcd_dat(table[sec1]);
}
void main()
{
init();
while(1)
{
if(aa==20)
{
aa=0;
num++; /*秒 + 1*/
if(num==60)
{
num=0;
num1++;
if(num1==60)
{
num1=0;
num2++;
if(num2==24)
{
num2=0;
}
}
}
hour2=num2/10;
hour1=num2%10;
min2=num1/10;
min1=num1%10;
sec2=num/10;
sec1=num%10;
}
display(hour2,hour1,min2,min1,sec2,sec1);
}
}
/*中断服务程序*/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
仿真时屏幕只是亮却不显示任何数字。
请问是哪出问题了?
附lcd1602中文资料
LCD1602液晶完整中文资料.pdf
(344.19 KB)
|