单片机 12864 LCD显示--按键电子时钟程序

合集下载

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时钟显示程序

12864时钟显示程序/*用LCD12864液晶显示器进行设置时钟,有独立键盘调节时间程序*/个人觉得在学习编写LCD12864显示程序时可以多结合1602一起来学习,很多东西是相通的,我这个程序就是,还有对于初学者来说,最好是理解程序每个模块的作用,掌握后对于以后的编程学习进度会更快,再补充说明一句,对于显示模块程序,着重需要对地址些函数部分理解,废话不多说,看程序吧:#include#define uchar unsigned char#define uint unsigned intsbit RS= P2^6;//数据/命令选择端(H/L)sbit RW= P2^5;//读写/选择端(H/L)sbit EP= P2^7;//使能信号sbit K1=P3^0; //开关定义sbit K2=P3^1;sbit K3=P3^2;uchar num,t;uchar K1num;char s,f,m; //可取负数uchar code table[]= " 2013-8-12 MON ";//日期显示uchar code table1[]=" 00: 00: 00 AM "; //时间显示uchar code table2[]="长沙今日多云"; //天气显示uchar code table3[]=" 南风39-30℃"; //气温显示void init1(); //中断子函数void delay(uint k) //延时函数{uint i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);}void write(uchar com) //命令指令函数{ //根据时序图来设置RS=0; //选择指令寄存器RW=0; //选择写P0=com; //将8位数据通过P0口传给12864delay(5); //延时一会,让12864准备接收数据EP=1; //使能线电平变化,数据送入1602的八位数据口delay(5);EP=0;}void read(uchar date) //写入指令函数{ //根据时序图来设置RS=1; //选择寄存器RW=0; //选择写P0=date; //将8位数据通过P0口传给12864delay(5);EP=1;delay(5);EP=0;}void init() //初始化函数{RS=0;EP=0;RW=0;write(0x38); //显示设置模式write(0x0c); //显示开关控制write(0x06); //光标设置write(0x01); //清屏设置write(0x80); //数据地址初始位for(num=0;num<16;num++) //查table表数据{read(table[num]); //读取表中内容delay(20);}write(0x90);//重新设置数据指针for(num=0;num<16;num++) //查table2表数据{read(table2[num]); //读取表中内容delay(20);}write(0x98);//重新设置数据指针for(num=0;num<16;num++) //查table3表数据{read(table3[num]); //读取表中内容delay(20);}write(0x88);//重新设置数据指针for(num=0;num<16;num++){read(table1[num]); //读取table1表中内容delay(20);}}void write_sfm(uchar add,uchar date) // 时分秒函数设置{ uchar shi ,ge;shi=date/10; // 取商ge=date%10; //取余write(0x83+add); //设置add位地置read(0x30+shi); //设置十位地置read(0x30+ge); //设置个位地址}void key() //独立开关控制{if(K1==0){delay(5);if(K1==0){K1num++;while(!K1); //判断按键是否按下if(K1num==1) //按一下调节秒{TR0=0; //关定时器write(0x83+10); //找到秒位置write(0x0f); //光标闪烁}}if(K1num==2){write(0x83+8);//再按一下调节分地址}if(K1num==3) //第三次按下调节时{write(0x83+6);}if(K1num==4) //按四次回到正常计时{K1num=0;write(0x0c);//光标不闪TR0=1;}}if(K1num!=0) //有按下{if(K2==0) //K2开关控制时分秒加{delay(5);if(K2==0) //消抖{while(!K2);//松手if(K1num==1) //秒调节{m++;if(m==60)m=0;write_sfm(10,m);write(0x83+10);//秒钟地址}if(K1num==2) //分钟调节{f++;if(f==60)f=0;write_sfm(8,f);write(0x83+8); //分钟地址}if(K1num==3) //小时调节{s++;if(s==23)s=0;write_sfm(6,s);write(0x83+6);//时地址}}}if(K3==0){delay(5);if(K3==0){while(!K3);if(K1num==1) //K3控制时分秒减{m--;if(m==-1)m=59;write_sfm(10,m);write(0x83+10);}if(K1num==2)f--;if(f==-1)f=59;write_sfm(8,f);write(0x83+8);}if(K1num==3){s--;if(s==-1)m=23;write_sfm(6,s);write(0x83+6);}}}}}void main() //主函数{init(); //调用子函数init1(); //调用定时子函数while(1){key();}}void init1() //定时子函数{TMOD=0x01;EA=1; //开总中断ET0=1; //开定时器中断TR0=1;TH0=(65536-50000)/256; //设置时间50ms TL0=(65536-50000)%256;}void e() interrupt 1 //定时器T0方式1中断{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;if(t==18) //一秒钟定时{m++;if(m==60) //秒设置{m=0;f++;if(f==60) //分设置{f=0;s++;if(s==24) //小时设置{s=0;}write_sfm(6,s); //时位数据读取}write_sfm(8,f); //分位数据读取}write_sfm(10,m); //秒位数据读取}}。

