推荐-学习笔记fpga设计电子时钟12864显示 精品

合集下载

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); //秒位数据读取}}。

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时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。

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

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

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

FPGA培训资料-12864

FPGA培训资料-12864

可显示汉字和图形的液晶12864的FPGA控制12864点阵型液晶显示器的显示原理12864液晶显示屏共有128×64点阵,即每行显示128点,每列显示64点。

此种型号的液晶显示屏以中间间隔平均划分为左屏和右屏分别显示,均为64×64点阵,而且各自都有独立的片选信号控制选择。

先显示左屏,左屏全部显示完后才能显示右屏。

显示屏上的显示数据由显示数据随机存储器DDRAM提供。

DDRAM每字节中的每1个bit,对应显示屏上的1个点。

bit值为1,对应点显示,反之不显示。

DDRAM与显示屏的对应位置如图1所示。

每半屏显示数据共有512字节的DDRAM,分为8个数据页来管理,这些页对应显示屏从上到下编号为0-7页,每页64字节,涵盖半边显示屏的64行×64列×8bit点阵数据。

向显示屏写数据实际上是向DDRAM中写数据,DDRAM不同页和不同列中的字节数据唯一对应显示屏一行的8个显示点。

例如,向DDRAM第0页的第0列写入数据00010100B,则显示屏左上角第0列的8个显示点只有从上往下的第3和5点显示。

不同页和不同列DDRAM的寻址,通过左半屏和右半屏各自的页地址计数器和列地址计数器实现,因此对显示屏DDRAM写显示数据前,需要先设置页地址和列地址。

每一点对应的地址信息图12864液晶显示屏与内部RAM的对应关系12864液晶显示器的内部结构及外部引脚12864液晶显示器的内部结构框图如图2。

图12864点阵型液晶显示器的内部结构框图IC1控制模块的左半屏,IC2控制模块的右半屏。

IC3为行驱动器。

IC1,IC2为列驱动器。

IC1,IC2,IC3含有如下主要功能器件。

了解如下器件有利于对LCD模块的编程。

指令寄存器(IR)IR是用来寄存指令码,与数据寄存器寄存数据相对应.当D/I=1 时,在E信号下降沿的作用下,指令码写入IR。

.数据寄存器(DR)DR是用来寄存数据的,与指令寄存器寄存指令相对应.当D/I=1时,在E信号的下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7~DB0 数据总线.DR 和DDRAM之间的数据传输是模块内部自动执行的。

12864学习笔记及常用指令

12864学习笔记及常用指令

12864液晶深入学习笔记_1——基于msp430g2553(2012-08-30 15:56:01)转载▼标签:msp430学分类:学习探讨设计12864液晶12864液晶学习笔记Created on: 2012-8-30Author: zhang bin学习笔记for 12864redesigned by zhang bin2012-08-30versions:12_08_01这是我对12864的学习笔记,12864液晶功能很全面,使用起来也很方便,能够满足一般的研究和工程应用的需求。

下面我就对几个方面讲述一下我对它学习过程中的一些体会。

我会尽量全面的介绍,并且会主要针对一些特殊的应用和一些我认为要特别注意的地方进行较为详细的说明。

而对于那些较为固定的,常用的方面会简略一些。

其中的不管串行模式还是并行模式,对液晶的写指令,写数据,读操作等这些基本的操作都是一些比较固定的,基础的东西。

我认为只要能够看懂,并且能够在不同的处理器上移植就够了,没有必要非要自己对着手册时序图写出来。

因为有人已经写好了,而且工作稳定,我们只要在它的基础上学会应用就可以了。

现在是知识爆炸时期,知识,信息迅速膨胀,我们要学会使用已有的成果,然后在这个基础上自己再进行开发应用的研究。

我们不必一定要从底层开始把别人已经做的很成熟的东西再做一遍,这样不但效率不高,而且我们一般人的精力也不允许。

好了,不说废话了,下面就开始介绍,当然,那些基础层面的东西我也会介绍的。

下面所涉及到的程序,是针对msp430g2553的,都是我已经调通的,可以直接应用。

一,12864的介绍1,液晶显示模块是128×64 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312 码简体中文字库(16X16 点阵)、128 个字符(8X16 点阵)及64X256 点阵显示RAM(GDRAM)。

可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。

FPGA技术实现12864动态显示

FPGA技术实现12864动态显示

摘要本文使用FPGA技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。

关键词FPGA;12864lcd;静态显示;动态显示1 芯片和液晶屏介绍本实验所用芯片为ALTERA公司开发的EP1C6Q240C8芯片,cyclone系列,具有240个引脚,工作时最多可同时处理10路控制信号,工作电压为1.4V~3.6V。

液晶屏为12864,显示类型STN ,点阵格式128 x 64 ,点尺寸0.48 x 0.48mm 。

