12864模拟时钟

合集下载

12864液晶屏幕使用说明及程序

12864液晶屏幕使用说明及程序

12864使用说明一、串/并接口1.1 串口接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

1.2 并行接口管脚信号*注释1:如在实际应用中仅使用并口通讯模式,可将PSB 接固定高电平。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK 用焊锡短接。

二、模块主要硬件构成说明控制器接口信号说明:2.1、RS,R/W的配合选择决定控制界面的4种模式:2.2、E信号●忙标志BFBF 标志提供内部工作情况.BF=1 表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0 时, 模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF 读到DB7 总线,从而检验模块之工作状态.●字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192 个此触发器是用于模块屏幕显示开和关的控制。

DFF=1 为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。

DFF 的状态是指令DISPLAY ON/OFF 和RST 信号控制的。

●显示数据RAM(DDRAM)模块内部显示数据 RAM 提供 64×2 个位元组的空间,最多可控制 4 行 16 字(64 个字)的中文字型显示,当写入显示数据 RAM 时,可分别显示 CGROM 与CGRAM 的字型;此模块可显示三种字型,分别是半角英、数字型(16*8)、CGRAM 字型及 CGROM 的中文字型。

三种字型的选择,由在 DDRAM 中写入的编码选择,在0000H—0006H 的编码中(其代码分别是0000、0002、0004、0006 共4 个)将选择 CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于A1 以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

12864制作的时钟

12864制作的时钟

杜洋工作室 DoYoung Studio∙- 杜洋工作室DoClock电子时钟系列∙- FutureTimer4未来时钟(FT4)- 所需元器件∙- 电源使用电脑USB接口或USB电源适配器∙- FT4亮黑镀金PCB板正面- PCB板背面∙- STC12C5A32S2-35I-DIP40单片机∙- LCD12864汉字显示液晶屏- DS1302时钟芯片、32.768kHz 6pF晶体、3V贴片钮扣电池- DS18B20温度传感器- 5547光敏电阻器- 40PIN军品芯片座- 军品排针 20PIN*1 - 军品排孔 20PIN*2- 12*12mm微动开关 4个- 微型压电蜂鸣器∙- 电路原理图∙- 将20PIN排孔插入液晶屏模块的背面接口处∙- 向内倾斜一定角度并在背面焊接∙- 倾斜的角度为向内倾斜的最大极限∙- 把军品排针插入到排孔中∙- 插好后的样品- 液晶屏的正面没有任何焊点保证了正面的美观∙- 把4个微动开关一侧的2个引脚和凸出点剪掉∙- 剪后的样子∙- 余下的引脚对应单片机的20到40脚一侧如上图摆放- 把微动开关引脚与相邻的单片机引脚焊接在一起∙- 焊好后的样子∙- PCB板上共有2个miniUSB接口左右各1个- 适合不同方向的接线- 把miniUSB接头焊接在您喜欢方向的焊盘上- 把DS18B20温度传感器摆放在miniUSB接口上方的焊接上- DS18B20有字的一面朝上焊接(用于温度数据的采集)- 焊接贴片三极管和电阻(用于液晶屏背光的驱动)- 按图焊接DS1302时钟芯片(用于时间数据的生成)- 按图焊接32.768KHz晶体(用于时间的基准频率产生)- 按图焊接光敏电阻不分正负极(用于自动背光控制的采集)- 按图焊接钮扣电池(用于掉电后维持时间的走时)- 按图焊接压电蜂鸣器(用于提示音和闹钟报警)- 背面焊接后的样子- 转向正面焊接- 焊接0.1uF(104)滤波电容(用于电源高频干扰滤波)- 按图焊接100uF电容注意正负极不要焊反(用于电源低频滤波)- 按图焊接12.00MHz晶体(用于单片机时钟源)- 按图焊接2个30pF电容(用于晶体负载电容)- 插入40PIN军品芯片座- 在背面将芯片座焊在板上- 取20PIN军品排孔并剪掉一半的细针部分∙- 剪好后的样子∙- 把剪好后的排孔插入PCB背面- 插入后的样子- 从PCB背面焊接以保证正面的美观- 背面全部焊接完毕的样子- 将单片机插入到芯片座中- 再将PCB板插入到液晶屏上- 小角度立放- 大角度躺放- 制作完成后的时钟背面- 因为时钟底面有大量焊点所以不要摆放在金属板面上- 液晶屏前面焊盘不在焊接以保证最佳的外观- 侧面的光敏电阻可以感知环境光线来调节液晶背面的亮度。

12864液晶电子钟具有按键可调闹钟温度显示

12864液晶电子钟具有按键可调闹钟温度显示

12864液晶电子钟具有按键可调闹钟温度显示理解才是最主要程序已全部通过硬件测试,请放心使用。

