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

据于单片机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); } }


相关文章:
何中文 51单片机和lcd1602的万年历设计_图文
本文研究的万年历系统拟用 STC89C52 单片机控制, ...芯片计时、 以 DS18B20 采集温度、1602 液晶屏显示...3.0~5.5V,在寄生电源方式下可由数 据 线供电。...
1602液晶显示万年历程序
1602液晶显示万年历程序_电子/电路_工程科技_专业资料。基于STC89C51单片机的1602液晶显示万年历程序 ,集成有时间显示,年月日显示,星期显示以及闹钟功能,并且会进行...
用51单片机和1602液晶做的数字钟_图文
用 STC89C52 单片机和 1602 液晶做的数字时钟 ...(0x18);//液晶整屏左移指令 delay(200);//没 ...文档贡献者 雨落划痕day 贡献于2015-12-06 ...
单片机AT89S52液晶1602显示数字万年历
单片机AT89S52液晶1602显示数字万年历_信息与通信_工程科技_专业资料。单片机学习...基于AT89S52单片机的电子... 44页 4下载券 据于单片机89c52和1602液... ...
51单片机的18B20、1602液晶显示温度与万年历显控制系统
51单片机的18B20、1602液晶显示温度与万年历显控制系统_电子/电路_工程科技_专业资料。51 单片机的 18B20、1602 液晶显示温度与万年历显控制系统 摘 要 本设计以数...
基于STC89C52单片机的多功能电子万年历
基于STC89C52单片机的多功能电子万年历_电子/电路_...用直观的数字显示,数据显示采用 1602A 液晶显示模块...本系统的时间读取主要来源于单片机对 DS1302 的操作...
51单片机+LCD1602液晶显示的接法
51单片机+LCD1602液晶显示的接法_专业资料。51单片机...液晶显示器具有厚度薄、适用于大规模集成电路直接驱动...液晶显示模块可以和单片机 AT89C51 直接接口,电路...
基于stc51单片机的LCD1602显示时间_的电子万年历(显示...
基于stc51单片机的LCD1602显示时间_的电子万年历(...目前所具备的设备只 有一块以 STC89C52 为内核的...通过把 RST 输入驱动置高电平来启动所有的数 据...
基于LCD1602液晶显示屏的电子万年历设计【两个C程序】
基于LCD1602液晶显示屏的电子万年历设计【两个C程序...主控制器单片机的选择 采用比较流行的 AT89S52 ...要向寄存器写入控制字,还需要读取相应寄存器的数 据...
万年历(DS1302+LCD1602【程序、仿真、完整】)
万年历(DS1302+LCD1602【程序、仿真、完整】)_信息通信_工程科技_专业资料。实时时钟DS1302液晶LCD1602显示的万年历基于52 单片机的万年历显示(采用实时芯片 DS...
更多相关标签: