推荐-学习笔记fpga设计电子时钟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电子钟说明文档

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液晶电子钟具有按键可调闹钟温度显示理解才是最主要程序已全部通过硬件测试,请放心使用。
(没有使用到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时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。
它可以对年、月、日、星期、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒等信息,还有时间校准等功能。
该电子时钟主要采用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汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#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]);//时间之间的冒号。
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液晶深入学习笔记_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技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。
关键词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",由图片可知,后两行并未输出内容。
12864使用心得、笔记

备注:这篇文章是对12864操作的具体介绍,仅限刚接触12864的新手,大神请拍砖,文章写的较散,建议先参考12864手册及控制驱动器ST7920英文手册有个初步理解之后再阅读该篇文章,将会有更深的认识。
强烈建议阅读ST7920英文手册,细节内容里面有详细介绍,中文的12864也是从中译过来的。
本文分三个步骤介绍12864的内部资源原理,指令集详细讲解,以及应用例子。
对12864的所有操作概括起来有4种:1)、读忙状态(同时读出指针地址内容),初始化之后每次对12864的读写均要进行忙检测。
2)、写命令:所有的命令可以查看指令表,后续讲解指令的详细用法。
写地址也是写指令。
3)、写数据:操作对象有DDRAM、CGRAM、GDRAM。
4)、读数据:操作对象也是DDRAM、CGRAM、GDRAM。
对12864的学习首相要了解其内部资源,知道了它里面有哪些东西,你就可以更加方便的使用它。
先介绍几个英文的名字:DDRAM:(Data Display Ram),数据显示RAM,往里面写啥,屏幕就会显示啥。
CGROM:(Character Generation ROM),字符发生ROM。
里面存储了中文汉字的字模,也称作中文字库,编码方式有GB2312(中文简体)和BIG5(中文繁体)。
笔者使用的是育松电子的QC12864B,讲解以此为例。
CGRAM:(Character Generation RAM),字符发生RAM,,12864内部提供了64×2B 的CGRAM,可用于用户自定义4个16×16字符,每个字符占用32个字节。
GDRAM:(Graphic Display RAM):图形显示RAM,这一块区域用于绘图,往里面写啥,屏幕就会显示啥,它与DDRAM的区别在于,往DDRAM中写的数据是字符的编码,字符的显示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中写的数据时图形的点阵信息,每个点用1bit来保存其显示与否。
FPGA实现12864液晶的静动态显示

FPGA实现12864液晶的静\动态显示作者:王显来源:《科技传播》2010年第21期摘要本文使用FPGA技术实现,通过控制液晶屏的地址,将汉字、字符或图形输入到液晶屏上,通过连续几屏显示实现动态效果。
关键词 FPGA;12864lcd;静态显示;动态显示中图分类号TP27 文献标识码A 文章编号 1674-6708(2010)30-0152-021 芯片和液晶屏介绍本实验所用芯片为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",由图片可知,后两行并未输出内容。
毕业设计—基于单片机的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时钟发展史很早以前,人类主要是利用天文现象和流动物质的连续运动来计时。
FPGA实验报告LCD12864液晶显示