(没有使用到DS1302)/某某某某某某某某某某某某12864时钟显示函数某某某某某某某某某某某某某//某某某某某某实现时间走动、按键控制、蜂鸣器闹铃、温度显示某某某某某某/#include<reg52.h>#include<tdio.h>#defineucharunignedchar#defineuintunignedint/某某某某某某某某某某某某某某某某某某某某功能:定义液晶12864控制端接口某某某某某某某某某某某某某某某某某某某某某/bitr=P2^6;//注意:rw控制端始终为低电平,直接在硬件上接低电平biten=P2^7;bitwd=P2^0;//温度传感器信号线/某某某某某某某某某某某某某某某某某某某某功能:定义蜂鸣器、按键接口某某某某某某某某某某某某某某某某某某某某某/bitbeet=P2^2;//蜂鸣器定义bitkey1=P1^0;//功能选择bitkey2=P1^1;//至加bitkey3=P1^2;//至减bitkey4=P1^3;//北京时间与闹钟时间画面切换/某某某某某某某某某某某某某某某某某某某某功能:定义数据初始值某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/charhour=23,minute=59,econd=58,count=0;charhi=0,fen=0,miao=0,hm;intyear=2022;charmonth=12,day=30,mm=0,cc=7;uinttemp;floatf_temp;/某某某某某某某某某某某某某某某某某某某某功能:定义数组字符串某某某某某某某某某某某某某某某某某某某某某/ucharcodetable1[]={"幸福牌电子钟"};ucharcodetable2[]={"温馨提示:00.0℃"};/某某某某某某某某某某某某某某某某某某某某功能:延时函数某某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddelay(uintz){uint某,y;for(某=z;某>0;某--)for(y=110;y>0;y--);}/某某某某某某某某某某某某某某某某某某某功能:蜂鸣器响应某某某某某某某某某某某某某某某某某某某某某某某/voidfengmingqi(){beet=0;delay(1);beet=1;delay(1);}理解才是最主要/某某某某某某某某某某某某某某某某某某某某功能:液晶12864读写数据某某某某某某某某某某某某某某某某某某/void某ieling_hu(ucharaa,ucharbb){if(aa==1){r=0;}if(aa==0){r=1;}P0=bb;delay(1);en=1;delay(1);en=0;delay(1);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入地址某某某某某某某某某某某某某某某某某某/void某ieludizhi(uchar某,uchary){witch(某){cae1:某ieling_hu(1,0某80+y);return;//return返回的意思cae2:某ieling_hu(1,0某90+y);return;cae3:某ieling_hu(1,0某88+y);return;cae4:某ieling_hu(1,0某98+y);return;}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864写入字符串某某某某某某某某某某某某某某某某某/void某iezifuchuan(uchar某dd){while(某dd!='\0'){某ieling_hu(0,某dd++);}}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864清屏函数某某某某某某某某某某某某某某某某某某某某某/voidqingping(){某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏某ieling_hu(1,0某01);//清屏delay(20);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化指令操作某某某某某某某某某某某某某某某某某某/voidinit_12864(){某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某30);//基本指令操作某ieling_hu(1,0某0C);//0某0c:无光标,O某OF:光标反白显示某ieling_hu(1,0某01);//清屏理解才是最主要某ieling_hu(1,0某06);}/某某某某某某某某某某某某某某某某某某某某功能:液晶12864初始化字串显示某某某某某某某某某某某某某某某某某某/voidinit_zifu(){某ieludizhi(1,0);某iezifuchuan("欢迎使用");delay(1);某ieludizhi(2,0);某iezifuchuan("幸福牌电子钟");delay(1);某ieludizhi(3,0);某iezifuchuan("订购热线");delay(1);某ieludizhi(4,0);某iezifuchuan("Phone:0777-66914");delay(9534);qingping();某ieludizhi(1,0);某iezifuchuan(table1);delay(1);某ieludizhi(4,0);某iezifuchuan(table2);delay(1);某ieludizhi(3,5);某iezifuchuan("星期");某ieludizhi(2,2);某iezifuchuan("年月日");}/某某某某某某某某某某某某某某某某某某某功能:时间、年月日显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay(){某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hour/10);某ieling_hu(0,0某30+hour%10);某ieling_hu(0,':');某ieling_hu(0,0某30+minute/10);某ieling_hu(0,0某30+minute%10);某ieling_hu(0,':');某ieling_hu(0,0某30+econd/10);某ieling_hu(0,0某30+econd%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:闹钟(时间、年月日)显示函数某某某某某某某某某某某某某某某某某某某某/voiddiplay1(){理解才是最主要某ieludizhi(3,0);//显示时分秒某ieling_hu(0,0某30+hi/10);某ieling_hu(0,0某30+hi%10);某ieling_hu(0,':');某ieling_hu(0,0某30+fen/10);某ieling_hu(0,0某30+fen%10);某ieling_hu(0,':');某ieling_hu(0,0某30+miao/10);某ieling_hu(0,0某30+miao%10);某ieludizhi(2,0);//显示年某ieling_hu(0,0某30+year/1000);某ieling_hu(0,0某30+year%1000/100);某ieling_hu(0,0某30+year%100/10);某ieling_hu(0,0某30+year%10);某ieludizhi(2,3);//显示月某ieling_hu(0,0某30+month/10);某ieling_hu(0,0某30+month%10);某ieludizhi(2,5);//显示日某ieling_hu(0,0某30+day/10);某ieling_hu(0,0某30+day%10);}/某某某某某某某某某某某某某某某某某某某功能:星期函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ void某ingqi(){witch(cc){cae1:某ieludizhi(3,7);某iezifuchuan("一");return;cae2:某ieludizhi(3,7);某iezifuchuan("二");return;cae3:某ieludizhi(3,7);某iezifuchuan("叁");return;cae4:某ieludizhi(3,7);某iezifuchuan("四");return;cae5:某ieludizhi(3,7);某iezifuchuan("五");return;cae6:某ieludizhi(3,7);某iezifuchuan("六");return;cae7:某ieludizhi(3,7);某iezifuchuan("日");return;}}/某某某某某某某某某某某某某某某某某某某功能:按键程序某某某某某某某某某某某某某某某某某某某/voidanjian(){if(key4==0){delay(1);hm=~hm;while(key4==0);}/某某某某某某某某某某某某某某某某某某某功能:key1按键选择功能某某某某某某某某某某某某某某某某某某某/if(key1==0){delay(1);mm++;if(hm!=0){if(mm>=4)mm=0;}理解才是最主要if(mm==1){某ieludizhi(3,3);某ieling_hu(0,0某5f);}if(mm==2){TR0=1;某ieludizhi(3,2);某ieling_hu(0,0某5f);}if(mm==3){某ieludizhi(3,0);某ieling_hu(0,0某5f);}if(mm==4){某ieludizhi(2,5);某ieling_hu(0,0某5f);}if(mm==5){某ieludizhi(2,3);某ieling_hu(0,0某5f);}if(mm==6){某ieludizhi(2,1);某ieling_hu(0,0某5f);}if(mm==7){某ieludizhi(3,7);某ieling_hu(0,0某5f);}if(mm==8){某ieludizhi(2,7);某ieling_hu(0,0某02);}if(mm>=9){某ieludizhi(2,7);某ieling_hu(0,0某20);mm=0;}//mm=0;跳出调整时间while(key1==0);}/某某某某某某某某某某某某某某某某某某某功能:key2按键加减功能某某某某某某某某某某某某某某某某某某某/if(mm==1&&key2==0)//秒加1{if(hm==0){TR0=0;delay(1);if(key2==0){econd++;if(econd>=60){e cond=0;}}}if(hm!=0){delay(1);if(key2==0){miao++;if(miao>=60){miao=0;}}} while(key2==0);}if(mm==1&&key3==0)//秒减1{if(hm==0){TR0=0;delay(1);if(key3==0){econd--;if(econd<=-1){econd=59;}}}if(hm!=0){delay(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}while(key3==0);}if(mm==2&&key2==0)//分加1{if(hm==0){delay(1);if(key2==0){minute++;if(minute>=60){minut e=0;}}}if(hm!=0){delay(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}while(key2==0);}if(mm==2&&key3==0)//分减1{if(hm==0){delay(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}}if(hm!=0){delay(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}} while(key3==0);}理解才是最主要if(mm==3&&key2==0)//时加1{if(hm==0){delay(1);if(key2==0){hour++;if(hour>=24){hour=0;}}} if(hm!=0){delay(1);if(key2==0){hi++;if(hi>=24){hi=0;}}}while(key2==0);}if(mm==3&&key3==0)//时减1{if(hm==0){delay(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}}if(hm!=0){delay(1);if(key3==0){hi--;if(hi<=-1){hi=23;}}} while(key3==0);}if(mm==4&&key2==0)//日加1{delay(1);if(key2==0){day++;if(day>=31){day=1;}}while(key2==0);}if(mm==4&&key3==0)//日减1{delay(1);if(key3==0){day--;if(day<=0){day=31;}}while(key3==0);}if(mm==5&&key2==0)//月加1 {delay(1);if(key2==0){month++;if(month>=13){month=1;}}理解才是最主要while(key2==0);}if(mm==5&&key3==0)//月减1{delay(1);if(key3==0){month--;if(month<=0){month=12;}}while(key3==0);}if(mm==6&&key2==0)//年加1{delay(1);if(key2==0){year++;}//不设置年限while(key2==0);}if(mm==6&&key3==0)//年减1{delay(1);if(key3==0){year--;}while(key3==0);}if(mm==7&&key2==0)//星期加1 {delay(1);if(key2==0){cc++;if(cc>=8){cc=1;}}while(key2==0);}if(mm==7&&key3==0)//星期减1 {delay(1);if(key3==0){cc--;if(cc==0){cc=7;}理解才是最主要}while(key3==0);}}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某功能:18B20所有函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//某某某某某某某某某某某某某某某某某某某18B20复位,初始化函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voiddreet(void){uinti;wd=0;i=103;while(i>0)i--;wd=1;i=4;while(i>0)i--;}/某某某某某某某某某某某某某某某某某某某18B20读1位函数某某某某某某某某某某某某某某某某某某某某某某某某某某/bittempreadbit(void){uinti;bitdat;wd=0;i++;//i++起延时作用wd=1;i++;i++;dat=wd;i=8;while(i>0)i--;return(dat);}/某某某某某某某某某某某某某某某某某某某18B20读1个字节函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uchartempread(void){uchari,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);理解才是最主要}/某某某某某某某某某某某某某某某某某某某18B20写一个字节数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempwritebyte(uchardat){uinti;ucharj;bittetb;for(j=1;j<=8;j++){tetb=dat&0某01;dat=dat>>1;if(tetb)//写1{wd=0;i++;i++;wd=1;i=8;while(i>0)i--;}ele{wd=0;//写0i=8;while(i>0)i--;wd=1;i++;i++;}}}/某某某某某某某某某某某某某某某某某某某18B20开始获取温度并转换函数某某某某某某某某某某某某某某某某某某某某某某某某某某/voidtempchange(void){dreet();delay(1);tempwritebyte(0某cc);//写跳过读ROM指令tempwritebyte(0某44);//写温度转换指令}/某某某某某某某某某某某某某某某某某某某18B20读取寄存器中存储的温度数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/uintget_temp(){uchara,b;dreet();delay(1);理解才是最主要tempwritebyte(0某cc);tempwritebyte(0某be);a=tempread();//读低8位b=tempread();//读高8位temp=b;temp<<=8;//两个字节组合为1个字temp=temp|a;f_temp=temp某0.0625;//温度在寄存器中为12位分辨率位0.0625°temp=f_temp某10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入f_temp=f_temp+0.05;returntemp;//temp是整型}/某某某某某某某某某某某某某某某某某某某18B20发送数据函数某某某某某某某某某某某某某某某某某某某某某某某某某某/{do{SBUF=某parr++;//发送数据while(!TI);//等待发送完成标志为1TI=0;//标志清零}while(某parr);//保持循环直到字符为'\0'}/某某某某某某某某某某某某某某某某某某某某某某某某功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(){ucharbuff[4];TMOD=0某01;//设置T0为工作方式1EA=1;ET0=1;TR0=1;//开启T0中断TH0=-50000/256;TL0=-50000%256;init_12864();init_zifu();hm=0;while(1){if(count>5&&count<18){tempchange();//开始获取温度get_temp();//读取寄存温度printf(buff,"%f",f_temp);某ieludizhi(4,5);某ieling_hu(0,0某30+temp/100);某ieling_hu(0,0某30+temp%100/10);理解才是最主要某ieling_hu(0,0某2e);某ieling_hu(0,0某30+temp%100%10);}if(hm==0)diplay();//如果hm=0显示北京时间,否则显示闹钟时间elediplay1();anjian();//按键判断某ingqi();//显示星期if(minute==59&&econd==59){fengmingqi();}//整点报时if(hi==hour&&fen==minute&&miao>=econd&&miao<=econd+3){fengmi ngqi();}//闹钟}}/某某某某某某某某某某某某某某某某某某某某某某某某功能:中断函数某某某某某某某某某某某某某某某某某某某某某某某某某某/ {TH0=-50000/256;TL0=-50000%256;count++;if(count==20){count=0;econd++;if(econd==60){econd=0;minute++;if(minute==60) {minute=0;hour++;if(hour==24){hour=0;day++;cc++;if(cc==8)cc=1; if(day==31){day=1;month++;if(month==13)理解才是最主要{month=1;year++; }}} } } } }。

时钟显示12864

时钟显示12864

主程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#include<intrins.h>#include<math.h>#include<zhongduan.h>#include<ku.h>#define LCD_databus P0sbit sck=P1^0;sbit io=P1^1;sbit rst=P3^6;sbit RS=P2^2; //RS为0---命令;1----数据sbit RW=P2^1; //RW为1---写;0---读sbit EN=P2^0; //使能端sbit CS1=P2^4; //片选1低电平有效,控制左半屏sbit CS2=P2^3; //片选1低电平有效,控制右半屏sbit k1=P1^4;sbit k2=P1^5;sbit k3=P1^6;sbit k4=P1^7;uint t0,t1,t2,j0,j1,j2,shu=12,yue=7;void write_ds1302(uchar add,uchar dat);void write_ds1302_byte(uchar dat);uchar read_ds1302(uchar add);void set_rtc(void);void read_rtc(void);void time_pros(void);void display(void);uchar disp[20];uchar time_data[7]={12,6,7,27,12,3,3}; //设定起始时间uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//年周月天时分秒uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy{P0=0x00;RS=0;RW=1;EN=1;while(P0 & 0x80);EN=0;}void write_LCD_command(uchar value) //写命令函数{Read_busy(); //对LCD的每次读写都要读忙RS=0; //选择命令RW=0; //读操作LCD_databus=value;EN=1; //EN由1----0锁存有效数据_nop_();_nop_();EN=0;}void write_LCD_data(uchar value)//写数据函数{Read_busy();RS=1; //选择数据RW=0;LCD_databus=value;EN=1; //EN由1----0锁存有效数据_nop_();_nop_();EN=0;}uchar Read_LCD(void) //读数据函数{uchar value;Read_busy();LCD_databus=0xFF; //先进行一次空读操作RS=1;RW=1;EN=1;_nop_();_nop_();EN=0;LCD_databus=0xFF; //读取真正的数据RS=1;RW=1;EN=1;value=LCD_databus;_nop_();_nop_();EN=0;return value;}void Set_page(uchar page) //设置“页”LCD12864共8页,一页是8行点阵点{page=0xb8|page; //页的首地址为0xB8write_LCD_command(page);}void Set_line(uchar startline) //设置显示的起始行{startline=0xC0|startline; //起始行地址为0xC0write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示}void Set_column(uchar column) //设置显示的列{column=column &0x3f; //列的最大值为64column= 0x40|column; //列的首地址为0x40write_LCD_command(column); //规定显示的列的位置}void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示{onoff=0x3e|onoff; //onoff:1---开显示;0---关显示write_LCD_command(onoff);}void SelectScreen(uchar screen) //选择屏幕{switch(screen){case 0: CS1=0;CS2=0;break; //全屏case 1: CS1=0;CS2=1;break;//左半屏case 2: CS1=1;CS2=0;break;//右半屏case 3: CS1=1;CS2=1;break;//无屏default:break;}}void ClearScreen(uchar screen) //清屏函数{uchar i,j;SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏for(i=0;i<8;i++) //控制页数0-7,共8页{Set_page(i);Set_column(0);for(j=0;j<64;j++) //控制列数0-63,共64列{write_LCD_data(0x00); //写入0,地址指针自加1 }}}void InitLCD() //LCD的初始化{SetOnOff(1); //开显示SelectScreen(0);ClearScreen(0); //清屏Set_line(0); //开始行:0}void Display_SZ(uchar ss,uchar page,uchar column,uchar *p){uchar i;SelectScreen(ss);Set_page(page); //写上半页Set_column(column*8); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i]); //汉字的上半部分}Set_page(page+1); //写下半页Set_column(column*8); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i+8]); //汉字的下半部分}}void Display_HZ(uchar ss,uchar page,uchar column,uchar *p){uchar i;SelectScreen(ss);Set_page(page); //写上半页Set_column(column*16); //控制列for(i=0;i<16;i++) //控制16列的数据输出{write_LCD_data(p[i]); //汉字的上半部分}Set_page(page+1); //写下半页Set_column(column*16); //控制列for(i=0;i<16;i++) //控制16列的数据输出{write_LCD_data(p[i+16]); //汉字的下半部分}}void write_ds1302_byte(uchar dat){uchar i;for(i=0;i<8;i++){sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}void write_ds1302(uchar add,uchar dat){rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}uchar read_ds1302(uchar add){uchar i,value;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sck=0;if(io)value=value|0x80;sck=1;}rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;}void set_rtc(void){uchar i,j;Display_HZ(2,6,0,lin);Display_HZ(2,6,1,peng);for(i=0;i<7;i++){j=time_data[i]/10;time_data[i]=time_data[i]%10;time_data[i]=time_data[i]+j*16;}write_ds1302(0x8e,0x00);for(i=0;i<7;i++){write_ds1302(write_add[i],time_data[i]);}write_ds1302(0x8e,0x80);}void read_rtc(void){uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]);}}void time_pros(void){disp[0]=time_data[6]%16; //秒disp[1]=time_data[6]/16;disp[2]=time_data[5]%16; //分disp[3]=time_data[5]/16;disp[4]=time_data[4]%16; //时disp[5]=time_data[4]/16;disp[6]=time_data[3]%16; //天disp[7]=time_data[3]/16;disp[8]=time_data[2]%16; //月disp[9]=time_data[2]/16;disp[10]=time_data[1]%16; //周disp[11]=time_data[1]/16;disp[12]=time_data[0]%16; //年disp[13]=time_data[0]/16;}void dingshi() interrupt 1{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=0;t0=1;t1=1;t2=1;while(1){if(k1==0){delay(200);j1++;}if(j1==1)while(t1){switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}if(k2==0){delay(180);shu++;j0=shu/10;time_data[0]=shu%10;time_data[0]=time_data[0]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[0],time_data[0]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}}if(k3==0){delay(180);shu--;j0=shu/10;time_data[0]=shu%10;time_data[0]=time_data[0]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[0],time_data[0]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}}if(k1==0){t1=0;delay(200);j1=2;}}if(j1==2)while(t2){switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}switch(disp[12]) //年{case 0:Display_SZ(1,0,1,shu_0);break;case 1:Display_SZ(1,0,1,shu_1);break;case 2:Display_SZ(1,0,1,shu_2);break;case 3:Display_SZ(1,0,1,shu_3);break;case 4:Display_SZ(1,0,1,shu_4);break;case 5:Display_SZ(1,0,1,shu_5);break;case 6:Display_SZ(1,0,1,shu_6);break;case 7:Display_SZ(1,0,1,shu_7);break;case 8:Display_SZ(1,0,1,shu_8);break;case 9:Display_SZ(1,0,1,shu_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,shu_0);break;case 1:Display_SZ(1,0,0,shu_1);break;case 2:Display_SZ(1,0,0,shu_2);break;case 3:Display_SZ(1,0,0,shu_3);break;case 4:Display_SZ(1,0,0,shu_4);break;case 5:Display_SZ(1,0,0,shu_5);break;case 6:Display_SZ(1,0,0,shu_6);break;case 7:Display_SZ(1,0,0,shu_7);break;case 8:Display_SZ(1,0,0,shu_8);break;case 9:Display_SZ(1,0,0,shu_9);break;}if(k2==0){delay(180);yue++;j0=yue/10;time_data[2]=yue%10;time_data[2]=time_data[2]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[2],time_data[2]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}}if(k3==0){delay(180);yue--;j0=yue/10;time_data[2]=yue%10;time_data[2]=time_data[2]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[2],time_data[2]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}}if(k1==0){t2=0;delay(200);j1=3;}}if(j1==3)break;}}void main(){delay(200);TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;InitLCD(); //初始12864ClearScreen(0); //清屏Set_line(0);//set_rtc(); //设定起始时间Display_SZ(1,2,2,maohao);Display_SZ(1,2,5,maohao);Display_SZ(1,0,2,xie);Display_SZ(1,0,5,xie);Display_HZ(2,0,1,xing);Display_HZ(2,0,2,qi);while(1){read_rtc();time_pros();if(k1==0)TR0=1;switch(disp[0]) //秒{case 0:Display_SZ(1,2,7,shu_0);break;case 1:Display_SZ(1,2,7,shu_1);break;case 2:Display_SZ(1,2,7,shu_2);break;case 3:Display_SZ(1,2,7,shu_3);break;case 4:Display_SZ(1,2,7,shu_4);break;case 5:Display_SZ(1,2,7,shu_5);break;case 6:Display_SZ(1,2,7,shu_6);break;case 7:Display_SZ(1,2,7,shu_7);break;case 8:Display_SZ(1,2,7,shu_8);break;case 9:Display_SZ(1,2,7,shu_9);break;}switch(disp[1]) //秒{case 0:Display_SZ(1,2,6,shu_0);break;case 1:Display_SZ(1,2,6,shu_1);break;case 3:Display_SZ(1,2,6,shu_3);break;case 4:Display_SZ(1,2,6,shu_4);break;case 5:Display_SZ(1,2,6,shu_5);break;case 6:Display_SZ(1,2,6,shu_6);break;case 7:Display_SZ(1,2,6,shu_7);break;case 8:Display_SZ(1,2,6,shu_8);break;case 9:Display_SZ(1,2,6,shu_9);break;}switch(disp[2]) //分{case 0:Display_SZ(1,2,4,shu_0);break;case 1:Display_SZ(1,2,4,shu_1);break;case 2:Display_SZ(1,2,4,shu_2);break;case 3:Display_SZ(1,2,4,shu_3);break;case 4:Display_SZ(1,2,4,shu_4);break;case 5:Display_SZ(1,2,4,shu_5);break;case 6:Display_SZ(1,2,4,shu_6);break;case 7:Display_SZ(1,2,4,shu_7);break;case 8:Display_SZ(1,2,4,shu_8);break;case 9:Display_SZ(1,2,4,shu_9);break;}switch(disp[3]) //分{case 0:Display_SZ(1,2,3,shu_0);break;case 1:Display_SZ(1,2,3,shu_1);break;case 2:Display_SZ(1,2,3,shu_2);break;case 3:Display_SZ(1,2,3,shu_3);break;case 4:Display_SZ(1,2,3,shu_4);break;case 5:Display_SZ(1,2,3,shu_5);break;case 6:Display_SZ(1,2,3,shu_6);break;case 7:Display_SZ(1,2,3,shu_7);break;case 8:Display_SZ(1,2,3,shu_8);break;case 9:Display_SZ(1,2,3,shu_9);break;}switch(disp[4]) //时{case 0:Display_SZ(1,2,1,shu_0);break;case 1:Display_SZ(1,2,1,shu_1);break;case 2:Display_SZ(1,2,1,shu_2);break;case 3:Display_SZ(1,2,1,shu_3);break;case 4:Display_SZ(1,2,1,shu_4);break;case 5:Display_SZ(1,2,1,shu_5);break;case 6:Display_SZ(1,2,1,shu_6);break;case 8:Display_SZ(1,2,1,shu_8);break;case 9:Display_SZ(1,2,1,shu_9);break;}switch(disp[5]) //时{case 0:Display_SZ(1,2,0,shu_0);break;case 1:Display_SZ(1,2,0,shu_1);break;case 2:Display_SZ(1,2,0,shu_2);break;case 3:Display_SZ(1,2,0,shu_3);break;case 4:Display_SZ(1,2,0,shu_4);break;case 5:Display_SZ(1,2,0,shu_5);break;case 6:Display_SZ(1,2,0,shu_6);break;case 7:Display_SZ(1,2,0,shu_7);break;case 8:Display_SZ(1,2,0,shu_8);break;case 9:Display_SZ(1,2,0,shu_9);break;}switch(disp[12]) //年{case 0:Display_SZ(1,0,1,shu_0);break;case 1:Display_SZ(1,0,1,shu_1);break;case 2:Display_SZ(1,0,1,shu_2);break;case 3:Display_SZ(1,0,1,shu_3);break;case 4:Display_SZ(1,0,1,shu_4);break;case 5:Display_SZ(1,0,1,shu_5);break;case 6:Display_SZ(1,0,1,shu_6);break;case 7:Display_SZ(1,0,1,shu_7);break;case 8:Display_SZ(1,0,1,shu_8);break;case 9:Display_SZ(1,0,1,shu_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,shu_0);break;case 1:Display_SZ(1,0,0,shu_1);break;case 2:Display_SZ(1,0,0,shu_2);break;case 3:Display_SZ(1,0,0,shu_3);break;case 4:Display_SZ(1,0,0,shu_4);break;case 5:Display_SZ(1,0,0,shu_5);break;case 6:Display_SZ(1,0,0,shu_6);break;case 7:Display_SZ(1,0,0,shu_7);break;case 8:Display_SZ(1,0,0,shu_8);break;case 9:Display_SZ(1,0,0,shu_9);break;}switch(disp[8]) //月{case 0:Display_SZ(1,0,4,shu_0);break;case 1:Display_SZ(1,0,4,shu_1);break;case 2:Display_SZ(1,0,4,shu_2);break;case 3:Display_SZ(1,0,4,shu_3);break;case 4:Display_SZ(1,0,4,shu_4);break;case 5:Display_SZ(1,0,4,shu_5);break;case 6:Display_SZ(1,0,4,shu_6);break;case 7:Display_SZ(1,0,4,shu_7);break;case 8:Display_SZ(1,0,4,shu_8);break;case 9:Display_SZ(1,0,4,shu_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,shu_0);break;case 1:Display_SZ(1,0,3,shu_1);break;case 2:Display_SZ(1,0,3,shu_2);break;case 3:Display_SZ(1,0,3,shu_3);break;case 4:Display_SZ(1,0,3,shu_4);break;case 5:Display_SZ(1,0,3,shu_5);break;case 6:Display_SZ(1,0,3,shu_6);break;case 7:Display_SZ(1,0,3,shu_7);break;case 8:Display_SZ(1,0,3,shu_8);break;case 9:Display_SZ(1,0,3,shu_9);break;}switch(disp[6]) //天{case 0:Display_SZ(1,0,7,shu_0);break;case 1:Display_SZ(1,0,7,shu_1);break;case 2:Display_SZ(1,0,7,shu_2);break;case 3:Display_SZ(1,0,7,shu_3);break;case 4:Display_SZ(1,0,7,shu_4);break;case 5:Display_SZ(1,0,7,shu_5);break;case 6:Display_SZ(1,0,7,shu_6);break;case 7:Display_SZ(1,0,7,shu_7);break;case 8:Display_SZ(1,0,7,shu_8);break;case 9:Display_SZ(1,0,7,shu_9);break;}switch(disp[7]) //天{case 0:Display_SZ(1,0,6,shu_0);break;case 1:Display_SZ(1,0,6,shu_1);break;case 2:Display_SZ(1,0,6,shu_2);break;case 3:Display_SZ(1,0,6,shu_3);break;case 4:Display_SZ(1,0,6,shu_4);break;case 5:Display_SZ(1,0,6,shu_5);break;case 6:Display_SZ(1,0,6,shu_6);break;case 7:Display_SZ(1,0,6,shu_7);break;case 8:Display_SZ(1,0,6,shu_8);break;case 9:Display_SZ(1,0,6,shu_9);break;}switch(disp[10]){case 1:Display_HZ(2,0,3,yi);break;case 2:Display_HZ(2,0,3,er);break;case 3:Display_HZ(2,0,3,san);break;case 4:Display_HZ(2,0,3,si);break;case 5:Display_HZ(2,0,3,wu);break;case 6:Display_HZ(2,0,3,liu);break;case 7:Display_HZ(2,0,3,ri);break;}}}字库code char shu_0[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}; code char shu_1[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}; code char shu_2[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}; code char shu_3[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}; code char shu_4[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}; code char shu_5[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}; code char shu_7[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}; code char shu_8[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}; code char shu_9[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}; code char lin[]={/*-- 文字: 林--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x90,0xFF,0x90,0x10,0x00,0x10,0x10,0xD0,0xFF,0x90,0x10,0x10,0x10,0x00,0x08,0x06,0x01,0xFF,0x00,0x13,0x08,0x04,0x03,0x00,0xFF,0x01,0x06,0x18,0x08,0x00}; code char peng[]={/*-- 文字: 鹏--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x12,0xFE,0x00,0xFE,0x12,0xFE,0x00,0xFC,0x0E,0x35,0x44,0x7C,0x00,0x00,0x20,0x1F,0x21,0x7F,0x20,0x1F,0x41,0x7F,0x08,0x09,0x09,0x29,0x49,0x21,0x1F,0x00}; code char xing[]={/*-- 文字: 星--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00, 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00}; code char qi[]={/*-- 文字: 期--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00}; code char yi[]={/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; code char er[]={/*-- 文字: 二--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00}; code char san[]={/*-- 文字: 三--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}; code char si[]={/*-- 文字: 四--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00};/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00}; code char liu[]={/*-- 文字: 六--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00}; code char ri[]={/*-- 文字: 日--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}; code char maohao[]={/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}; code char xie[]={/*-- 文字: / --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00}; code char duo[]={/*-- 文字: 多--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00}; code char yun[]={/*-- 文字: 云--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x40,0x44,0x44,0x44,0x44,0xC4,0xC4,0x44,0x44,0x46,0x46,0x64,0x60,0x40,0x00,0x00,0x20,0x70,0x38,0x2C,0x27,0x23,0x31,0x10,0x12,0x14,0x18,0x70,0x20,0x00,0x00}; code char qing[]={/*-- 文字: 晴--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x44,0x44,0xFC,0x20,0x22,0xAA,0xAA,0xBF,0xAA,0xAA,0xAA,0x22,0x20,0x00, 0x00,0x0F,0x04,0x04,0x0F,0x00,0x00,0xFF,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x00}; code char tiao_0[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xF0,0xEF,0xDF,0xDF,0xEF,0xF0,0xFF}; code char tiao_1[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xEF,0xEF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0xC0,0xDF,0xDF,0xFF,0xFF}; code char tiao_2[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x8F,0xF7,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xCF,0xD7,0xDB,0xDD,0xDE,0xCF,0xFF}; code char tiao_3[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xCF,0xF7,0x77,0x77,0xB7,0xCF,0xFF,0xFF,0xE7,0xDF,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_4[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0x3F,0xDF,0xEF,0x07,0xFF,0xFF,0xFF,0xF8,0xFB,0xDB,0xDB,0xC0,0xDB,0xFF}; code char tiao_5[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x07,0xF7,0x77,0x77,0xF7,0xF7,0xFF,0xFF,0xE6,0xDE,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_6[]={/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0x77,0x77,0xE7,0xFF,0xFF,0xFF,0xF0,0xEE,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_7[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xC7,0xF7,0xF7,0x37,0xC7,0xF7,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF}; code char tiao_8[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x8F,0x77,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xE3,0xDD,0xDE,0xDE,0xDD,0xE3,0xFF}; code char tiao_9[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xFF,0xCE,0xDD,0xDD,0xEE,0xF0,0xFF};。

LCD12864显示实时时钟例程可运行

LCD12864显示实时时钟例程可运行

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

下面是一段12864液晶显示实时时钟的程序:/****************************************************************************** *********时间:2012.11.30晶振:11.0592MHz芯片:STC89C52RC功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息******************************************************************************* ********/#include<reg52.h>#define uchar unsigned charsbit CLK=P1^4; //DS1302引脚定义sbit IO=P1^5;sbit CE=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^4; //12864引脚定义数据口为P0sbit RW=P2^5;sbit EN=P2^6;sbit PSB=P2^1;sbit RET=P2^3;void Input_1byte(uchar TD) //DS1302输入一字节数据{uchar i;ACC=TD;for(i=8;i>0;i--){IO=ACC0;CLK=1;CLK=0;ACC=ACC>>1;}}uchar Output_1byte(void) //DS1302输出一字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}void Write_DS1302(uchar add,uchar dat)//向DS1302写{CE=0;CLK=0;CE=1;Input_1byte(add);Input_1byte(dat);CE=0;}uchar Read_DS1302(uchar add) //从DS1302读{uchar inf; //信息临时存储变量CE=0;CLK=0;CE=1;Input_1byte(add);inf=Output_1byte();CE=0;return(inf);}/**********************DS1302初始化*****************************/void init_1302(){if(Read_DS1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化 {return;}else{Write_DS1302(0x8e,0x00); //关闭写保护Write_DS1302(0x90,0x00); //电池充电设置Write_DS1302(0x80,0x00); //秒Write_DS1302(0x82,0x54); //分Write_DS1302(0x84,0x20); //时Write_DS1302(0x86,0x30); //日Write_DS1302(0x88,0x11); //月Write_DS1302(0x8a,0x05); //星期Write_DS1302(0x8c,0x12); //年Write_DS1302(0xd0,0x55); //写RAMWrite_DS1302(0x8e,0x80); //打开写保护}}/**********************延时函数*****************************/ void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/**********************12864判忙*****************************/ void check_busy(){RS=0;RW=1;EN=1;while((P0&0x80)==0x80);EN=0;}/**********************12864写指令*****************************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;P0=com;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864写数据*****************************/void write_data(uchar dat){check_busy();RS=1;RW=0;EN=1;P0=dat;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864初始化函数*****************************/void init(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RET=0; //复位DelayMs(1); //延时RET=1; //复位置高DelayMs(200);write_com(0x30); //选择基本指令集DelayUs2x(250); //延时大于100uswrite_com(0x30); //选择8bit数据流DelayUs2x(200); //延时大于37uswrite_com(0x0c); //开显示(无游标、不反白)DelayUs2x(250); //延时大于100uswrite_com(0x01); //清除显示,并且设定地址指针为00HDelayMs(200); //延时大于10mswrite_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(250); //延时大于100us}/**********************清屏*****************************/void clrscreen(){write_com(0x01);DelayMs(15);}/*********************************************************主函数********************************************************/void main(){uchar sec,sec1,sec2;uchar min,min1,min2;uchar hour,hour1,hour2;uchar date,date1,date2;uchar mon,mon1,mon2;uchar day;uchar year,year1,year2;uchar table1[]="年月日时分秒星期温度摄氏"; //长度24uchar table2[]={0XD2,0XBB, 0XB6,0XFE, 0XC8,0XFD, 0XCB,0XC4, 0XCE,0XE5, 0XCE,0XF9, 0XC8,0XD5}; //长度14 uchar table3[]="0123456789"; //长度10init(); //液晶初始化clrscreen();DelayMs(200);init_1302(); //1302初始化只初始化一下就可以需要下载两次DelayMs(50);write_com(0x80); //显示20write_data('2');write_data('0');write_com(0x82); //显示年write_data(table1[0]);write_data(table1[1]);write_com(0x84); //显示月write_data(table1[2]);write_data(table1[3]);write_com(0x86); //显示日write_data(table1[4]);write_data(table1[5]);write_com(0x91); //显示时write_data(table1[6]);write_data(table1[7]);write_com(0x93); //显示分write_data(table1[8]);write_data(table1[9]);write_com(0x95); //显示秒write_data(table1[10]);write_data(table1[11]);write_com(0x88); //显示星期write_data(table1[12]);write_data(table1[13]);write_data(table1[14]);write_data(table1[15]);while(1){sec=Read_DS1302(0x81); ////读秒sec1=sec&0x0f; //个位sec2=sec>>4; //十位min=Read_DS1302(0x83); ////读分min1=min&0x0f; //个位min2=min>>4; //十位hour=Read_DS1302(0x85); ////读时hour1=hour&0x0f; //个位hour2=hour>>4; //十位date=Read_DS1302(0x87); ////读日date1=date&0x0f; //个位date2=date>>4; //十位mon=Read_DS1302(0x89); ////读月mon1=mon&0x0f; //个位mon2=mon>>4; //十位year=Read_DS1302(0x8d); ////读年year1=year&0x0f; //个位year2=year>>4; //十位day=Read_DS1302(0x8b); ////读星期write_com(0x94); //送显示内容write_data(table3[sec2]); //秒write_data(table3[sec1]);write_com(0x92);write_data(table3[min2]); //分write_data(table3[min1]);write_com(0x90);write_data(table3[hour2]); //时write_data(table3[hour1]);write_com(0x85);write_data(table3[date2]); //日write_data(table3[date1]);write_com(0x83);write_data(table3[mon2]); //月write_data(table3[mon1]);write_com(0x81);write_data(table3[year2]); //年write_data(table3[year1]);write_com(0x8a);write_data(table2[2*day-2]); //星期write_data(table2[2*day-1]);}}。

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

//12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#include &lt;reg52.h&gt;#include &lt;intrins.h&gt;#define uchar unsigned charvoid lcd_ini();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={23,45,12};uchar code clockname[10]={&quot;北京时间:&quot;};uchar data num[6];/*******主程序*************/void main(){lcd_ini();count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒TMOD=0x01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;IT0=1;EX0=1;TR0=1;while(1){back:ascii_change();disp();delay();if(flag==1)goto back;tkey();shan();delay();}}/****lcd初始化*******/void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}/********定时程序*************/ void timer1() interrupt 1 using 2 {TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;if(clock[2]==60){clock[2]=0;clock[1]++;//分//}if(clock[1]==60){clock[1]=0;clock[0]++;}if(clock[0]==24)//时//clock[0]=0;out:_nop_();}/*******十位个位转换成ASCII码************/ void ascii_change(void){num[5]=clock[2]-(clock[2]/10)*10+0x30;num[4]=clock[2]/10+0x30;num[3]=clock[1]-(clock[1]/10)*10+0x30;num[2]=clock[1]/10+0x30;num[1]=clock[0]-(clock[0]/10)*10+0x30;num[0]=clock[0]/10+0x30;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i&gt;0;i--)for (j=250;j&gt;0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i&lt;=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i&lt;=6;i++) {k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

基于MCS-51单片机的万年历设计

基于MCS-51单片机的万年历设计

基于MCS-51单片机的万年历设计摘要】:基于MCS-51单片机的万年历设计,利用时钟芯片DS1302,单片机的I/O口外接液晶12864,通过软件模拟的方法,从而使得液晶12864显示所需的字符。

【关键词】单片机时钟芯片DS1302 液晶128641、引言单片机是一种可通过编程控制的微处理器,单片机芯片自身不能单独运用于某项工程或者产品上,它必须要依靠外围数字器件或模拟器件的协调才可以发挥其自身的强大功能,本文介绍如何使用DS1302,实现显示万年历的效果。

2、硬件组成液晶12864显示系统实际是由51单片机最小系统、液晶12864、DS1302等构成,如下图1所示。

