1、据于单片机89c52和1602液晶屏的万年历程序/ Header: 1602液晶显示时间可调万年历/File Name: calender/ Author: Devine/ Date: 2010.9.15 8:30 2010.9.16 10:54#include#define uint unsigned int#define uchar unsigned char/u1,u2锁存器使能端 在此目的是为了消除对P0口的影响sbit u1=P26;sbit u2=P27;sbit led=P24;/1602液晶输出sbit en=P34;sbit rs=P35;sbit rw=P36; /控制按键
2、输出sbit key1=P30; /模式选择键sbit key2=P31; /加计数键sbit key3=P32; /复位返回键sbit key4=P33; /闹钟开关键/sbit key_com=P37; /按键公共地/定义闹钟输出sbit beep=P23;/sbit beep=P24;/全局变量定义uchar time0,sec,min,hou; /时间(时,分,秒)变量定义uchar num,week_data,week;/星期变量定义uchar month,day; /月份 日期变量定义uint year; /年份 变量定义bit y,m;/y 为闰年的判定变量 为1 则为闰年 m为
3、大月的判断,为1则为大月 m2为二月份的判定 若是二月则m2=1;/赋初值数组定义uchar code first_line= 2010-09-15 Wen; uchar code second_line= 12:30:00 ;uchar code week_data1=Mon;uchar code week_data2=Tue;uchar code week_data3=Wen;uchar code week_data4=Thu;uchar code week_data5=Fri;uchar code week_data6=Sat;uchar code week_data7=Sun;/延时子
4、函数 1ms延时void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); /液晶写指令子函数 com即所需输入的指令码void lcd_write_com(uchar com) rs=0; rw=0; en=0; P0=com; delay(5); en=1; delay(5); en=0;/液晶写数据子函数 void lcd_write_data(uchar lcd_data) rs=1; rw=0; en=0; P0=lcd_data; delay(5); en=1; delay(5); en=0;/初始化子函数(包括: 液
5、晶初始化操作 和 定时器0子函数操作)void init() uchar num; u1=0; u2=0;/关闭U1U2锁存器 防止对P0口的影响/给时间设置初值 2010-09-15 Wes 12:30:00 year=2010; month=9; day=15; week=3; hou=12; min=30; sec=0;/液晶指令初始化 en=0;/将液晶en端拉低,为初始化写指令和数据准备 lcd_write_com(0x38);/ MODE lcd_write_com(0x0c);/ DCB lcd_write_com(0x06);/ NS lcd_write_com(0x01);/
6、 清屏/液晶写初值 lcd_write_com(0x80);/写第一行地址 for(num=0;num16;num+) lcd_write_data(first_linenum); delay(5); lcd_write_com(0x80+0x40);/写第二行地址 for(num=0;num16;num+) lcd_write_data(second_linenum); delay(5); /定时器初始化 TMOD=0x01;/定时器0工作方式为1 TH0=(65535-50000)/256;/装初值 TL0=(65535-50000)%256; ET0=1;/开定时器0中断 EA=1;/开
7、总中断 TR0=1;/开始计时/星期显示动态设置void write_week(uchar week_num) uchar temp,k; temp=week_num; if(temp=1) for(k=0;k3;k+) lcd_write_data(week_data1k); delay(5); if(temp=2) for(k=0;k3;k+) lcd_write_data(week_data2k); delay(5); if(temp=3) for(k=0;k3;k+) lcd_write_data(week_data3k); delay(5); if(temp=4) for(k=0;k
8、3;k+) lcd_write_data(week_data4k); delay(5); if(temp=5) for(k=0;k3;k+) lcd_write_data(week_data5k); delay(5); if(temp=6) for(k=0;k3;k+) lcd_write_data(week_data6k); delay(5); if(temp=7) for(k=0;k3;k+) lcd_write_data(week_data7k); delay(5); /* switch (temp) case 1 : for(k=0;k3;k+) lcd_write_data(week
9、_data1k); delay(5); break; case 2 : for(k=0;k3;k+) lcd_write_data(week_data2k); delay(5); break; case 3 : for(k=0;k3;k+) lcd_write_data(week_data3k); delay(5); break; case 4 : for(k=0;k3;k+) lcd_write_data(week_data4k); delay(5); break; case 5 : for(k=0;k3;k+) lcd_write_data(week_data5k); delay(5);
10、break; case 6 : for(k=0;k3;k+) lcd_write_data(week_data6k); delay(5); break; case 7 : for(k=0;k99) year=0; data_refresh(1,year/100); lcd_write_com(0x80+1); if(key3=0) delay(5); if(key3=0) sec=0; num=0; TR0=1; /开启定时器 lcd_write_com(0x0c);/取消闪烁 /闹钟设定void clock() bit flag; if(key4=0) /闹钟开关键 delay(5); if
11、(key4=0) flag= !flag; while(!key4); if(flag=1) led=0; if(min=0) if(hou=0) beep=0; delay(1000); beep=1; if(hou0)&(hou0)&(sec12)&(hou0)&(sec=hou-12) beep=0; delay(110); beep=1; delay(110); beep=0; delay(110); beep=1; delay(770); if(flag=0) led=1; /主函数void main() init(); while(1) time_key_set(); clock(
12、); /定时器中断子函数void t0() interrupt 1 TH0=(65535-50000)/256; TL0=(65535-50000)%256; time0+; if(time0=20) time0=0; sec+; if(sec=60) sec=0; min+; if(min=60) min=0; hou+; if(hou=24) hou=0; day+; week+; if(week=8) week=1; lcd_write_com(0x80+13); /注意这两行的顺序 不能反过来 write_week(week); /注意这两行的顺序 不能反过来 big_month(mo
13、nth); /调用大小月判断子函数 if(m=1) if(day=32) day=1; month+; if(month=13) month=1; year+; if(year=9999) year=0; data_refresh(1,year/100); data_refresh(3,year%100); data_refresh(6,month); else if(day=31) day=1; month+; data_refresh(6,month); if(month=2) leapyear_choise(year);/调用闰年判断子函数 if(y=1) if(day=30) day=1; month=3; data_refresh(6,month); else if(y=0) if(day=29) day=1; month=3; data_refresh(6,month); data_refresh(9,day); data_refresh(0x40+4,hou); data_refresh(0x40+7,min); data_refresh(0x40+10,sec);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1