基于DS1302写的12864LCD时钟程序(word文档良心出品)

基于DS1302写的12864LCD时钟程序(word文档良心出品)

以下是我写的12864LCD并行口时钟显示程序,时钟用按键可调/***************12864.h头文件******************************/#ifndef _12864_h#define _12864_h/*****包含头文件**************/#include<reg51.h>#include"string.h"#include"DS1302.h"/********定义I/0口**********/#define LCD12864_DATA P0sbit LCD12864_E = P2^7;sbit LCD12864_RW = P2^5;sbit LCD12864_RS = P2^6;sbit LCD12864_RET= P2^0;sbit LCD12864_PSB =P2^2;/******声明全局函数*********/void Delay1ms(unsigned int); //声明延时函数void BusyChk_12864(void); //声明忙检测函数void WrCom(unsigned char); //声明写入命令函数//unsigned char ReDat(void); //声明读数据函数void WrDat(unsigned char); //声明写数据函数void LcdInit(void); //12864初始化函数void SetAddress(unsigned char ,unsigned char); //设置地址转换void DisplayString(unsigned char ,unsigned char,unsigned char *p);//行显示字符void DisplayTime();void DisplayDay();void DisplayWeek();#endif/*****************************12864.c***********************************/#include"12864.h"/****************************************************************************** ** 函数名: Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出 e : 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。

12864LCD电子钟说明文档

12864LCD电子钟说明文档

void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据
while(*str != '\0'){ lcm_w_test(1,*str++);
} *str = 0; } /******************************************************************************/
2. 仿制说明
Doyoung 电子技术 将无条件共享原理图、说明文档、HEX 文件供有兴趣的朋友仿制使用。如您 成功仿制本设计,至信 @,即可获得本制作品的源代码,用于学习或升级 升级开发。如果您成功升级了一次程序将可以获得 Doyoung现在制作品的所有源代码包(不包括 日后制作品)。目的只有一个,力图创造独立资料。
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整日期 [-]
按键 3:下一项 按键 4:减 1
按键 1:退出 按键 2:加 1
[Esc] 2007 [Next] 2 月 14 日 星期五
[Esc] 2007 [Next] 2 月 14 日 星期五
23:34.10 23.5℃ [+] 调整分钟 [-]
Байду номын сангаас
按键 3:下一项 按键 4:减 1

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汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

//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]);//时间之间的冒号。

基于51单片机的12864液晶时钟完整程序(已通过)