3、程序设计#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit clk=P3^5; //7sbit io=P3^7; //6sbit rst=P3^6; //5sbit cs=P2^0; //4脚sbit sid=P2^1; //5脚sbit sclk=P2^2; //6脚void read_time()//读1302全部时间{ uchar temp;temp=read_1302(0x81);//读秒.bcd编码curr.sec=(((temp>>4)&0x07)*10+(temp&0x0f));temp=read_1302(0x83);//读分.bcd编码curr.min=((temp>>4)&0x07)*10+(temp&0x0f);//秒钟显示temp=read_1302(0x85);//读时.bcd编码24小时curr.hr=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x87);//读日.bcd编码24小时curr.date=((temp>>4)&0x03)*10+ (temp&0x0f);temp=read_1302(0x89);//读月.bcd编码24小时curr.mon=((temp>>4)&0x01)*10+ (temp&0x0f);temp=read_1302(0x8b);//读周.bcd编码24小时curr.week= (temp&0x0f);temp=read_1302(0x8d);//读年.bcd编码24小时curr.year=((temp>>4))*10+ (temp&0x0f);}void show_time(){ uchar buf[9];LCD_drive(0,0x91); //年LCD_drive(1,(curr.year)/10+48);LCD_drive(1,(curr.year)%10+48);LCD_drive(0,0x93);//月LCD_drive(1,(curr.mon)/10+48);LCD_drive(1,(curr.mon)%10+48);LCD_drive(0,0x95); //日LCD_drive(1,(curr.date)/10+48);LCD_drive(1,(curr.date)%10+48);//LCD_drive(0,0x87); //小时,分中,秒钟buf[0]=(curr.hr)/10+48;buf[1]=(curr.hr)%10+48;buf[2]=':';buf[3]=(curr.min)/10+48;buf[4]=(curr.min)%10+48;buf[5]=':';buf[6]=(curr.sec)/10+48;buf[7]=(curr.sec)%10+48;buf[8]=0;show_string(0x88,buf); //???LCD_drive(0,0x9a);LCD_drive(1,(curr.week)+48); //星期}void show_static()//静态部分显示{ show_string(0x80,"实时时钟");show_string(0x90,"20 年月日");show_string(0x98,"星期");}void main(){ uchar temp;uchar sec;//真正的秒钟LCD_init();show_string(0x80,"DS1302时钟");spi_portinit();//端口初始化write_1302(0x8e,0);//取消DS1302的写保护write_1302(0x80,0x12);//秒钟初值show_static();while(1){ read_time();show_time();}}4、结束当上述程序编写好之后,我们需要使用编译软件对其编译,得到单片机能识别的二进制代码,然后再用编程器将二进制代码烧写到单片机中,就能看到液晶12864的显示万年历。

12864液晶屏学习使用手册

12864液晶屏学习使用手册

12864液晶屏学习手册1.液晶模组概览12864A-1汉字图形点阵液晶显示模块,可显示汉字和图形,内置8192个汉字(16X16点矩阵,16 * 8 = 128,16 * 4 = 64,一行,4行只能写8个汉字;),128个字符(8X16点矩阵)和64X256点矩阵显示RAM(GDRAM)。

主要技术参数和显示特性:电源:VDD 3.3V〜+5伏(内置升压电路,无负压);显示内容:128列X第64行(128分)显示颜色:黄绿色显示角度:直接看6:00LCD类型:STN与MCU的接口:8位或4位并行/ 3位串行配置LED背光多种软件功能:光标显示,屏幕移位,自定义字符,睡眠模式等2.尺寸1.尺寸2。

主要尺寸项目标准尺寸单元模子片身体产品113.0X65.0X12.8毫米2.模块引脚说明逻辑工作电压(VDD):4.5〜5.5V电源地(GND):0V穿孔温度(Ta):0〜60°C(常温)/ -20〜75°C(宽温度)三,接口定时模块有两种连接方式:并行和串行(时间如下):8位并行连接时序图MPU将数据写入模块MPU从模块读取数据2,串行连接时序图串行数据传输以三个字节完成:第一个字节:串口控制—格式11111ABCA是数据传输方向控制:H表示从LCD到MCU的数据,L表示从MCU到LCD的数据B是数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三个字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T =25℃VDD = 4.5V)备注:1,在模块接受指令之前,微处理器必须首先确认模块不忙,即读取高炉签到时间高炉需要0接受新说明之前;如果你不这样做’t在发送命令之前检查高炉商标,(通常在输入每日命令之前添加延迟)那么上一条指令和该指令之间必须有很长的延迟,也就是等待上一条命令的执行完成,有关命令的执行时间,请参阅命令表中的各个命令描述。

太阳能电子时钟论文

太阳能电子时钟论文

毕业设计(论文)设计(论文)题目:太阳能电子时钟指导教师:夏东盛学生专业:计算机控制班级:计控0901班学生姓名:田小凯齐珊屠海丽王文轩教研室主任:信息工程学院二〇年月日摘要随着社会、科技的发展,人类得知时间,从观太阳、钟摆到现在电子钟,不断研究、创新。

为了观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子时钟诞生了,它集温度、星期、日期和温度等功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

尽管现在电子时钟的技术已经相对成熟,但市场上电子时钟还是应用传统电池供电,传统电池污染大、难以处理,而太阳能供电有其天然优势,作为一种新能源。

在开发利用时,不会产生废渣、废水、废气,也没有噪音,更不会影响生态平衡。

绝对不会造成环境污染。

本课题通过一个基于单片机的功能实现时钟功能,并用太阳能供电的电子时钟的设计,从而达到学习单片机相关指令的应用,并熟悉太阳能供电的原理的目的。

系统由主控制器AT89C51、时钟电路、液晶显示电路、按键电路、复位电路、太阳能供电系统及备用电池供电系统等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

设计新颖时尚,人性化的外观,使太阳能电子时钟更加实用美观。

关键词:电子时钟,单片机,太阳能供电,时钟芯片ABSTRACTAlong with the society, the development of science and technology, humans know that time, from the point of view of the sun, the pendulumto the present electronic clock, continue to research, innovation. In order to observe at the same time, to be able to understand other people closely related information, such as temperature, week, date, electronic clock was born, it sets the temperature, date, week and temperature and other functions in a body, is convenient, intuitive display, multiple functions, simple circuit and many other advantages, with electronic instrumentation the trend of development, has a broad market prospect.Although electronic clock technology is relatively mature, but the market of electronic clock or the application of traditional battery power supply, the traditional battery pollution big, difficult to handle, and solar power have its natural advantage, as a kind of new energy. In the development and utilization of waste residue, waste water, does not produce, exhaust, no noise, but will not affect the ecological balance. Absolutely will not cause environmental pollution.This topic through a microcontroller based on the function of the realization of the clock function, and use the solar energy power supply electronic clock design, to achieve the study related instructions application, and familiar with the solar energy power supply principle purpose. The system consists of main controller AT89C51, clock circuit, Liquid crystal display circuit, key circuit, reset circuit, solar power supply system and battery backup power supply system components, to achieve the clock calendar display function, can carry out the time, seconds display. Design of novel fashion, the humanity appearance, make the solar electronic clock is more practical and beautiful.KEY WORDS:electronic clock, single-chip microcomputer, solar power, clock chip第一章:系统整体概况1.1课题研究背景及意义随着人们生活水平的日益改善,对生活品质的要求也越来越高,因而更注重家庭生活环境及办公场所的装饰与实用,而人们日常往来的礼品需求也更加注重品味、时尚与实用化。

毕业设计—基于单片机的12864时钟显示

毕业设计—基于单片机的12864时钟显示

学士学位毕业论文(设计)题目:基于单片机的12864时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。

它可以对年、月、日、星期、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒等信息,还有时间校准等功能。

该电子时钟主要采用STC89C52单片机作为主控核心,用DS1302时钟芯片作为时钟、液晶12864显示屏显示。

STC89C52单片机是由深圳宏晶科技公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的12864液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。

此外,该电子时钟还具有时间校准等功能。

关键词:STC89C51单片机,DS1302时钟芯片,液晶12864AbstractElectronic clock is a very extensive daily timing tool, to the people has brought great convenience, more and more popular in the community. It can be the year, month, date, day, hour, minute, second for a time, using intuitive digital display, can display information such as year, month, day, hour, and time alignment functions. The electronic clock is used mainly as a master STC89C52 microcontroller core, with theDS1302 clock chip as a clock, LCD display12864. STC89C52 SCM is a Shenzhen Hong Crystal Technology has introduced, power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip is American DALLAS company launched with a fine current charging low-power real-time clock chip, it can year, month, date, day, hour, minute, second for a time, also has a leap year compensation and other functions, DS1302 and long life, small error; 12864 LCD digital display isused to display that can display year, month, date, day, hour, minute, second and so on. In addition, the electronic clock also has a time calibration function.Key Words:STC89C51 microcontroller, DS1302 clock chip, LCD 12864目录1绪论 (3)1.1时钟发展史 (3)1.2 目前的研究现状 (4)1.3研究目的及意义 (4)2 总体方案设计 (5)2.1 方案的选择 (5)2.1.1设计要求 (5)2.1.2方案的选择 (5)2.2总体方案组成框图 (6)3系统硬件设计 (6)3. 1主芯片模块 (6)3.1.1 中断系统 (8)3.1.2常用寄存器 (8)3.2晶振和复位电路 (10)3.2.1晶振电路 (10)3.2.2复位电路 (11)3.3 DS1302时钟芯片电路 (11)3.3.1 DS1302引脚图 (11)3.3.2 DS1302寄存器 (12)3.3.3 DS1302外围电路 (13)3.4 LCD12864显示模块 (13)3.4.1 LCD12864引脚功能 (13)3.4.2 LCD12864指令说明 (14)3.4.3 LCD12864电路接线 (15)3.5 红外遥控模块 (16)4 系统软件设计 (17)4.1 主程序设计 (17)4.2 LCD12864驱动程序 (19)4.3 DS1302驱动程序 (21)4.4 红外遥控程序 (24)5 调试结果 (25)5.1 正常显示日期时间画面 (26)5.2 进入调整时间日期画面 (26)5.3图片显示画面 (26)6总结 (27)致谢 (28)参考文献 (29)附录一 (31)附录二 (32)1绪论1.1时钟发展史很早以前,人类主要是利用天文现象和流动物质的连续运动来计时。