软件编程环境:Altera的Quartus II。

2 焊接板子,原理图如下左侧为EP1C6Q240C8芯片:共有240个引脚,相当于把4块芯片联系在一起,备选的引脚比较多。

右侧为液晶屏引脚,本液晶屏内置汉字库(通过查汉字编码库,得到代码)。

3 静态显示的设计3.1 给data_buffer赋内容constant data_buf0:data_buffer:=(x"a3",x"c6",x"a3",x"d0",//显示:fpgax"a3",x"c7",x"a3",x"c1","x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"20");// x"20"代表空格constant data_buf1:data_buffer:=(x"cd",x"f5",x"cf",x"d4",//显示:王显03x"a3",x"b0",x"a3",x"b3",x"20",x"20",x"20",x"20" ,x"20",x"20",x"20",x"20");constant data_buf2与constant data_buf3所赋值均为x"20",由图片可知,后两行并未输出内容。

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

fpga设计电子时钟(12864显示)设计心得:1,进行分块设计,类似调用函数,脉冲使能2,充分了解fpga的并行特性(c程序的串行特性,不能并行处理,线性:只有完成了当前任务,才能进行下一个任务)设计问题:1,似乎读有问题,在char_LR=1时,写的数据为汉字(程序中时间没有更改,主要为了调试看波形)实际板子验证时,将LCD_clk模块中的分频调为50到100kHz左右整体架构液晶初始化时序parameter Idle =8'b0000_0001,Basic_ =8'b0000_0010, //basic instruction:0x30Disp_set =8'b0000_0100, //set show curse blingDDRAM_clear =8'b0000_1000, //colunm address XWait_clear =8'b0001_0000,Point_set =8'b0010_0000,Show_on =8'b0100_0000,Stop=8'b1000_0000;写字符的时序由于字符属于半宽字形,且DDRAM形式下,每行只有8个地址,而字符可以写16个,因此用下面三个来表示写的地址:i nput [1:0] Y, //row 0-3i nput [2:0] X, //clunm 0-7i nput LR, //0/1因此当LR=0时,直接写地址,然后写一个字符编码即可LR=1时,先写地址,读出高位数据,然后写入两个字节(读出的数据,要写的数据)parameter Idle =8'b0000_0001,DDRAM =8'b0000_0010, //drawing modeW_addr =8'b0000_0100, //row address YDummy =8'b0000_1000, // not really readingR_data =8'b0001_0000, //reading high byte dataW0_data =8'b0010_0000,W1_data =8'b0100_0000,Stop =8'b1000_0000;# t1: 0 t2: 2305, T: 10,n_init: 38 # t1: 2305 t2: 2665, T: 10,n_char: 6 # t1: 2665 t2: 3265, T: 10,n_char: 10完成了上述工作,就可以设计一个简单的电子时钟,其要求如下:在屏幕上显示时间00:00:00要动态走(主要就是控制脉冲信号的产生)设计思路:1,按下复位键,系统复位,时间变为00:00:002,每一秒中时分秒数据更改3,一秒钟时间到,产生8个字符写的脉冲,LCD更新数据显示00:00:0100:01:591代码/*sign.v//creat the control signclock h:m:s*/module sign(//module LED(input lcd_clk, //100kHzinput sys_rst,output reg lcd_char_en,output reg lcd_init_en,output reg [7:0]char_data,output reg [2:0]char_X,output reg [1:0]char_Y,output reg char_LR);parameter T_w_char = 5,T_lcd_init = 40;reg [47:0] time_out;/* 1s */reg [16:0] t_s;reg [5:0] t0_clk;reg [3:0] t1_clk;reg [2:0] t_char;reg [5:0] sec,min;reg [4:0] hour;reg flag_s,flag_init;always @ (posedge lcd_clk or negedge sys_rst) begin //100kHz if(!sys_rst)begint_s <=0;t0_clk<=0;t1_clk<=0;t_char<=0;sec <=0;min <=0;hour <=0;flag_s <=0;flag_init <=1'b1;char_Y <= 2'b10;endelsebeginif(t_s == (40-1))begint_s <=0;flag_s<=1'b1;data_deal; //taskendelset_s <=t_s+1'b1;if(flag_init)begint0_clk <= t0_clk +1'b1;case(t0_clk)1 : begin lcd_init_en <=1'b0; end2 : begin lcd_init_en <=1'b1; end3 : begin lcd_init_en <=1'b1; end4 : begin lcd_init_en <=1'b0; endT_lcd_init: beginflag_init <=0;t0_clk <=0;enddefault: lcd_init_en <=0;endcaseendelseif(flag_s)begint1_clk <= t1_clk +1'b1;case(t1_clk)1 : begin lcd_char_en <=1'b0; e nd2 : begin lcd_char_en <=1'b1; e nd3 : begin lcd_char_en <=1'b1; e nd4 : begin lcd_char_en <=1'b0; e ndT_w_char: beginif(t_char == 3'b111)begin t_char<=0; flag_s <=0; endelset_char <=t_char+1'b1;t1_clk <=0;enddefault: lcd_char_en <=0;endcasecase(t_char)//2 3 4 50 : begin char_X <=3'b000; char_LR <=0; char_data <=time_out[47:40]; end //x0:00:001 : begin char_X <=3'b001; char_LR <=0; char_data <=time_out[39:32]; end //0x:00:002 : begin char_X <=3'b010; char_LR <=0; char_data <=8'h3a; end //: ascii 0583 : begin char_X <=3'b011; char_LR <=0; char_data <=time_out[31:24]; end //00:x0:004 : begin char_X <=3'b100; char_LR <=0; char_data <=time_out[23:16]; end //00:0x:005 : begin char_X <=3'b101; char_LR <=0; char_data <=8'h3a; end //: ascii 0586 : begin char_X <=3'b110; char_LR <=0; char_data <=time_out[15: 8]; end//00:00:x07 : begin char_X <=3'b111; char_LR <=0; char_data <=time_out[7 : 0]; endendcaseendendendtask data_deal;beginif(sec == 59)if(min ==59)if(hour == 23)begin hour<=0;min <=0;sec <=0; endelsebegin hour<=hour + 1'b1; min <=0; sec<=0; endelsebegin min <= min+1'b1; sec <=0; endelsesec <= sec +1'b1;time_out[47:40] <= 8'h30+(hour/10);time_out[39:32] <= 8'h30+(hour%10);time_out[31:24] <= 8'h30+(min /10);time_out[23:16] <= 8'h30+(min %10);time_out[15: 8] <= 8'h30+(sec /10);time_out[ 7: 0] <= 8'h30+(sec %10);endendtaskendmodule2代码module LCD_init(//module LED(input lcd_clk,input sys_clk,input lcd_en, //1 is activedoutput reg LCD_RS,output reg LCD_RW,output reg LCD_EN,inout [7:0] LCD_DATA,output reg ACK);reg flag;reg [7:0] lcd_data;reg [7:0] State;reg link_rs;reg link_data;parameter Idle =8'b0000_0001,Basic_ =8'b0000_0010, //basic instruction:0x30Disp_set =8'b0000_0100, //set show curse blingDDRAM_clear =8'b0000_1000, //colunm address XWait_clear =8'b0001_0000,Point_set =8'b0010_0000,Show_on =8'b0100_0000,Stop =8'b1000_0000;reg [9:0] t; //16*2*32=2^10 byte(8bits)/* LCD_RW LCD_DATA*/assign LCD_DATA = link_data ? lcd_data: 8'hzz;/* LCD_RW LCD_EN */always @ (posedge sys_clk) beginif(flag)beginLCD_RW =0;LCD_EN = lcd_clk;endelsebeginLCD_RW =1'bz;LCD_EN =1'bz;endend/* LCD_RS */always @ (posedge lcd_clk) beginif(link_rs)LCD_RS <=1'b0;elseLCD_RS <=1'bz;end/*-Main state transter-*/always @ (posedge lcd_clk) begincase (State)Idle : beginif(lcd_en)begin link_rs=1; State <= Basic_; endelseState <= Idle;ACK =0;flag <=1'b0;lcd_data <= 8'hzz;t <= 0;endBasic_ : beginflag <=1'b1;link_data =1'b1;t <= t +1'b1;if(t == 1)State <= Disp_set;elseState <= Basic_;lcd_data <= 8'h30;endDisp_set : beginState <= DDRAM_clear;lcd_data <= 8'h0c; //show curse blink is offendDDRAM_clear : beginState <= Wait_clear;lcd_data <= 8'h01;endWait_clear : begint <=t +1'b1;link_data = 1'b0;flag <=0;lcd_data <= 8'hzz;if(t == 30)State <= Point_set;elseState <= Wait_clear;endPoint_set : beginflag <=1'b1;link_data =1'b1;State <= Show_on;lcd_data <= 8'h06; //point +1 automatically,screen move off endShow_on : beginState <= Stop;lcd_data <= 8'h0c;endStop : beginState <= Idle;flag <=1'b0;link_data =1'b0;ACK <=1'b1;lcd_data <= 8'hzz;t <= 0;link_rs =0;enddefault: begin ACK =0;State <= Idle;end endcaseendendmodule3代码//module LCD_top(module LED(input sys_clk,input sys_rst,output LCD_RS,output LCD_RW,output LCD_EN,inout [7:0] LCD_DATA,output BUSY);wire [7:0] char_data;wire [2:0] char_X;wire [1:0] char_Y;sign singb(.lcd_clk (lcd_clk), //100kHz.sys_rst (sys_rst),.lcd_char_en(lcd_char_en),.lcd_init_en(lcd_init_en),.char_data (char_data),.char_X (char_X),.char_Y (char_Y),.char_LR (char_LR));LCD_init lcd_init(.lcd_clk (lcd_clk),.sys_clk (sys_clk),.lcd_en (lcd_init_en), //1 is actived .LCD_RS (LCD_RS),.LCD_RW (LCD_RW),.LCD_EN (LCD_EN),.LCD_DATA (LCD_DATA),.ACK (init_ack));LCD_charac a(.lcd_clk (lcd_clk),.sys_clk (sys_clk),.lcd_en (lcd_char_en), //1 is actived .Y (char_Y), //row 0-3.X (char_X), //clunm 0-7.LR (char_LR), //0/1.data_disp (char_data),.LCD_RS (LCD_RS),.LCD_RW (LCD_RW),.LCD_EN (LCD_EN),.LCD_DATA (LCD_DATA),.ACK (init_ack));LCD_clk clk1(.sys_clk (sys_clk),.lcd_clk (lcd_clk));endmodule4代码module LCD_clk(//module LED(input sys_clk,output reg lcd_clk);/*-creat the 25kHz clock-*/always @ (posedge sys_clk) beginif(lcd_t == 2) //100kHzbeginlcd_t =0;lcd_clk <= ~ lcd_clk;endelselcd_t = lcd_t +1'b1;endinitial begin lcd_clk =0; lcd_t =0; endendmodule5代码/* to display character */module LCD_charac(//module LED(input lcd_clk,input sys_clk,input lcd_en, //1 is activedinput [1:0] Y, //row 0-3input [2:0] X, //clunm 0-7input LR, //0/1input [7:0] data_disp,output reg LCD_RS,output reg LCD_RW,output reg LCD_EN,inout [7:0] LCD_DATA,output reg ACK);reg [7:0] lcd_data;reg [7:0] R_buff;reg [7:0] State;parameter Idle =8'b0000_0001,DDRAM =8'b0000_0010, //drawing modeW_addr =8'b0000_0100, //row address YDummy =8'b0000_1000, // not really readingR_data =8'b0001_0000, //reading high byte dataW0_data =8'b0010_0000,W1_data =8'b0100_0000,Stop =8'b1000_0000;reg flag,t;reg flag0;/* LCD_DATA */assign LCD_DATA = link_data ? lcd_data :8'hzz;/* LCD_EN */always @ (posedge sys_clk) beginif(flag == 1'b1)LCD_EN <= lcd_clk;elseLCD_EN <=1'bz;end/* LCD_RW */always @ (posedge lcd_clk) beginif(flag0)if(State == Dummy || State == R_data)LCD_RW <=1'b1;elseLCD_RW <=1'b0;elseLCD_RW <=1'bz;end/* LCD_RS */always @ (posedge lcd_clk) beginif(flag0)if(State == W0_data || State == W1_data || State == Dummy || State == R_data) LCD_RS <=1'b1;elseLCD_RS <=1'b0;elseLCD_RS <=1'bz;end/*-Main state transter-*/always @ (posedge lcd_clk) begincase (State)Idle : beginif(lcd_en)begin State <= DDRAM; link_data =1; flag0=1'b1; endelsebegin State <= Idle; flag0= 1'b0;endflag <= 1'b0;lcd_data <= 8'hzz;ACK <=0;endDDRAM : begin //here flag is changed,not Idle, cause sys_clk flag <= 1'b1;State <= W_addr;link_data =1;lcd_data <= 8'h30;endW_addr : beginif(!t)beginif(LR)State <= Dummy;elseState <= W0_data;t =1'b1;endelseState <= W0_data;case (Y)2'b00: lcd_data <= 8'h80 + X;2'b01: lcd_data <= 8'h90 + X;2'b10: lcd_data <= 8'h88 + X;2'b11: lcd_data <= 8'h98 + X;endcaselink_data =1'b1;endDummy : beginState <= R_data;R_buff <= LCD_DATA;link_data =0;endR_data : beginState <=W_addr;R_buff <= LCD_DATA;endW0_data : beginif( !LR)beginlcd_data <= data_disp;State <= Stop;endelsebeginlcd_data <= R_buff;State <= W1_data;endendW1_data : beginlcd_data <= data_disp;State <=Stop;flag0=0;endStop : beginState <= Idle;flag <= 1'b0;lcd_data <= 8'hzz;t <= 0;ACK <= 1;enddefault: begin ACK =0;State <= Idle; link_data=0 ;end endcaseendendmodule。

相关文档
最新文档