当前位置:首页 >> 能源/化工 >>

据于单片机89c52和1602液晶屏的万年历程序


// Header: 1602 液晶显示时间可调万年历 //File Name: calender // Author: Devine // Date: 2010.9.15 8:30 ~2010.9.16 10:54 #include<reg52.h> #define uint unsigned int #define uchar unsigned char //u1

,u2 锁存器使能端在此目的是为了消除对 P0 口的影响 sbit u1=P2^6; sbit u2=P2^7; sbit led=P2^4; //1602 液晶输出 sbit en=P3^4; sbitrs=P3^5; sbitrw=P3^6; //控制按键输出 sbit key1=P3^0; //模式选择键 sbit key2=P3^1; //加计数键 sbit key3=P3^2; //复位返回键 sbit key4=P3^3; //闹钟开关键 //sbitkey_com=P3^7; //按键公共地 //定义闹钟输出 sbit beep=P2^3; //sbit beep=P2^4; //全局变量定义 uchar time0,sec,min,hou; //时间(时,分,秒)变量定义 ucharnum,week_data,week;//星期变量定义 ucharmonth,day; //月份日期变量定义 uint year; //年份变量定义 bit y,m;//y 为闰年的判定变量为 1 则为闰年 m 为大月的判断,为 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"; //延时子函数 1ms 延时 void delay(uint z)

{ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //液晶写指令子函数 com 即所需输入的指令码 voidlcd_write_com(uchar com) { rs=0; rw=0; en=0; P0=com; delay(5); en=1; delay(5); en=0; } //液晶写数据子函数 voidlcd_write_data(ucharlcd_data) { rs=1; rw=0; en=0; P0=lcd_data; delay(5); en=1; delay(5); en=0; } //初始化子函数(包括:液晶初始化操作和定时器 0 子函数操作) voidinit() { ucharnum; 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);// 清屏 //液晶写初值 lcd_write_com(0x80);//写第一行地址 for(num=0;num<16;num++) { lcd_write_data(first_line[num]); delay(5); } lcd_write_com(0x80+0x40);//写第二行地址 for(num=0;num<16;num++) { lcd_write_data(second_line[num]); delay(5); } //定时器初始化 TMOD=0x01;//定时器 0 工作方式为 1 TH0=(65535-50000)/256;//装初值 TL0=(65535-50000)%256; ET0=1;//开定时器 0 中断 EA=1;//开总中断 TR0=1;//开始计时 } //星期显示动态设置 voidwrite_week(ucharweek_num) { uchartemp,k; temp=week_num; if(temp==1) { for(k=0;k<3;k++) { lcd_write_data(week_data1[k]); delay(5); } } if(temp==2) { for(k=0;k<3;k++) {

lcd_write_data(week_data2[k]); delay(5); } } if(temp==3) { for(k=0;k<3;k++) { lcd_write_data(week_data3[k]); delay(5); } } if(temp==4) { for(k=0;k<3;k++) { lcd_write_data(week_data4[k]); delay(5); } } if(temp==5) { for(k=0;k<3;k++) { lcd_write_data(week_data5[k]); delay(5); } } if(temp==6) { for(k=0;k<3;k++) { lcd_write_data(week_data6[k]); delay(5); } } if(temp==7) { for(k=0;k<3;k++) { lcd_write_data(week_data7[k]); delay(5); } }/*

switch (temp) { case 1 : for(k=0;k<3;k++) { lcd_write_data(week_data1[k]); delay(5); } break; case 2 : for(k=0;k<3;k++) { lcd_write_data(week_data2[k]); delay(5); } break; case 3 : for(k=0;k<3;k++) { lcd_write_data(week_data3[k]); delay(5); } break; case 4 : for(k=0;k<3;k++) { lcd_write_data(week_data4[k]); delay(5); } break; case 5 : for(k=0;k<3;k++) { lcd_write_data(week_data5[k]); delay(5); } break; case 6 : for(k=0;k<3;k++) { lcd_write_data(week_data6[k]); delay(5); } break; case 7 : for(k=0;k<3;k++) { lcd_write_data(week_data7[k]); delay(5); } break;

}*/ } //闰年判断的子函数 void leapyear_choise(uint s) { if(((s%4==0)&&(s%100!=0))||(s%400==0)) y=1; 非求模(/) else y=0; } //大小月份的判断 voidbig_month(ucharmon) { switch(mon) { case 1 : m=1;break; case 3 : m=1;break; case 5 : m=1;break; case 7 : m=1;break; case 8 : m=1;break; case 10: m=1;break; case 12: m=1;break; case 4 : m=0;break; case 6 : m=0;break; case 9 : m=0;break; case 11: m=0;break; } } //液晶显示动态数据即时刷新显示数据 void data_refresh(ucharadd,ucharre_data) //add 为需要刷新的位置地址 ch_data 为需要改变 的数据 { uchar s0,s1;//分别为各位的十进制数 s1=re_data/10; s0=re_data%10; lcd_write_com(0x80+add); lcd_write_data(0x30+s1); //高位刷新 lcd_write_data(0x30+s0);//低位刷新 } voidtime_key_set() { //功能键设定 //四年一闰一百年不闰四百年一闰 //能被某个数整除即对这个数求余(%),而

//