产品使用说明书

产品使用说明书

基于12864的智能钟产品使用说明书一.产品概述时钟是居家生活必备良品,而传统的机械钟和简单的数字钟已存我们的脑海中存在了很多久,本产品最大优势在于智能化,增加了睡眠模式,节日提醒功能等等,而且比传统的时钟更加节能环保。

本产品配备了完美的操作界面,使您用起来方便,省心!二.技术参数工作电压:交流220V/50Hz;工作电流:0.1~0.3A;显示器像素:128*64。

三.工作原理本产品的电路原理依次为:以单片机89C51为处理芯片,通过18B20采集空气温度传输到芯片进行量化显示在LCD12864上,时间由DS1302芯片处理完成并配有一个A T24C02存储芯片使其掉电不掉时,保证时间的准确性。

产品的睡眠模式由一个光敏电阻控制,控制LCD12864屏屏幕亮度。

并配有四个按键组成这一个智能钟。

四.使用方法功能一:时钟调整功能,可以很方便地调时钟的年份、月份、日期、星期、小时、分钟。

功能二:时钟调整功能,设置有一个闹钟总开关,下设6个子闹钟和三种模式智能提醒。

功能三:报时功能,调协有整点报时功能,可设置一天24小时中任意整点报时的时间段。

功能四:背光调整功能:本产品新增智能睡眠模式,晚上无光照射的情况下,智能钟会自动关屏背光,保证不打扰晚上休息。

背光也可手调(设有9个亮度等级)。

功能五:未来公历和农历节日、记念日双行显示加温度显示五.日常维修方法1.显示屏一直呈灰暗状态:检查是否启动了自动模式和光敏电阻上是否灰尘太多;2.显示屏亮不起来:检查电源接触是否良好;3.时间不会自动更新:更换后备电池。

六.注意事项:1.轻拿,轻放,切勿曝晒、淋雨;2.非电子专业人员,切勿打开机顶盒;3.维修过程中应断电进行;4.擦拭本产品时应用酒精,不可用自来水且在断电情况下进行。

数字时钟

数字时钟

实验报告实验名称: [数字时钟实验]姓名:学号:指导教师:实验时间: [2013年6月15日]信息与通信工程学院DS1302数字时钟实验1.实验任务DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

本实验运用DS1302实现对时间的计时,对日期的计数.利用数码管显示年、月、日、周、日、时、分、秒.能够复位,设置时间,日期.可以换键显示年月日和时分秒.学会运用FPGA实验箱用verilog语言进行一定的程序编程设计,满足一定的实验要求,掌握fpga的I/O口及并口的使用,能够处理一些简单的实验问题,学会简单的实验设计。

2.实验原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。

秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数,月都是12,所以不用特殊设置,日按平年计算,在润年的时候2月减一天即可。

年由于只显示后两位数字就可以,所以用两位显示可以满足。

计数满后各计数器清零,重新计数。

计数器的输出分别经译码器送数码管显示。

计时出现误差时,可以用校时电路校时、校分。

控制信号由1×5矩形键盘输入。

时基电路可以由石英晶体振荡电路构成,假设晶振频率1MHz,经过6次十分频就可以得到秒脉冲信号。

译码显示电路由八段译码器完成。

3.设计流程图形或HDL编辑Analysis & Synthesis(分析与综合)Filter(适配器)Assembler(编程文件汇编)编辑器Timing Analyzer(时序分析器)设计输入综合或编译适配器件下载仿真4.实验程序程序初始化module shuzishizhong(Clk0,SEG,DIG,rst,rst_n,sclk,data_io,button);input button;//用于选择在数码管上显示时间or日历的按键,按下为高电平input rst;//外部复位键input Clk0;//外部输入时钟50Mhzoutput [7:0] SEG,DIG;output rst_n;//ds1302的端口RTC nRSToutput sclk;//ds1302的输入时钟RTC CLKinout data_io;//ds1302的io端口RTC IOreg [12:0] CNT_R0;//用于将50Mhz时钟分频为10Khz的寄存器reg Clk_10KHz;//10Khz时钟reg [21:0] count;//用于按键消抖的计数器reg flag=0;//判断显示时间or日历的标识位,0显示时间,1显示日历reg [2:0] SCAN_R;reg [3:0] SEG_M [7:0];reg [7:0] SEG_DR;reg [7:0] SEG,DIG;wire [23:0] dat_o_TM;//来着ds1302_drive的存放时间的寄存器wire [31:0] dat_o_C;//来着ds1302_drive的存放日历的寄存器ds1302_drive(.clock(Clk0),.rst(rst),.rst_n(rst_n),.sclk(sclk),.data_io(data_io),.dat_o_T M(dat_o_TM),.dat_o_C(dat_o_C));驱动程序初始化module ds1302_drive(clock,rst,rst_n,sclk,data_io,dat_o_TM,dat_o_C);input rst;//外部复位按键重新设置数据input clock;//ds1302端口信号output rst_n,sclk;//ds1302的工作时钟inout data_io;//dat_o_TM信号接六个数码管,分别显示小时,分钟和秒//dat_o_C信号送到12864显示年,月,日和星期output[23:0] dat_o_TM;//读出的时间送出显示output[31:0]dat_o_C;//读出的日历送出显示reg rst_n;reg data;//data_io的缓存,reg clk_us;//状态机的时钟8us/periodreg clk_2us;//ds1302的工作时钟//data_io是双向口,开关link_write管理数据的出入//link_write为高时,允许输出,为低电平是高阻reg link_write;reg flag123;//重新设置日历标志位reg [4:0]step1;//WR_SET任务的状态reg [4:0]step2;//RD_T任务的状态reg [23:0] data_out_reg_time;//存放读出的时间reg [31:0] data_out_reg_calender;//存放读出的日历reg F;//读任务的标志reg FF;//写任务的标志reg [7:0]reg_CMD=0;//commandreg [7:0]reg_SEC=0;//秒reg [7:0]reg_MIN=8'h30;//分钟reg [7:0]reg_H=8'h09;//小时reg [7:0]reg_DAY=8'h03;//天reg [7:0]reg_MONTH=8'h06;//月reg [7:0]reg_X=8'h01;//星期reg [7:0]reg_YEAR=8'h13;//年reg [7:0]register1;//写操作的指令存器reg [7:0]register3;//读操作读进数据的寄存器reg [7:0]register4;//读操作的指令寄存器reg [3:0]state;//状态机//=============================================== //初始设置的状态参数//写状态parameterIDLE =4'b0000,WR_S =4'b0001,WR_Min =4'b0010,WR_H =4'b0011,WR_X =4'b0100,WR_D =4'b0101,WR_M =4'b0110,WR_Y =4'b0111;//=============================================== //=============================================== parameter //状态读RD_S =4'b1000,RD_Min =4'b1001,RD_H =4'b1010,RD_X =4'b1011,RD_D =4'b1100,RD_M =4'b1101,RD_Y =4'b1110,CLOSE_W =4'b1111;//=============================================== //WR_SET任务的参数parameterstep1_f0 =5'b00000,step1_f1 =5'b00001,step1_f2 =5'b00010,step1_f3 =5'b00011,step1_f4 =5'b00100,step1_f5 =5'b00101,step1_f6 =5'b00110,step1_f7 =5'b00111,step1_f8 =5'b01000,step1_f9 =5'b01001,step1_fa =5'b01010,step1_fb =5'b01011,step1_fc =5'b01100,step1_fd =5'b01101,step1_fe =5'b01110,step1_ff =5'b01111,step1_f10 =5'b10000;//=============================================== //RD_T任务的参数parameterstep2_f0 =5'b00000,step2_f1 =5'b00001,step2_f2 =5'b00010,step2_f3 =5'b00011,step2_f4 =5'b00100,step2_f5 =5'b00101,step2_f6 =5'b00110,step2_f7 =5'b00111,step2_f8 =5'b01000,step2_f9 =5'b01001,step2_fa =5'b01010,step2_fb =5'b01011,step2_fc =5'b01100,step2_fd =5'b01101,step2_fe =5'b01110,step2_ff =5'b01111,step2_f10=5'b10000;//++++++++++++++++++++++++++++++++++++++++++++++ //本模块的时钟20ns X 200 X 2=8us/period,reg[8:0]counter;5. 管脚分配6.实验结果如图所示实验版通过对左边3和4按键的使用可以实现年月日与时分秒的切换,图左上角的数码管用于显示时钟,对实验程序中如下部分的修改可以改变可以使数码管上的时钟改变用于设定时间。

基于51单片机的12864液晶显示的万年历

基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下

LCD显示的指针式电子钟

LCD显示的指针式电子钟

信息工程学院课程设计报告书题目: LCD显示的指针式电子钟专业:电子信息的科学与技术班级: 0311410学号: 031141012学生姓名:何标指导教师:高林2014年 5 月 15 日信息工程学院课程设计任务书2014年5月20 日信息工程学院课程设计成绩评定表目录1 任务提出与方案论证 (6)1.1设计要求 (6)1.2原理说明 (6)2 总体设计 (7)3 详细设计 (8)3.1 AT89C51单片机简介 (8)3.2时钟模块设计 (9)3.3 显示模块设计 (10)3.4 设置模块 (10)3.5 振荡电路 (10)3.6 复位设置 (11)4 总结 (12)参考文献 (13)附录仿真电路图 (14)摘要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