液晶显示实验一实验要求所有程序必须由verilog语言编写,同时需要通过按键切换屏幕显示文字,一页全是英文,一页全是中文。
我的文字是我的的课程、班级、学号和姓名。
二实验原理1.12864简介12864系列中文图形液晶模块的特性主要由其控制器决定。
控制器同时作为控制器和驱动器,它可提供33 路com 输出和64 路seg 输出。
在驱动器的配合下,最多可以驱动256×32 点阵液晶。
其汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
LCD类型为STN与MCU接口为8位或4位并行/3位串行可实现光标显示、画面移位、自定义字符、睡眠模式等多种软件功能。
其原理简图为:引脚号引脚名称方向功能说明1 VSS - 模块的电源地2 VDD - 模块的电源正端3 V0 - LCD驱动电压输入端4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号5 R/W(SID) H/L 并行的读写选择信号;串行的数据口6 E(CLK) H/L 并行的使能信号;串行的同步时钟7 DB0 H/L 数据08 DB1 H/L 数据19 DB2 H/L 数据210 DB3 H/L 数据311 DB4 H/L 数据412 DB5 H/L 数据513 DB6 H/L 数据614 DB7 H/L 数据715 PSB H/L 并/串行接口选择:H-并行;L-串行16 NC 空脚17 /RET H/L 复位低电平有效18 NC 空脚19 LED_A - 背光源正极(LED+5V)20 LED_K - 背光源负极(LED-OV)2.12864工作时序原理图8位并行连接时序图,分为MPU写资料到模块与MPU从模块读出资料MPU写资料到模块MPU从模块读出资料串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)三实验流程图及管脚分配初始化流程:流程简易图:管教分配图:四实验程序主要程序:module lcd_test( clk, key,rs,rw,en,psb,reset,sel,dat);input clk;input key;output rs;output rw;output en;output psb;output reset;output [7:0] dat;output [2:0] sel;wire [127:0] row1_val="xx:xxx ";wire [127:0] row2_val="xx:xxxxxxxxxx ";wire [127:0] row3_val=" xxxxxx ";wire [127:0] row4_val="xx:xxxxxxxx ";wire [127:0] row5_val="xxxx:xxxxxxxxxxx";wire [127:0] row6_val="NUMB:xxxxxxxxxx";wire [127:0] row7_val=" EDA ";wire [127:0] row8_val="CLASS :20090823";wire [127:0] row1;wire [127:0] row2;wire [127:0] row3;wire [127:0] row4;assign sel=3'b110;assign psb = 1;assign reset = 1;assign row1=(key==1'b1)?(row1_val):(row5_val);assign row2=(key==1'b1)?(row2_val):(row6_val);assign row3=(key==1'b1)?(row3_val):(row7_val);assign row4=(key==1'b1)?(row4_val):(row8_val);//assign row1=row5_val;xian(.clk(clk),.rs(rs),.rw(rw),.en(en),.dat(dat),.row1_val(row1),.row2_val(row2),.row3_val(row3),.row4_val(row4),.key(key));Endmodule显示部分程序:xian(clk, rs, rw, en,dat,row1_val,row2_val,row3_val,row4_val,key);input clk;input [127:0] row1_val;input [127:0] row2_val;input [127:0] row3_val;input [127:0] row4_val;input key;output [7:0] dat;output rs,rw,en;reg e;reg [7:0] dat;reg rs;reg [23:0] counter;reg [6:0] current,next;reg clkr;reg [1:0] cnt;parameter set0=8'h0; //定义了很多状态机parameter set1=8'h1;parameter set2=8'h2;parameter set3=8'h3;parameter set4=8'h4;parameter set5=8'h5;parameter set6=8'h6;parameter dat0=8'h7; parameter dat1=8'h8; parameter dat2=8'h9; parameter dat3=8'hA; parameter dat4=8'hB; parameter dat5=8'hC; parameter dat6=8'hD; parameter dat7=8'hE; parameter dat8=8'hF; parameter dat9=8'h10;parameter dat10=8'h12; parameter dat11=8'h13; parameter dat12=8'h14; parameter dat13=8'h15; parameter dat14=8'h16; parameter dat15=8'h17; parameter dat16=8'h18; parameter dat17=8'h19; parameter dat18=8'h1A; parameter dat19=8'h1B; parameter dat20=8'h1C; parameter dat21=8'h1D; parameter dat22=8'h1E; parameter dat23=8'h1F; parameter dat24=8'h20; parameter dat25=8'h21; parameter dat26=8'h22; parameter dat27=8'h23; parameter dat28=8'h24; parameter dat29=8'h25; parameter dat30=8'h26; parameter dat31=8'h27; parameter dat32=8'h28; parameter dat33=8'h29; parameter dat34=8'h2A; parameter dat35=8'h2B; parameter dat36=8'h2C; parameter dat37=8'h2E; parameter dat38=8'h2F; parameter dat39=8'h30; parameter dat40=8'h31; parameter dat41=8'h32;parameter dat42=8'h33;parameter dat43=8'h34;parameter dat44=8'h35;parameter dat45=8'h36;parameter dat46=8'h37;parameter dat47=8'h38;parameter dat48=8'h39;parameter dat49=8'h40;parameter dat50=8'h41;parameter dat51=8'h42;parameter dat52=8'h43;parameter dat53=8'h44;parameter dat54=8'h45;parameter dat55=8'h46;parameter dat56=8'h47;parameter dat57=8'h48;parameter dat58=8'h49;parameter dat59=8'h50;parameter dat60=8'h51;parameter dat61=8'h52;parameter dat62=8'h53;parameter dat63=8'h54;//parameter dat64=8'h54;parameter nul=8'h55;always @(posedge clk) //da de shi zhong pinlvbegincounter=counter+1'b1;if(counter==2499999)begincounter<=0;clkr=~clkr;endendalways @(posedge clkr)begincurrent=next;case(current)set0: begin rs<=0; dat<=8'h30; next<=set1; end // LCD的初始化set1: begin rs<=0; dat<=8'h0c; next<=set2; endset2: begin rs<=0; dat<=8'h6; next<=set3; endset3: begin rs<=0; dat<=8'h1; next<=dat0; enddat0: begin rs<=1; dat<=row1_val[127:120]; next<=dat1; end //显示第一行dat1: begin rs<=1; dat<=row1_val[119:112]; next<=dat2; enddat2: begin rs<=1; dat<=row1_val[111:104]; next<=dat3; enddat3: begin rs<=1; dat<=row1_val[103:96];next<=dat4; enddat4: begin rs<=1; dat<=row1_val[95:88]; next<=dat5; enddat5: begin rs<=1; dat<=row1_val[87:80]; next<=dat6; enddat6: begin rs<=1; dat<=row1_val[79:72]; next<=dat7; enddat7: begin rs<=1; dat<=row1_val[71:64];next<=dat8; enddat8: begin rs<=1; dat<=row1_val[63:56]; next<=dat9; enddat9: begin rs<=1; dat<=row1_val[55:48];next<= dat10 ; enddat10: begin rs<=1; dat<=row1_val[47:40]; next<=dat11; enddat11: begin rs<=1; dat<=row1_val[39:32]; next<=dat12; enddat12: begin rs<=1; dat<=row1_val[31:24]; next<=dat13; enddat13: begin rs<=1; dat<=row1_val[23:16]; next<=dat14; enddat14: begin rs<=1; dat<=row1_val[15:8]; next<=dat15; enddat15: begin rs<=1; dat<=row1_val[7:0];next<=set4; endset4: begin rs<=0; dat<=8'h90; next<=dat16; end //显示第二行90是第二行的起始显示地址dat16: begin rs<=1; dat<=row2_val[127:120]; next<=dat17; enddat17: begin rs<=1; dat<=row2_val[119:112]; next<=dat18; enddat18: begin rs<=1; dat<=row2_val[111:104]; next<=dat19; enddat19: begin rs<=1; dat<=row2_val[103:96]; next<=dat20; enddat20: begin rs<=1; dat<=row2_val[95:88]; next<=dat21; enddat21: begin rs<=1; dat<=row2_val[87:80]; next<=dat22; enddat22: begin rs<=1; dat<=row2_val[79:72]; next<=dat23; enddat23: begin rs<=1; dat<=row2_val[71:64]; next<=dat24; enddat24: begin rs<=1; dat<=row2_val[63:56]; next<=dat25; enddat25: begin rs<=1; dat<=row2_val[55:48]; next<=dat26; enddat26: begin rs<=1; dat<=row2_val[47:40]; next<=dat27; enddat27: begin rs<=1; dat<=row2_val[39:32]; next<=dat28; enddat28: begin rs<=1; dat<=row2_val[31:24]; next<=dat29; enddat29: begin rs<=1; dat<=row2_val[23:16]; next<=dat30; enddat30: begin rs<=1; dat<=row2_val[15:8]; next<=dat31; enddat31: begin rs<=1; dat<=row2_val[7:0]; next<=set5; endset5: begin rs<=0; dat<=8'h88; next<=dat32; end //显示第三行88是第三行的起始显示地址dat32: begin rs<=1; dat<=row3_val[127:120]; next<=dat33 ; enddat33: begin rs<=1; dat<=row3_val[119:112]; next<=dat34; enddat34: begin rs<=1; dat<=row3_val[111:104]; next<=dat35; enddat35: begin rs<=1; dat<=row3_val[103:96]; next<=dat36; enddat36: begin rs<=1; dat<=row3_val[95:88]; next<=dat37; enddat37: begin rs<=1; dat<=row3_val[87:80]; next<=dat38; enddat38: begin rs<=1; dat<=row3_val[79:72]; next<=dat39; enddat39: begin rs<=1; dat<=row3_val[71:64]; next<=dat40; enddat40: begin rs<=1; dat<=row3_val[63:56]; next<=dat41; enddat41: begin rs<=1; dat<=row3_val[55:48]; next<=dat42; enddat42: begin rs<=1; dat<=row3_val[47:40]; next<=dat43; enddat43: begin rs<=1; dat<=row3_val[39:32]; next<=dat44; enddat44: begin rs<=1; dat<=row3_val[31:24]; next<=dat45; enddat45: begin rs<=1; dat<=row3_val[23:16]; next<=dat46; enddat46: begin rs<=1; dat<=row3_val[15:8]; next<=dat47; enddat47: begin rs<=1; dat<=row3_val[7:0]; next<=set6; endset6: begin rs<=0; dat<=8'h98; next<=dat48; end //显示第四行dat48: begin rs<=1; dat<=row4_val[127:120]; next<=dat49 ; enddat49: begin rs<=1; dat<=row4_val[119:112]; next<=dat50; enddat50: begin rs<=1; dat<=row4_val[111:104]; next<=dat51; enddat51: begin rs<=1; dat<=row4_val[103:96]; next<=dat52; enddat52: begin rs<=1; dat<=row4_val[95:88]; next<=dat53; enddat53: begin rs<=1; dat<=row4_val[87:80]; next<=dat54; enddat54: begin rs<=1; dat<=row4_val[79:72]; next<=dat55; enddat55: begin rs<=1; dat<=row4_val[71:64]; next<=dat56; enddat56: begin rs<=1; dat<=row4_val[63:56]; next<=dat57; enddat57: begin rs<=1; dat<=row4_val[55:48]; next<=dat58; enddat58: begin rs<=1; dat<=row4_val[47:40]; next<=dat59; enddat59: begin rs<=1; dat<=row4_val[39:32]; next<=dat60; enddat60: begin rs<=1; dat<=row4_val[31:24]; next<=dat61; enddat61: begin rs<=1; dat<=row4_val[23:16]; next<=dat62; enddat62: begin rs<=1; dat<=row4_val[15:8]; next<=dat63; enddat63: begin rs<=1; dat<=row4_val[7:0]; next<=nul; endnul: begin rs<=0; dat<=8'h00; // 把液晶的E 脚拉高if(key==1'h0)begine<=0;next<=set0;endelsebegin next<=nul; e<=1;endenddefault: next=set0;endcaseendassign en=clkr|e;assign rw=0;endmodule五实验结果满足实验要求,液晶进行扫描屏幕显示中英文转换。
学习笔记-verilog控制12864显示汉字 - 副本

学习笔记-verilog控制12864显示汉字设计心得:1,在一个这样的非阻塞赋值的块里:Write_Ram : beginLCD_DATA <= data_disp;cnt <= cnt+1'b1;Read_addr <= {ref_data,cnt[4:0]}+1;if(CN_cnt <32)if(cnt <= 31)if(cnt[0]==1'b1)State <= Disp0;elseState <= Write_Ram;else;elseState <=Stop;end左值总保持在上一个时钟进来的值状态中,判断语句同样如此,不要认为是顺序赋值,值就改变。
2,设计中的时序仿真图,更能说明问题一:使用内置ROM块1,对所取字形取模(根据特点)如:汉字:张,取出点阵如下:{0x01,0x00,0xF9,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x79,0x40,0x41,0x00,0x47,0xFE},{0x41,0x40,0x79,0x20,0x09,0x20,0x09,0x10,0x09,0x08,0x09,0x44,0x51,0x82,0x21,0x00},/*"张2,生成hex文件(在keil中生成hex)3,创建ROM(利用内置的IP)本次设置:1024个word即2^10,可以存储16*16编码共32个(一个16*16编码占用8*2*2=32=2^5,2^10/2^5 =2^5 =32)选择生成的hex文件二:一个汉字的写表示此处写汉字所用的液晶模式为GDRAM形式,该形式下:绘图RAM的空间结构如下图所示:这些都是点阵,绘图RAM就是给这些点阵置1或置0,可以看到其实它本来是32行×256列的,但是分成了上下两屏显示,每个点对应了屏幕上的一个点。
要使用绘图功能需要开启扩展指令。
基于FPGA的LCD12864汉字显示设计

【0727学习笔记】LCD12864液晶显示技术

【0727学习笔记】LCD12864液晶显示技术-硬件介绍2008-07-27 20:18---- 根据相关资料整理,不对之处,欢迎留言或EMAIL ME niejinbo999# (#换成@) ------ 我是用Proteus仿真的,带字库的LCD12864屏近百大元一个,下载个破解版的Proteus,LCD12864屏直接拖出来就可以用了,想拖几个就拖几个,呵呵,闲话少说,进入正题。
先来看一下Proteus里面的12864长什么样,下图中就是我使用的12864屏,型号为:AMPIRE128X64管脚一共18个。
CS1左半屏片选端,CS2右半屏片选端;VCC、GND就是VCC、GND,没啥好说的;V0液晶显示驱动电压,在网上找的仿真实例中有的这个脚就悬空,我是通过一个电位器接到VCC;RS数据指令选择信号,H为数据,L为指令,有的资料上也叫D/I,我估计是DATA和INSTRUCTIONS这两个单词的缩写;R/W读写选择信号,H为读,L为写,这肯定是READ和WRITE的缩写。
E为LCD使能端,R/W为L时,E信号下降沿锁存DB7-DB0;R/W为H时,E为H,DDRAM数据读到DB7-DB0,如果只写不读的话可以接地处理。
DB0-DB7数据传输端口。
RST复位信号,不过还没弄明白是怎么回事,参考一些资料后接VCC处理。
-VOUT估计和V0差不多,液晶显示驱动电压。
PS:我在网上没找到AMPIRE128X64的资料,但其控制系统和市面上卖的有些是一样的,因此可以参考一下。
我就是参考下面这个型号的资料,需要的朋友可以留下EMIAL。
图片截自深圳彩晶科技的文档资料。
指令说明:一共有7个指令,下面分别加以说明(个人理解)显示开关 0x3e:关;0x3f:开(R/W=0,RS=0)显示起始行 0xc0+i : i取值0至63 (R/W=0,RS=0)设置DDRAM页地址(X地址) 0xb8+i: i取值0至7 (R/W=0,RS=0)设置Y地址 0x40+i:i取值0至63 (R/W=0,RS=0)读状态 R/W为H时,暂未弄明白写数据将数据线上的数据DB7-DB0写到DDRAM ,Y地址指针自动加1 (R/W=0,RS=1)读数据将DDRAM中的数据读入1数据线DB7-DB0 ,Y地址指针自动加1 (R/W=1,RS=1)(用到的很少)DDRAM地址表(注意DB0-DB7在DDRAM里的存储空间,竖起排列)写操作时序(当E信号下降沿时写入数据)小声的说下,资料上是 L有效,时序图里怎么就H了呢?写操作时序(时序参数均为NS级,单片机为US级,故不用考虑延时)读操作时序(时序参数均为NS级,单片机为US级,故不用考虑延时)硬件介绍到此结束,有什么不对之处留言或EMAI告之。
12864显示原理

12864显示原理12864显示原理是指12864液晶显示屏的工作原理和特点。
在深入了解12864显示原理之前,我们首先要了解液晶显示屏的基本结构和工作原理。
液晶显示屏是一种利用液晶材料的光学特性来显示图像的平面显示器件。
它由玻璃基板、液晶材料、驱动电路和偏光片等组成。
其中,12864显示屏是指屏幕分辨率为128×64的液晶显示屏。
它广泛应用于电子仪器、仪表、通讯设备、汽车电子等领域。
12864显示原理的核心是液晶材料的电光效应。
液晶材料具有两个特性,扭曲结构和双折射。
当施加电场时,液晶分子会发生扭曲,改变光的传播路径,从而实现像素点的亮暗变化。
通过合理的驱动电路,可以控制每个像素点的亮度,从而显示出所需的图像。
在12864显示原理中,驱动电路起着至关重要的作用。
它主要由控制器、驱动芯片和接口电路组成。
控制器负责接收外部信号并生成显示数据,驱动芯片则负责将显示数据转化为对液晶的驱动信号,接口电路则负责与外部系统进行通信。
通过这些部件的协同工作,才能实现12864显示屏的正常工作。
除了驱动电路,偏光片也是12864显示原理中不可或缺的部分。
偏光片可以过滤出特定方向的光线,使得液晶显示出清晰的图像。
在实际应用中,偏光片的选择和安装位置对显示效果有着重要的影响。
总的来说,12864显示原理是液晶显示技术的一个重要分支,它通过液晶材料的电光效应和驱动电路的协同作用,实现了图像的高质量显示。
在实际应用中,我们需要根据具体的场景和要求,选择合适的液晶显示方案,并合理设计驱动电路和偏光片,以实现最佳的显示效果。
通过对12864显示原理的深入了解,我们可以更好地应用液晶显示技术,提高产品的竞争力,为用户带来更好的视觉体验。
同时,也可以为液晶显示技术的进一步发展提供有益的参考和借鉴。
希望本文对您理解12864显示原理有所帮助,谢谢阅读!。
推荐-12864点阵型液晶显示控制设计 精品

本文介绍以AT89S51单片机为控制核心,以LCD128*64液晶作为显示的模块。
该模块硬件结构简单、功能齐全,工作稳定,可完成目前绝大部分设备的显示工作。
12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
关键字:单片机 LCD128*64 液晶显示模块目录1 课程设计目的 (1)2 课程设计题目描述和要求 (1)3 课程设计报告内容 (1)3.1 系统软、硬件功能设定(分工方案) (1)3.2 系统硬件电路介绍 (1)3.3 LCD显示基本原理 (3)3.4 系统软件介绍 (4)3.5系统软件流程 (5)3.6 液晶显示模块指令系统 (5)3.7系统硬件电路框图 (6)3.8原理图及基本结构 (7)3.9 128 64点阵型液晶 C语言程序(可以显示指定点) (12)4实物图 (22)总结 (23)致谢 (24)参考文献 (25)1 课程设计目的通过电路结构选择、控制方式选择、参数计算、器件选型、硬件制作及软件编程调试等训练切实培养学生综合应用知识、正确分析问题、解决问题的能力,特别是实际动手和创新能力,将自动化专业知识进行整合,融会贯通。
2 课程设计题目描述和要求设计题目:LCD显示器显示界面的设计信息时代各种信息最终都是要通过信息显示来实现人、机交换,而信息的显示依赖于各种显示器件的应用,由于液晶显示器(LCD)具有低工作电压、微功耗、显示灵活、成本低等特点,因此在电子计算器、智能化仪器仪表、手机、掌上电脑等等领域应用极为广泛。
(1)了解128X64液晶显示器的基本结构、电路特性、软件特性、接口应用技术等;(2)在(1)基础上能根据实际工作需要,进行液晶显示界面的任意开发;如:要求每位同学在液晶(LCD)上显示自己的学号(数字)、姓名(中文)等;(3)撰写课程设计说明书。
学习笔记-fpga设计电子时钟(12864显示)

fpga设计电子时钟(12864显示)设计心得:1,进行分块设计,类似调用函数,脉冲使能2,充分了解fpga的并行特性(c程序的串行特性,不能并行处理,线性:只有完成了当前任务,才能进行下一个任务)设计问题:1,似乎读有问题,在char_LR=1时,写的数据为汉字(程序中时间没有更改,主要为了调试看波形)实际板子验证时,将LCD_clk模块中的分频调为50到100kHz左右整体架构功能模块液晶初始化时序parameter Idle =8'b0000_0001,Basic_com =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要动态走(主要就是控制脉冲信号的产生)设计思路:100:00:0023LCD更新数据显示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] cnt_s;reg [5:0] cnt0_clk;reg [3:0] cnt1_clk;reg [2:0] cnt_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)begincnt_s <=0;cnt0_clk<=0;cnt1_clk<=0;cnt_char<=0;sec <=0;min <=0;hour <=0;flag_s <=0;flag_init <=1'b1;char_Y <= 2'b10;endelsebeginif(cnt_s == (40-1))begincnt_s <=0;flag_s<=1'b1;data_deal; //taskendelsecnt_s <=cnt_s+1'b1;if(flag_init)begincnt0_clk <= cnt0_clk +1'b1;case(cnt0_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;cnt0_clk <=0;enddefault: lcd_init_en <=0;endcaseendelseif(flag_s)begincnt1_clk <= cnt1_clk +1'b1;case(cnt1_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(cnt_char == 3'b111)begin cnt_char<=0; flag_s <=0; endelsecnt_char <=cnt_char+1'b1;cnt1_clk <=0;enddefault: lcd_char_en <=0;endcasecase(cnt_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_com =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] cnt; //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_com; endelseState <= Idle;ACK =0;flag <=1'b0;lcd_data <= 8'hzz;cnt <= 0;endBasic_com : beginflag <=1'b1;link_data =1'b1;cnt <= cnt +1'b1;if(cnt == 1)State <= Disp_set;elseState <= Basic_com;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 : begincnt <=cnt +1'b1;link_data = 1'b0;flag <=0;lcd_data <= 8'hzz;if(cnt == 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;cnt <= 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-*/reg [11:0] lcd_cnt;always @ (posedge sys_clk) beginif(lcd_cnt == 2) //100kHzbeginlcd_cnt =0;lcd_clk <= ~ lcd_clk;endelselcd_cnt = lcd_cnt +1'b1;endinitial begin lcd_clk =0; lcd_cnt =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,cnt;reg link_data;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(!cnt)beginif(LR)State <= Dummy;elseState <= W0_data;cnt =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;cnt <= 0;ACK <= 1;enddefault: begin ACK =0;State <= Idle; link_data=0 ;end endcaseendendmodule。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。