基于51单片机的12864液晶时钟完整程序(已通过)
void init_ds1302() //
{
uchar flag ;
flag=uc_R1302(0x81); // 在秒寄存器读数 ,ch=
if (flag&0x80) //
{
v_W1302(0x8e,0x00); //
v_W1302(0x80,0x45); //0秒
v_W1302(0x82,0x29); //35分钟
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************/
void days()
{
if ( yue== 0x01 && ri== 0x01 ){ lcd_write_string(4,3,"元旦节"); }
if ( yue== 0x02 && ri== 0x14 ){ lcd_write_string(4,3,"情人节"); }
if ( yue== 0x03 && ri== 0x08 ){ lcd_write_string(4,3,"妇女节"); }
}
void WRI(char instru) //液晶写指令
{
lcd_check_busy();
RS = 0 ; //显示指令
RW = 0 ; //写

12864时钟显示程序

12864时钟显示程序

/************12864时钟显示函数*************//******实现时间走动、按键控制、蜂鸣器闹铃******/#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P0^7;sbit rw=P0^6;sbit en=P0^5;sbit beet=P0^4; //蜂鸣器定义sbit key1=P3^5; //功能选择sbit key2=P3^4; //至加sbit key3=P3^3; //至减char hour=23;char minute=59;char second=46;int years=2012;char month=12;char day=30;uchar count=0;char mm;char cc;uchar code table1[]={"创新工作室"};uchar code table2[]={" 应用电子"};/*************************延时函数****************************/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********地址初始化*************/void xieling_shu(uchar aa,uchar bb){if(aa==1){rs=0;}if(aa==0){rs=1;}rw=0;P2=bb;delay(1);en=1;delay(1);en=0;delay(1);}/***********************液晶12864写入地址*********************/ void xieludizhi(uchar x, uchar y){switch(x){case 1:xieling_shu(1,0x80 + y ); return;//return 返回的意思case 2:xieling_shu(1,0x90 + y ); return;case 3:xieling_shu(1,0x88 + y ); return;case 4:xieling_shu(1,0x98 + y ); return;}}/**********************液晶12864写入字符串********************/ void xiezifuchuan(uchar *dd){while(*dd != '\0'){xieling_shu(0,*dd++ );}}/********************** 液晶12864清屏函数*********************/ void qingping(){xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏delay(20);}/********************液晶12864初始化显示函数******************/ void init_12864(){ mm=0;cc=7; //选择星期初始化xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x0C); //0x0c: 无光标,OXOF: 光标反白显示xieling_shu(1,0x01); //清屏xieling_shu(1,0x06);}/******************* 液晶12864初始化字串显示******************/ void init_zifu(){//qingping();xieludizhi(1,0);xiezifuchuan(table1); //delay(1);xieludizhi(4,0);xiezifuchuan(table2); //delay(1);xieludizhi(3,0);xieling_shu(0,0x30+hour/10);xieling_shu(0,0x30+hour%10);xieling_shu(0,':');xieling_shu(0,0x30+minute/10);xieling_shu(0,0x30+minute%10);xieling_shu(0,':');xieling_shu(0,0x30+second/10);xieling_shu(0,0x30+second%10);xieludizhi(3,5);xiezifuchuan("星期");xieludizhi(2,0);xieling_shu(0,0x30+years/1000);xieling_shu(0,0x30+years%1000/100);xieling_shu(0,0x30+years%100/10);xieling_shu(0,0x30+years%10);xiezifuchuan("年");xieling_shu(0,0x30+month/10);xieling_shu(0,0x30+month%10);xiezifuchuan("月");xieling_shu(0,0x30+day/10);xieling_shu(0,0x30+day%10);xiezifuchuan("日");}/***************星期函数***************/void xingqi(){switch(cc){case 1: xieludizhi(3,7); xiezifuchuan("一"); return;case 2: xieludizhi(3,7); xiezifuchuan("二"); return;case 3: xieludizhi(3,7); xiezifuchuan("叁"); return;case 4: xieludizhi(3,7); xiezifuchuan("四"); return;case 5: xieludizhi(3,7); xiezifuchuan("五"); return;case 6: xieludizhi(3,7); xiezifuchuan("六"); return;case 7: xieludizhi(3,7); xiezifuchuan("日"); return;}}/***************按键程序***************/void anjian(){if(key1==0) //key1按键选择功能{ mm++;delay(1);if(mm==1){xieludizhi(3,3);xieling_shu(0,0x5f);}if(mm==2){TR0=1;xieludizhi(3,2);xieling_shu(0,0x5f);}if(mm==3){xieludizhi(3,0);xieling_shu(0,0x5f);}if(mm==4){xieludizhi(2,5);xieling_shu(0,0x5f);}if(mm==5){xieludizhi(2,3);xieling_shu(0,0x5f);}if(mm==6){xieludizhi(2,1);xieling_shu(0,0x5f);}if(mm==7){xieludizhi(3,5);xieling_shu(0,0x5f);}if(mm==8){xieludizhi(2,7);xieling_shu(0,0x02);}if(mm==9){xieludizhi(2,7);xieling_shu(1,0x01);mm=0;}} //key2按键控制if(mm==1&&key2==0) //秒加1{TR0=0;delay(1);if(key2==0){second++;if(second==60){second=0;}}}if(mm==1&&key3==0) //秒减1{TR0=0;delay(1);if(key3==0){second--;if(second==-1){second=59;}}}if(mm==2&&key2==0) //分加1 { delay(1);if(key2==0){minute++;if(minute==60){minute=0;}}}if(mm==2&&key3==0) //分减1 { delay(1);if(key3==0){minute--;if(minute==-1){minute=59;}}}if(mm==3&&key2==0) //时加1 { delay(1);if(key2==0){hour++;if(hour==24){hour=0;}}}if(mm==3&&key3==0) //时减1 { delay(1);if(key3==0){hour--;if(hour==-1){hour=23;}}}if(mm==4&&key2==0) //日加1 { delay(1);if(key2==0){day++;if(day==31){day=1;}}}if(mm==4&&key3==0) //日减1 { delay(1);if(key3==0){day--;if(day==0){day=30;}}}if(mm==5&&key2==0) //月加1 { delay(1);if(key2==0){month++;if(month==13){month=1;}}}if(mm==5&&key3==0) //月减1 { delay(1);if(key3==0){month--;if(month==0){month=12;}}}if(mm==6&&key2==0) //年加1 { delay(1);if(key2==0){years++;}}if(mm==6&&key3==0) //年减1 { delay(1);if(key3==0){years--;}}if(mm==7&&key2==0) //星期加1 { delay(1);if(key2==0){cc++;if(cc==8){cc=1;}}}if(mm==7&&key3==0) //星期减1 { delay(1);if(key3==0){cc--;if(cc==0){cc=7;}}}}/***************************定时器函数************************/void init_t0_t1() //定时器t0,t1初始化函数{TMOD=0x11;EA=1;ET0=1;TR0=1; //开启中断TH0=(65536-50000)/256;TL0=(65536-50000)%256;}/**************主函数**************/void main(){init_12864();init_t0_t1();while(1){init_zifu();anjian();xingqi();}}/***************中断函数***************/void time() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(hour==0&minute==0&second==0||hour==0&minute==1&second==0||hour==0&minute==1&s econd==5)//采用与或逻辑设定闹铃{beet=0;delay(5);beet=1;}count++;if(count==20){count=0;second++;}if(second==60){second=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;years++;}}。

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

单片机 12864 LCD显示--按键电子时钟程序 //液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信接/口P1.5--P1.7,可根据你的电路修改相应的接口。

#include reg52.h #include intrins.h #define uchar unsigned char单片机 12864 LCD显示--按键电子时钟程序//液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信接/口P1.5--P1.7,可根据你的电路修改相应的接口。

#include <reg52.h>#include <intrins.h>#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]={"北京时间:"};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>0;i--)for (j=250;j>0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i<=8;i++)sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i<=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);}}/*******闪烁程序*************************/ void shan(void){uchar i,k=0;wri_add(0x90);if(f==1){num[0]=' ';num[1]=' ';}elsegoto next;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);}goto return1;next: if(f==2){num[2]=' ';num[3]=' ';}elsegoto next1;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);goto return1;next1: if(f==3){num[4]=' ';num[5]=' ';}elsegoto return1;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

wri_dat(num[i-1]);}return1:_nop_();}/*******外部中断***********/void intr0() interrupt 0 using 2{flag=~flag;//判断是否闪烁位//TR0=~TR0; //闪关定时否则开定时f=1;}/**********按键程序************/void tkey(void){uchar judcekey;judcekey=P1&0x0f;if(judcekey==0x0f)goto return2;/*******移位键*********/if (judcekey==0x0e)f++;if (f==4)f=1;/**********加一键*********/ if(judcekey==0x0d){clock[f-1]++;}if (f==1){ if (clock[f-1]==24){clock[f-1]=0;}}else{ if (clock[f-1]==60)clock[f-1]=0;}/******减一键***********/ if(judcekey==0x0b){clock[f-1]--;}if (f==1){ if (clock[f-1]==0xff){clock[f-1]=23;}}else{ if (clock[f-1]==0xff)clock[f-1]=59;}return2:_nop_();}。

相关文档
最新文档