本设计就是应用单片机强大的控制功能制作而成的指针式电子钟,该指针式电子钟实现如下功能:液晶屏模拟表盘与时分秒指针显示当前时钟,K1键用于选择调节对象,K2键用于调整时分秒,在按下K4键时确定调节值,时钟继续运行。

本设计采用的是AT89C51单片机,AT89C51单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时。

芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。

显示器件采用PG12864LCD液晶,12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

玩转12864液晶--显示字符

玩转12864液晶--显示字符

在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。

相信接触过单片机的朋友都知道了,那就是12864液晶。

顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。

我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108T6963,ST7920等等。

在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。

(液晶屏采用金鹏的OCMJ4X8C)关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。

我们先来了解一下它的并行连接情况。

下面是电路连接图从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。

其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。

通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。

看看并行模式下的写时序图:根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。

读时序图如下:根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。

以及后面章节中讲的画点函数等都要用到读时序。

有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。

这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。

下面让我们根据这些编写出它的驱动程序吧。

我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C实际显示效果图片如下:程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。

带字库型液晶屏12864中文资料 ST7920 (HJ12864M)

带字库型液晶屏12864中文资料 ST7920 (HJ12864M)

概述HJ12864M-1是一款图形点阵液晶显示器,显示分辨率为128X64。

内置中文字库,总共提供8192个16X16点阵的汉字和128个16X8点阵的字符.它可以提供三种传输模式,分别是8位并行模式、4位并行模式和串行模式。

外形尺寸项目尺寸单位mm mm mm mm93X70X1372X400.52X0.520.48X0.48模块体积视域尺寸点距离点尺寸HJ12864M-1 1/9图形点阵液晶显示器说明书模块接口定义并行模式接口定义串行模式接口定义片选端,高电平有效串行数据输入端CLK 串行同步时钟CS SID H/L 电源负极电源正极对比度调节0V +5V _123VSS VDD V0引脚号电平功能说明名称H/L H/L 背光电源正极19A 背光电源负极20K+5V 0VPSB=H :并行模式 PSB=L :串行模式15PSB H/L 复位端,低电平有效17/RESETH/L 456HJ12864M-1功能说明系统界面配合RS和RW可选择控制界面的4种模式:RS RW功能说明L L MPU写指令到指令暂存器(IR)L H读出忙标志(BF)及地址计数器(AC)的状态H L MPU写数据到数据暂存器(DR)H H MPU从数据暂存器(DR)中读出数据忙标志(BF)BF标志提供内部工作情况,BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据;BF=0,表示模块为准备状态,可接受外部指令和数据。

利用STATUS RD 指令,可以将BF读到DB7总线 ,从而检验模块的工作状态。

地址计数器(AC)地址计数器(AC)用来存储DDRAM/CGRAM/GDRAM之一的地址,可由指令改变,之后读取或写入DDRAM/CGRAM/GDRAM的值时,地址计数器(AC)的值就会自动加1。

当RS=0,RW=1和RE=1时,地址计数器(AC)的值将被读到DB6-DB0中。

中文字型ROM(CGROM)和半宽字型ROM(HCGROM)字型产生ROM提供8192个中文字型和128个数字符号,利用两个字节将字型编码写入DDRAM,对应的内容将显示出来。

多功能语音报时数字钟的设计 (4)

多功能语音报时数字钟的设计 (4)

多功能语音报时数字钟的设计摘要:自进入21世纪以来,电子产业飞速发展,各种新兴的电子产品布满了电子专柜,电子产品几乎走进了家家户户,走进了社会的各个行业,有力的推动了社会生产力的发展和电子信息化、电子智能化的提高。

数字钟也在发生着各种各样的变化,由体积较大、功能少、运行不精确的机械钟变为在液晶显示屏上显示数字的数字钟,再到多种功能于一钟的语音报时数字钟等等。

本设计是实现一款可正常显示当前时间,测量当前温度,带有语音报时的多功能数字钟。

本设计是采用AT89C51单片机控制的多功能语音报时数钟,可以显示年、月、日、时、分、秒、星期、温度。

具有年、月、日、时、分校准功能,自动提取温度并显示功能,语音报时功能,调整时间按下相应键会发出嘟嘟提示声功能。

采用DS1302时钟芯片进行时钟控制,DS18B20传感器实现温度采集功能,LCD12864作为液晶显示模块,ISD1420语音芯片实现语音播报时间功能。

钟表的多功能化给我们生活带来了很大的改善,比如定时报警、备忘提醒、电气设备的自动断电、自动开启关闭等功能。

数字时钟对世界有着重要的影响,对工业、电子业、商业有着重要的推进作用,使用简单方便,成本低,显示直观,在广阔的市场具有非常很好的前景市场。

数字时钟之所以这么受广大的欢迎,它使用简单直观,数字时钟在显示方面能清楚的在LED显示屏上显示出年、月、日、周日、时、分、秒,还有调准时间的准确度的功能,并且能够显示当日的温度情况。

但目前市场上的数字时钟还比较机械性和传统性,在实际运用过程中不够灵活。

而随着社会的不断发展,人们对数字时钟的控制要求越来越高,数字时钟应用到很多方面,在报警和闹铃的方面都应用到数字时钟准确的计时功能,还有定时器,微波炉,自动通电器,数字时钟可以成为自己生活中的小助手,可以轻松掌控时间,又能了解天气及温度的变化。

语音报时多功能数字时钟改善了人们的生活质量,为人们的生活、工作带来极大的便利。

关键词:数字钟单片机温度液晶显示语音报时一、绪论时间对于我们每个人都很重要,包括老人和小孩,通过眼睛看时间,当然可以看到当前时间,但是对于视力不好老人和不认识钟表的小孩来说,语音报时数字钟就给他们带来了很大的帮助,只需要按下相应键就可以自动播报获得时间。

LCD12864液晶电子钟

LCD12864液晶电子钟

长沙学院《单片机原理及应用》课程设计说明书题目 LCD12864液晶显示电子钟设计系(部)专业(班级)姓名学号指导教师起止日期《单片机原理及应用》课程设计任务书系(部):专业:课题名称LCD12864液晶显示电子钟设计设计内容及要求1、课题内容:设计一种基于AT89S52 单片机的液晶显示电子时钟,要求如下:(1)、能正确显示时间、日期和星期显示格式为:时间:XX 小时:XX 分:XX 秒;日期:XX 年:XX 月:XX 日;星期:X。

(2)、时间能够由按键调整,误差小于1S。

(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3秒)。

(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响2 秒,每两声之间时间间隔1 秒)。

液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间。

2、要求:完成该系统的硬件和软件的设计,在Proteus 软件上仿真通过,并提交一篇课程设计说明书。

设计工作量1、汇编或C51 语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。

进度安排起止日期设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天——第六天程序设计第六天——第八天程序调试、仿真第九天——第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一、整体方案设计 (4)1、单片机的选择 (4)2、单片机结构 (4)二、前期准备 (5)三、程序设计 (8)1、键盘约定 (8)2、界面显示 (9)3、全局变量的定义 (9)4、系统时钟 (9)5、闹钟控制时间的设定 (9)四、总结与体会 (10)参考文献 (11)一、整体方案设计1、单片机的选择单片微型计算机主要由微处理器、存储器、I/O接口电路等组成。

基于12864的模拟电子钟-单片机课程设计

基于12864的模拟电子钟-单片机课程设计

《单片机技术》课程设计说明书基于12864的模拟电子钟摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,单片机都起到了举足轻重的作用。

所以单片机技术也日趋成熟。

单片机是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强。

而52系列单片机是各单片机中最为典型和最有代表性的一种。

此次单片机课程设计是通过利用52单片机来完成对电子钟的设计,且由12864液晶显示屏来显示时钟信息,并带有DS18B20输出的实时温度显示。

此次课程设计达到了学习、了解单片机相关指令在各方面的应用,以及初步了解开发软、硬件的知识。

关键词 :单片机;12864液晶屏;DS18B20;实时温度ABSTRACTMCUapplication technologyrapid development throughout all areas of life we are now, themissile fromthe navigation deviceto controlavarietyof instruments on theplane, network communicationsand data transfer from thecomputer to thereal-time control and dataprocessingindustrial automation process,andwe live in avariety of widely used smart IC cards, electronicpets, MCU have played a pivotal role.So microcontroller technology matures. MCU is a setof CPU, RAM,ROM, timing, counting, and multiple interfacesin one microcontroller. Its small size,lowcost, high functionality. The 52 Series single-chip microcontrolleris all themost typical and most representative one.Thecourse is designed bythe useof single-chipmicrocontroller52 to complete the electronic clock design, andthe12864 LCD screento display the clockinformationand real-timetemperature displaywith DS18B20 output.The curriculum designed tomeet thelearning and understanding of MCU-related instruction inallaspects of the application, as wellas a preliminary understandingof the development ofsoftware and hardwareknowledge.Key words MCU;12864 LCD screen; DS18B20; real-time temperature目录第一章绪论........................................ 错误!未定义书签。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档