key_com=0; if(key1==0) { delay(5); //按键延时消抖 if(key1==0) { num++; while(!key1); //松手检测 if(num==1) { TR0=0; //当进入调时模式时关闭 T0 计时器,停止计时 lcd_write_com(0x80+0x40+10); //设定需要调改的位置地址 lcd_write_com(0x0d); //被选中的位光标闪烁 } else if(num==2) { lcd_write_com(0x80+0x40+7); } else if(num==3) { lcd_write_com(0x80+0x40+4); } else if(num==4) { lcd_write_com(0x80+13); } else if(num==5) { lcd_write_com(0x80+9); } else if(num==6) { lcd_write_com(0x80+6); } else if(num==7) { lcd_write_com(0x80+3); } else if(num==8) { lcd_write_com(0x80+1); } else if(num==9) { //星期 //时钟 //分钟 秒钟

//日期

//月份

//年 (低位)

//年 (高位)

sec=0; num=0; TR0=1; //开启定时器 lcd_write_com(0x0c);//取消闪烁 } } } //加计数键设定 if(num!=0)//只有在功能设定键起作用期间才可以调时除此之外该键将不起作用 { if(key2==0) { delay(5); if(key2==0) { while(!key2);//松手检测 if(num==1) { sec++; if(sec==60) sec=0; data_refresh(0x40+10,sec); 据发送给液晶 lcd_write_com(0x80+0x40+10); } if(num==2) { min++; if(min==60) min=0; data_refresh(0x40+7,min); lcd_write_com(0x80+0x40+7); } if(num==3) { hou++; if(hou==24) hou=0; data_refresh(0x40+4,hou); lcd_write_com(0x80+0x40+4); } if(num==4) { week++; //选择需要更改的地址位

//即使将更新的时间显示数

if(week==8) week=1; write_week(week); lcd_write_com(0x80+13); } if(num==5) { day++; big_month(month); if(m==1) { if(day==32) day=1; } else { if(day==31) day=1; } if(month==2) { //调用大小月判断子函数

leapyear_choise(year);//调用闰年判断子函数 if(y==1) { if(day==30) day=1; } if(y==0) { if(day==29) day=1; } } data_refresh(9,day); lcd_write_com(0x80+9); } if(num==6) { month++; if(month==13) month=1; data_refresh(6,month); lcd_write_com(0x80+6);

} if(num==7) { year++; if(year==9999) year=0; data_refresh(3,year%100); lcd_write_com(0x80+3); } if(num==8) { year=year+100; if((year/100)>99) 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(key4==0) { flag= !flag;

while(!key4); } } if(flag==1) { led=0; if(min==0) { if(hou==0) { beep=0; delay(1000); beep=1; } if((hou>0)&&(hou<13)) { if((sec>0)&&(sec<=hou)) { beep=0; delay(110); beep=1; delay(110); beep=0; delay(110); beep=1; delay(770); } } if((hou>12)&&(hou<=23)) { if((sec>0)&&(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(); } } //定时器中断子函数 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(month); //调用大小月判断子函数 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); } }


相关文章:
据于单片机89c52和1602液晶屏的万年历程序
据于单片机89c52和1602液晶屏的万年历程序_能源/化工_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 据于单片机89c52和1602液晶屏的万年历程序_能源/...
89C52,LCD1602,的万年历程序
89C52,LCD1602,的万年历程序_电子/电路_工程科技_...(0x40+10,sec); 据发送给液晶 lcd_write_com(...基于89C52单片机和DS130... 35页 1下载券 基于stc...
1602液晶显示万年历程序
1602液晶显示万年历程序_电子/电路_工程科技_专业资料。基于STC89C51单片机的1602液晶显示万年历程序 ,集成有时间显示,年月日显示,星期显示以及闹钟功能,并且会进行...
基于stc89c51单片机的1602液晶简易万年历
基于stc89c51单片机的1602液晶简易万年历_电子/电路_工程科技_专业资料。基于stc...据于单片机89c52和1602液... 14页 免费 单片机万年历89c51、ds1... 23...
何中文 51单片机和lcd1602的万年历设计
何中文 51单片机和lcd1602的万年历设计_电子/电路_...本文研究的万年历系统拟用 STC89C52 单片机控制, ...电路设计框图根据上章确定的方案给出了系统整体的...
基于51单片机和lcd1602的万年历设计
基于51 单片机和 lcd1602 的万 年历设计 常熟理工...本文研究的万年历系统拟用 STC89C52 单片机控制, ...电路设计框图根据上章确定的方案给出了系统整体的...
单片机lcd1602-万年历c程序
基于lcd1602的万年历源程... 5页 免费 单片机万年历89c51、ds1... 23页 ...*** /* 此万年历程序由洪春峰同学自主编写,不妥之处,还请不吝赐教,谢谢!...
基于51单片机的1602万年历
基于51单片机的1602万年历_信息通信_工程科技_专业...数 据端时钟端以及复位端,来获取时钟信息到单片机。...图四(DS1302 与液晶显示数据仿真结果) ? 程序清单...
单片机AT89S52液晶1602显示数字万年历
单片机AT89S52液晶1602显示数字万年历_信息与通信_工程科技_专业资料。单片机学习...基于AT89S52单片机的电子... 44页 4下载券 据于单片机89c52和1602液... ...
基于LCD1602液晶显示屏的电子万年历设计【两个C程序】
基于LCD1602液晶显示屏的电子万年历设计【两个C程序...和 31 字节静态 RAM,通过简单的串行接口与单片机...要向寄存器写入控制字,还需要读取相应寄存器的数 据...
更多相关标签:
单片机lcd1602万年历 | 1602万年历 | lcd1602万年历 | 单片机万年历课程设计 | 单片机万年历程序 | 单片机电子万年历设计 | 单片机12864万年历 | 单片机电子万年历 |