标题:
1602液晶屏仿真 电子时钟日历设计
[打印本页]
作者:
heicc
时间:
2016-5-29 15:49
标题:
1602液晶屏仿真 电子时钟日历设计
1602lcd液晶屏仿真 51单片机的电子时钟日历设计原理图如下:
0.png
(34.52 KB, 下载次数: 88)
下载附件
2016-5-29 15:48 上传
0.png
(82.11 KB, 下载次数: 81)
下载附件
2016-5-29 15:47 上传
仿真文件及完整的程序代码下载:
http://www.51hei.com/bbs/dpj-50777-1.html
#include <reg51.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/*定义年月日参数变量*/
unsigned char YEAR1 = 2;
unsigned char YEAR2 = 0;
unsigned char YEAR3 = 1;
unsigned char YEAR4 = 6;
unsigned char MONTH1 = 0;
unsigned char MONTH2 = 1;
unsigned char DAY1 = 2;
unsigned char DAY2 = 6;
unsigned char HOUR1 = 0;
unsigned char HOUR2 = 0;
unsigned char MINUTE1 = 0;
unsigned char MINUTE2 = 0;
unsigned char SECOND1 = 0;
unsigned char SECOND2 = 0;
unsigned char time[10];
unsigned char Y_M[10];
unsigned char count = 0;
/*LCD1602写入8位数据子函数*/
void LcdWriteCom(unsigned char com);
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/
void LcdInit();
void add1day(unsigned char month_day); //按按键后天数本月减一
void sub1month(void); //按按键后月数减一
unsigned char returnDays(unsigned char months); //获取本月有多少天
void Lcd1602_Delay1ms(unsigned char c) //延时1ms函数
{
unsigned char a,b;
for (; c>0; c--)
for (b=199;b>0;b--)
for(a=1;a>0;a--)
;
}
void add1Sec(void) //调用此函数LCD1602显示屏上秒数加1
{
SECOND2++;
if (SECOND2 > 9) //>'9'
{
SECOND2 = 0;
SECOND1++;
}
}
void time1() interrupt 1 //定时器中断
{
unsigned char i, j;
TH0=(65536-50000)/256; //16位定时器0x60B0 高八位TH0 60低八位 B0 定时50000微秒触发定时器
TL0=(65536-50000)%256;
count++;
if (count % 16 == 0)
{
add1Sec();
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80+0x40);
for (j = 0; j < 8; j++)
LcdWriteData(time[j]);
LcdWriteCom(0x80);
for (i = 0; i < 10; i++)
LcdWriteData(Y_M[i]);
if(count == 240)
count = 0;
}
if (SECOND1 >= 6) //=='6'
{
SECOND1 = 0;
MINUTE2++;
}
if (MINUTE2 > 9)
{
MINUTE2 = 0;
MINUTE1++;
if (MINUTE1 >= 6) //'6'
{
MINUTE1 = 0;
HOUR2++;
for(i = 0; i < 19; i++)
add1Sec();
}
}
if (HOUR2 > 9)
{
HOUR2 = 0;
HOUR1++;
}
if (HOUR1 >= 2) //'2' ,'4'
{
if(HOUR2 >= 4)
{
HOUR1 = 0;
HOUR2 = 0;
MINUTE1 = 0;
MINUTE2 = 0;
SECOND1 = 0;
SECOND2 = 0;
add1day(returnDays(MONTH1*10+MONTH2));
}
}
Y_M[0] = (char)(YEAR1+48);
Y_M[1] = (char)(YEAR2+48);
Y_M[2] = (char)(YEAR3+48);
Y_M[3] = (char)(YEAR4+48);
Y_M[4] = '-';
Y_M[5] = (char)(MONTH1+48);
Y_M[6] = (char)(MONTH2+48);
Y_M[7] = '-';
Y_M[8] = (char)(DAY1+48);
Y_M[9] = (char)(DAY2+48);
time[0] = (char)(HOUR1+48);
time[1] = (char)(HOUR2+48);
time[2] = ':';
time[3] = (char)(MINUTE1+48);
time[4] = (char)(MINUTE2+48);
time[5] = ':';
time[6] = (char)(SECOND1+48);
time[7] = (char)(SECOND2+48);
}
unsigned char returnDays(unsigned char months)
{
if (MONTH2 < 10 && MONTH1 == 0)
switch(MONTH2)
{
case 1: return 31; break;
case 2:
if (((YEAR3*10+YEAR4)%4 == 0 && (YEAR3*10+YEAR4) != 0 )
||((YEAR3 * 10 + YEAR4) == 0 && (YEAR1+YEAR2)%4 == 0))
return 29;
else
return 28;
break;
case 3: return 31; break;
case 4: return 30; break;
case 5: return 31; break;
case 6: return 30; break;
case 7: return 31; break;
case 8: return 31; break;
case 9: return 30; break;
}
else if(MONTH1 == 1 && MONTH2 <= 2)
{
if (MONTH1 == 1 && MONTH2 == 0)
return 31;
if (MONTH1 == 1 && MONTH2 == 1)
return 30;
if (MONTH1 == 1 && MONTH2 == 2)
return 31;
}
}
void sub1day(void)
{
if(DAY1 == 0)
{
if(DAY2 != 1)
DAY2--;
else
{
sub1month();
DAY1 = (unsigned char) returnDays(MONTH1*10+MONTH2)/10;
DAY2 = returnDays(MONTH1*10+MONTH2)%10+1; //...
}
}
if(DAY1 != 0)
{
if(DAY2 != 0)
DAY2--;
else
{
DAY1--;
DAY2 = 9;
}
}
}
void add1month(void)
{
if (MONTH2 == 9)
{
MONTH1 = 1;
MONTH2 = 0;
}
else if (MONTH1 == 0 ||(MONTH1 == 1 && MONTH2 < 2))
MONTH2++;
else if (MONTH1*10+MONTH2 == 12)
{
MONTH1 = 0;
MONTH2 = 1;
YEAR4++;
}
}
void add1day(unsigned char month_day) //获取本月有多少天后,天数减1
{
if (DAY1*10+DAY2 == month_day)
{
DAY2 = 1;
DAY1 = 0;
add1month();
}
else
{
if(DAY2 != 9)
DAY2++;
else
{
DAY2 = 0;
DAY1++;
}
}
}
void sub1month(void) //减一个月
{
if(MONTH1 == 0)
{
if(MONTH2 != 1)
MONTH2--;
else
{
MONTH1 = 1;
MONTH2 = 2;
if(YEAR4 != 0)
YEAR4--;
else
{
if(YEAR3 != 0)
{
YEAR3--;
YEAR4 = 9;
}
else
{
if(YEAR2 != 0)
{
YEAR2--;
YEAR3 = 9;
YEAR4 = 9;
}
else
{
if(YEAR1 != 0)
{
YEAR1--;
YEAR2 = 9;
YEAR3 = 9;
YEAR4 = 9;
}
else
;
}
}
}
}
}
else
{
if(MONTH2 == 0)
{
MONTH1 = 0;
MONTH2 = 9;
}
else
MONTH2--;
}
}
void main(void)
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//打开中断总开关
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
P3 = 0XFF;
LcdInit();
while(1)
{
if (P3 != 0XFF)
switch(P3)
{
case 0xFE: //按 按键后加一小时
Lcd1602_Delay1ms(20);
while(P3 == 0xFE);
Lcd1602_Delay1ms(5);
HOUR2++;
break;
case 0xFD: //按 按键后减一小时
Lcd1602_Delay1ms(20);
while(P3 == 0xFD);
Lcd1602_Delay1ms(5);
if (HOUR1 != 0 && HOUR2 == 0)
{
HOUR1--;
HOUR2 = 9;
break;
}
else if(HOUR1 == 0 && HOUR2 == 0)
{
HOUR1 = 2;
HOUR2 = 3;
MINUTE1 = 0;
MINUTE2 = 0;
sub1day();
}
else if (HOUR2 != 0)
HOUR2--;
break;
case 0xFB: //按 按键后加一分钟
Lcd1602_Delay1ms(20);
while(P3 == 0xFB);
Lcd1602_Delay1ms(5);
MINUTE2++;
break;
case 0XF7:
Lcd1602_Delay1ms(20);
while(P3 == 0xF7);
Lcd1602_Delay1ms(5);
if (MINUTE2 == 0) //分钟减到0时处理
{
if(MINUTE1 == 0)
{
MINUTE1 = 5;
MINUTE2 = 9;
if (HOUR2 != 0)
HOUR2--;
else
{
if(HOUR1 != 0)
{
HOUR1--;
HOUR2 = 9;
}
else
{
HOUR1 = 2;
HOUR2 = 3;
MINUTE1 = 5;
MINUTE2 = 9;
sub1day();
}
}
}
else
{
MINUTE2 = 9;
MINUTE1--;
}
break;
}
else
MINUTE2--;
break;
case 0XDF:
Lcd1602_Delay1ms(20);
while(P3 == 0xDF);
Lcd1602_Delay1ms(5);
sub1month();
break;
case 0XEF:
Lcd1602_Delay1ms(20);
while(P3 == 0xEF);
Lcd1602_Delay1ms(5);
add1month();
break;
case 0XBF:
Lcd1602_Delay1ms(20);
while(P3 == 0xBF);
Lcd1602_Delay1ms(5);
add1day(returnDays(MONTH1*10+MONTH2));
break;
case 0X7F:
Lcd1602_Delay1ms(20);
while(P3 == 0x7F);
Lcd1602_Delay1ms(5);
sub1day();
break;
default:
break;
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1