大神求救~~!!小白已经绝望!!
实现的功能:
1、LCD1602显示当前日期和时间;
2、LCD1602实现秒表功能。
打开电源,LCD1602实现日期及时间显示,
第一行显示年月日,,格式为2017/03/24,第二行
显示当前时间,格式为22:34:43。按键123可以调节时间。
当按下独立按键4时,LCD1602处于秒表模式,当按下独立按
键5时,启动秒表,再按按键5,秒表停止,再按
按键6,返回日期和时间显示界面。
程序:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void LCD_Initialize();
void LCD_Set_POS(uchar);
void LCD_Write_Data(uchar);
void Display_String(uchar*,uchar);
void LCD_Write_Command(uchar);
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5;
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_en=P2^7;
uchar KeyCount=0;
uchar code firstline[]="2017-03-27";
uchar code secondline[]="16-34-00";
uchar code msg1[]={" Second Watch 0 "};
uchar code msg2[]={">>>> "};
uchar code Prompts[][16]=
{
{"::1----> "},
{"::1----> ::2 "},
{"::1->2 ::3--> "},
{"::1->2 ::3-->4"}
};
uchar Time_Buffer[]={0,0,0,0};
uchar LCD_Display_Buffer[]={"00:00:00:00"};
uchar i;
uchar hour,minutes,seconds;
uchar count,num;
uchar cnt;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<=112;y++)
{
}
}
}
void LCD_Write_Command(uchar cmd)
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=cmd;
delay(100);
lcd_en=1;
delay(100);
lcd_en=0;
}
void LCD_Write_Data(uchar str)
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=str;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void LCD_Initialize()
{
lcd_en=0;
delay(5);LCD_Write_Command(0x38);
delay(5);LCD_Write_Command(0x0f);
delay(5);LCD_Write_Command(0x06);
delay(5);LCD_Write_Command(0x80);
delay(5);
}
void Time1init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Clockinit()
{
hour=0;
minutes=0;
seconds=0;
count=0;
num=0;
}
void display(uchar hour,uchar minutes,uchar seconds)
{
uchar hourge,hourshi,minutesshi,minutesge,secondsshi,secondsge;
hourshi=hour/10;
hourge=hour%10;
LCD_Write_Command(0x80+0x40);
LCD_Write_Data(hourshi+48);
delay(1);
LCD_Write_Data(hourge+48);
delay(1);
minutesshi=minutes/10;
minutesge=minutes%10;
LCD_Write_Command(0x80+0x43);
LCD_Write_Data(minutesshi+48);
delay(1);
LCD_Write_Data(minutesge+48);
delay(1);
secondsshi=seconds/10;
secondsge=seconds%10;
LCD_Write_Command(0x80+0x46);
LCD_Write_Data(secondsshi+48);
delay(1);
LCD_Write_Data(secondsge+48);
delay(1);
}
void revise()
{
if(K1==0)
{
delay(5);
if(K1==0)
{
cnt++;
TR0=0;
}
while(!K1);
delay(5);
while(!K1);
}
if(cnt==1)
{
LCD_Write_Command(0x80+0x46);
LCD_Write_Command(0x0f);
if(K2==0)
{
delay(5);
if(K2==0)
{
seconds++;
if(seconds==60)
{
seconds=0;
}
}
while(!K2);
delay(5);
while(!K2);
}
if(K3==0)
{
delay(5);
if(K3==0)
{
seconds--;
if(seconds==-1)//here is a bug
{
seconds=59;
}
}
while(!K3);
delay(5);
while(!K3);
}
}
if(cnt==2)
{
LCD_Write_Command(0x80+0x43);
LCD_Write_Command(0x0f);
if(K2==0)
{
delay(5);
if(K2==0)
{
minutes++;
if(minutes==60)
{
minutes=0;
}
}
while(!K2);
delay(5);
while(!K2);
}
if(K3==0)
{
delay(5);
if(K3==0)
{
minutes--;
if(minutes==-1)
{
minutes=59;
}
}
while(!K3);
delay(5);
while(!K3);
}
}
if(cnt==3)
{
LCD_Write_Command(0x80+0x40);
LCD_Write_Command(0x0f);
if(K2==0)
{
delay(5);
if(K2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(!K2);
delay(5);
while(!K2);
}
if(K3==0)
{
delay(5);
if(K3==0)
{
hour--;
if(hour==-1)
{
hour=23;
}
}
while(!K3);
delay(5);
while(!K3);
}
}
if(cnt==4)
{
TR0=1;
cnt=0;
}
}
void Show_Second()
{
uchar i;
LCD_Set_POS(0x45);
for(i=3;i!=0xff;i--)
{
LCD_Display_Buffer[2*i+1]=Time_Buffer/10+'0';
LCD_Display_Buffer[2*i ]=Time_Buffer%10+'0';
LCD_Write_Data(LCD_Display_Buffer[2*i+1]);
LCD_Write_Data(LCD_Display_Buffer[2*i]);
LCD_Write_Data(':');
}
}
void Time0() interrupt 1
{
TH0=-10000/256;
TL0=-10000%256;
Time_Buffer[0]++;
if(Time_Buffer[0]==100)
{
Time_Buffer[0]=0;
Time_Buffer[1]++;
}
if(Time_Buffer[1]==60)
{
Time_Buffer[1]=0;
Time_Buffer[2]++;
}
if(Time_Buffer[2]==60)
{
Time_Buffer[2]=0;
Time_Buffer[3]++;
}
if(Time_Buffer[3]==24)
Time_Buffer[3]=0;
}
void Time1() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
seconds++;
if(seconds==60)
{
seconds=0;
minutes++;
if(minutes==60)
{
minutes=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main()
{
LCD_Initialize();
Time1init();
Clockinit();
while(1)
{
revise();
display(hour,minutes,seconds);
for(i=0;i<10;i++)
{
LCD_Write_Data(firstline);
delay(1);
}
LCD_Write_Command(0x80+0x40);
for(i=0;i<8;i++)
{
LCD_Write_Data(secondline);
delay(1);
}
if(K4==0)
{
uchar i;
IE=0x82;
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256;
LCD_Initialize();
Display_String(msg1,0x00);
Display_String(msg2,0x40);
while(1)
{
if(k5==0)
{
delay(100);
i=++KeyCount;
switch(i)
{
case 1:
case 3:TR0 =1;
Display_String(Prompts[i-1],0);
break;
case 2:
case 4:TR0 =0;
Display_String(Prompts[i-1],0);
break;
default:TR0=0;
break;
}
while (k5==0);
}
else
if(k6==0)
{
TR0=0;
KeyCount=0;
for(i=0;i<4;i++)
Time_Buffer=0;
Display_String(msg1,0);
delay(100);
while(k6==0) ;
}
Show_Second();
}
}
}
}
void LCD_Set_POS(uchar Position)
{
LCD_Write_Command(Position|0x80);
}
void Display_String(uchar*str,uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k=0;k<16;k++)
LCD_Write_Data (str[k]);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>