12864液晶按键显示
旋转编码器控制12864液晶多级菜单显示
(5)、工作电流:2.0mAmax
5、接口说明
管 管脚 电平 脚 号
1 VSS 0V
2 VDD 5.0V
3 V0
说明
逻辑电源地。 逻辑电源正。 LCD 驱动电压,应用时在 VEE 与 V0 之间加一 10K 可调电阻。
4 D/I H/L
5 R/W H/L
6
E H.H/L
7 DB0 H/L
8 DB1 H/L
Line 0 1/0 1/0 1/0 1/0 …………
1/0 1/0 1/0 DB0
Line 1 1/0 1/0 1/0 1/0 …………
1/0 1/0 1/0 DB1
Line 2 1/0 1/0 1/0 1/0 ………… X=0
1/0 1/0 1/0 DB2
Line 3 1/0 1/0 1/0 1/0 …………
(4)、输入电压:Vee~Vdd
(5)、工作温度
:0~55℃(常温) / -20~70℃(宽温)
(6)、保存温度
:-10~65℃
4、电气特性
(1)、输入高电平
:3.5Vmin
(2)、输入低电平(Vil):0.55Vmax
(3)、输出高电平( ):3.75Vmin
(4)、输出低电平(Vol):1.0Vmax
(1)、显示开/关设置
L
L
L
L
H
H
H
H
H H/L
功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。不影响显示 RAM(DD RAM)中的内容。
(2)、设置显示起始行
L
L
H
H
行地址(0~63)
功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由 Z 地址计数 器控制的,该命令自动将 A0-A5 位地址送入 Z 地址计数器,起始地址可以是 0-63 范围 内任意一行。Z 地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后 自动加一。
12864点阵型液晶显示屏的基本原理与使用方法(很详细)
12864点阵型液晶显示屏的基本原理与使用方法(很详细)点阵LCD的显示原理在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。
而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。
而剩下的低128位则留给英文字符使用,即英文的内码。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:图1“A”字模图而中文的“你”在字模中的记载却如图2所示:图2“你”字模图12864点阵型LCD简介12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
管脚号管脚名称LEVER管脚功能描述1VSS0电源地2VDD+5.0V电源电压3V0-液晶显示器驱动电压4D/I(RS)H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR 6E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 7DB0H/L数据线8DB1H/L数据线9DB2H/L数据线10DB3H/L数据线11DB4H/L数据线12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15CS1H/L H:选择芯片(右半屏)信号16CS2H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VOUT-10V LCD驱动负电压19LED+-LED背光板电源20LED--LED背光板电源表1:12864LCD的引脚说明在使用12864LCD前先必须了解以下功能器件才能进行编程。
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(KS0108主控)12864市面上比较流行的有两种,一种是以KS0108为主控芯片的,不带字库的,说白了就是只能靠打点才能显示出字符或图形的,当然要借助取模软件;另一种是以ST7920为主控芯片的,带ASCII码和中文字库。
至于两种的区别下一篇再讨论,这篇先讲述KS0108为主控芯片的12864的原理。
这是网上找的一个管脚图,当然不同品牌的可能略有差异,但是主要的还是一样的重点要讲一下CS1和CS2,KS0108控制的12864内部有两个控制器,分别控制左半屏和右半屏,如下图所示左半屏和右半屏操作时写的地址其实是一样的,那么只能通过片选CS1和CS2来选择哪半个屏了,如果两个都选通,则相当于两块64x64的液晶了,而且显示的内容是一样的,取模方式是纵向8点下高位。
好了,来说下原理,列的范围是0~63,我已经标出了,行是不能按位来写的,而是写“页”,一个页相当于8个点,也就是8位,即一个字符,高位在下面,那么页的范围是0~7,共8页,8页x8个点正好64个点。
这是我用取模软件截的一个“们”字,可以看出它是16x16大小的,实际上占用了两个“页”,16个列,而我们操作时先固定一个页,比如这个就先写上面那页,假设为n好了,从列0写到16,然后页n+1,再从列0写到16,这样一个“们”字就出来了,下面是其代码0x40,0x20,0xF8,0x07,0x00,0xF8,0x02,0x04, 0x08,0x04,0x04,0x04,0x04,0xF E,0x04,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F ,0x00,0x00,可见16x16的字符占了32个字节(上面n页16个字节加n+1页16个),那么如果一幅满幅的图片,就是128x64,占用128x8=1K个字节,可见还是非常占空间的。
06 12864LCD显示计算器键盘按键实验
目录1 课程设计概述和要求 (1)1.1 课程设计要求与任务 (2)1.2 课程设计思路 (2)1.3 课程设计需要配置的环境 (3)2 系统设计 (3)2.1 设计框图 (3)2.2 元件解析 (3)2.2.1 LCD12864芯片……………………………………………………………42.2.2 AT89C51芯片 (5)2.2.3 其他部件 (6)2.2.4 电路分析 (7)3 软件设计 (12)3.1 程序流程图 (12)3.2 程序代码 (12)4 系统的仿真与调试 (13)4.1 硬件调试 (13)4.2 软件调试 (14)4.3 软硬件调试 (14)5 总结 (14)附录1:程序代码附录2:12864LCD显示计算器键盘按键实验Proteus仿真图1 课程设计概述和要求1.1 课程设计任务与要求设计任务:利用AT89C51单片机结合12864LCD显示器设计计算器键盘按键。
设计要求1:本设计实现一个12864LCD显示12864LCD显示器设计计算器键盘按键2.利用AT89C51控制整个电路来实现. 显示12864LCD显示器设计计算器键盘按键,系统主要包括硬件和软件两部分。
重点就是各部分硬件的连接设计以及程序的编写。
本章讲述的就是系统硬件的设计,其中包括各模块的器件选择和电路设计。
将计算器按键上的信息传送至AT89C51主芯片之中,利用P2端口使之显示于12864LCD液晶显示屏上。
1.2 课程设计目的思路1、先把与题目有关的芯片资料找到,熟悉一下芯片资料2、把此程序的电路图看懂,了解一下它的实现原理,以及实现的功能。
3、分析一下此程序的各部分的功能,各零件的工作原理。
4、对程序进行调试,分析调试结果,观察并得出结论。
1.3 课程设计需要配置的环境1、一台主机,一台显示器2、Keil uVision3/Keil uVision4 应用程序软件3、ISIS 7 Professional 仿真软件4、老师交给的仿真电路图,及案例5、纸张,以及一些参考资料2 系统设计2.1.设计框图框图设计是为了能够从整体上把握系统的各个大的模块以及各个模块之间的联系。
12864点阵型液晶显示屏的基本原理与使用方法(很详细)
0
0
1
1
1
0
0
1
1
X
X
X
0
0
1
0
1
1
1
0
0
0
1
X
X
X
1
0 BUSY 0 ON/OFF RST 0
0
1
写数据
1
1
读数据
DB2 1 X X X 0
DB1 1 X X X 0
DB0 1/0
X X X 0
表 2:12864LCD 指令表
各功能指令分别介绍如下。
显示开/关指令
R/WRS 00
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 00111111/0
设置了页地址和列地址,就唯一确定了显示 RAM 中的一个单元,这样 MPU 就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/WRS 10
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
图 2 “你”字模图
12864 点阵型 LCD 简介
12864 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及 128×64 全点阵液晶显示器组成。 可完成图形显示,也可以显示 8×4 个(16×16 点阵)汉字。
管脚号 1 2 3 4
管脚名称 VSS VDD V0
D/I(RS)
LEVER 0
12864LCD 的指令系统及时序
该类液晶显示模块(即 KS0108B 及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指 令表如表 2 所示:
12864LCD液晶显示原理及使用方法
12864L CD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为L CD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864L CD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的L CD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864L CD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864L CD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD- 液晶显示器驱动电压4RS (D/I)H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/WH/LR/W=“H”,E=“H”数据被读到D B7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR6EN H/LR/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 7DB0 H/L 数据线8DB1 H/L数据线9DB2 H/L 数据线10DB3H/L 数据线11DB4H/L数据线12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15CS1H/L H:选择芯片(右半屏)信号16CS2H/L H:选择芯片(左半屏)信号17RETH/L复位信号,低电平复位18VEE -10VLCD驱动负电压19LED+- LED 背光板电源20LED-- LED 背光板电源12864L CD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。
12864液晶按键菜单程序
write_dat(dis3[i]);
}
write_cmd(0x98);
for(i=0;i<16;i++)
{
write_dat(dis4[i]);
}
}
if(count1==2) //按下选择按钮2次
uchar code dis1_[] = {"系统初始化. "};
uchar code dis2_[] = {"系统初始化.. "};
uchar code dis3_[] = {"系统初始化.. "};
uchar code dis4_[] = {"按选择键开始! "};
uchar code dis1_6[] = {" 摄像头 "};
uchar code dis2_6[] = {" "};
uchar code dis3_6[] = {" "};
uchar code dis4_6[] = {"保存拍照——返回 "};
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis3_[i]);
}
delay_1ms(500);
write_cmd(0x90);
for(i=0;i<16;i++)
{
write_dat(dis4_[i]);
}
write_cmd(0x30); //基本指令操作
delay_1ms(2);
write_cmd(0x0C); //显示开,关光标
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]);//时间之间的冒号。
LCD12864液晶显示器中文说明
一、液晶显示模块概述12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压);显示内容:128列× 64行显示颜色:黄绿显示角度:6:00钟直视LCD类型:STN与MCU接口:8位或4位并行/3位串行配置LED背光多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等二、外形尺寸1.外形尺寸图2.主要外形尺寸项目标准尺寸单位模块体积113.0×65.0×12.8mm定位尺寸105.0×55.0mm视域73.4×38.8 mm行列点阵数128×64dots点距离0.52×0.52 mm点大小0.48×0.48 mm二、模块引脚说明128X64 引脚说明引脚号引脚名称方向功能说明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)逻辑工作电压(VDD):4.5~5.5V电源地(GND):0V工作温度(Ta):0~60℃(常温) / -20~75℃(宽温)三、接口时序模块有并行和串行两种连接方法(时序如下):8位并行连接时序图MPU写资料到模块MPU从模块读出资料2、串行连接时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)四、用户指令集指令指令码说明执行时间(540KHZ)RSRWDB7DB6DB5DB4DB3DB2DB1DB清除显示0 0 0 0 0 0 0 0 0 1将DDRAM填满“20H”,并且设定DDRAM的地址计数器(AC)到“00H”4.6ms地址归位0 0 0 0 0 0 0 0 1 X设定DDRAM的地址计数器(AC)到“00H”,并且将游标移到开头原点位置;这个指令并不改变DDRAM的内容4.6ms进入点设定0 0 0 0 0 0 0 1 I/D S指定在资料的读取与写入时,设定游标移动方向及指定显示的移位72us显示状态开/关0 0 0 0 0 0 1 D C BD=1:整体显示ONC=1:游标ONB=1:游标位置ON72us游标或显示移位控制0 0 0 0 0 1S/CR/LX X设定游标的移动与显示的移位控制位元;这个指令并不改变DDRAM的内容72us功能设定0 0 0 0 1 DL XREX XDL=1 (必须设为1)RE=1:扩充指令集动作72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
点阵型12864
点阵型12864液晶的使用【实验目的】熟悉点阵型128*64液晶显示器的驱动电路及使用方法。
掌握用A T89S52来控制液晶显示器的方法掌握用扫描法识别矩阵按键的方法进一步熟悉EDA实验平台【实验器材】EDA实验箱、PC机、DB25-ISP下载线、USB转换线、USB-BLASTER编程器等软件:Quatus II 、Keil uVision2、ISPlay等。
【实验原理】液晶作为显示器件广泛应用于各种电子仪器、便携设备上,点阵液晶可以方便的显示各种字符、图片。
WGM12864H液晶显示模块采用三星公司的KS0107液晶控制器,能够显示128*64像素图形或4行16*16中文字符。
一.系统硬件电路1.WGM12864H液晶模块2. WGM12864H 操作指令(1) 显示开关控制。
此命令用于控制液晶显示器开关。
D=1:显示开。
显示器可以进行各种显示操作。
D=0:显示关。
不能对显示器进行各种显示操作。
开显示时,液晶模块DDRAM 的内容显示在LCD 屏幕上,控制显示器的开关并不影响DDRAMA 中的数据和内部状态。
(2) 设置显示起始行。
WGM12864H 液晶模块共有64行,由Z 地址计数器进行控制。
Z 地址计数器是一个六位计数器A5:A0,此计数器具有循环计数功能,它是用于行扫描同步,当一行扫描完成时此计数器自动加一,指向下一行扫描数据,RST 复位后Z 计数器为0。
起始行可以是64行中的任一行,如设置A5:A0为62,则起始行于DDRAM 中的行对应关系如下:(3) 设置页地址。
所示:X 地址计数器为DDRAM 的页指针。
所谓页地址就是DDRAM 的行地址,8行为页。
WGM 液晶显示器共64行,即8页,A2:A0表示0~7页。
读写数据对页地址没有影响,页地址由本指令或RST 信号改变,复位后页地址为0。
(4) 设置列地址。
编址为0-63。
此指令将A5:A0送入Y地址计数器,作为DDRAM的Y地址指针。
按键检测12864LCD显示汇编代码
r16 .set 280hr17 .set 282hr18 .set 284hr21 .set 286hr22 .set 288hr23 .set 28ahr24 .set 28chr25 .set 28ehr26 .set 290hr28 .set 27ehkeydata .set 292hrowdata .set 294hscandata .set 296hkeybuffer .set 298hdp_user .set 5hkeydata1 .set 29ahlcdtab .set 29chlcddata .set 29ehpbdatdir .set 709ahdp_pf2 .set 0e1hpadatdir .set 7098hpcdatdir .set 709chmcra .set 7090hmcrb .set 7092hmcrc .set 7094hpedatdir .set 7095hpfdatdir .set 7096h.datatab00:;-- 文字: E --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,007H,006H,004H,004H,004H,00 4H,004H,004H,004H,007H,007H,004H,004H ,000H.word000H,0C0H,080H,000H,01FH,007H,002H,00 2H,002H,002H,002H,0FFH,0FFH,000H,000H ,000H.word000H,006H,001H,000H,0C0H,000H,000H,00 0H,000H,000H,000H,0FFH,0FFH,000H,000H ,000H .word000H,000H,0C0H,0C0H,040H,040H,040H,04 0H,040H,040H,040H,0C0H,0C0H,040H,040H ,000Htab01:;-- 文字: 0 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,001H,003H,006H,004H,00 4H,004H,006H,003H,001H,000H,000H,000H ,000H.word000H,01FH,0FFH,0C0H,000H,000H,000H,00 0H,000H,000H,000H,0E0H,0FFH,01FH,000H ,000H.word000H,0F0H,0FEH,007H,001H,000H,000H,00 0H,000H,000H,001H,00FH,0FEH,0F0H,000H ,000H.word000H,000H,000H,000H,080H,0C0H,040H,04 0H,040H,0C0H,080H,000H,000H,000H,000H ,000Htab02:;-- 文字: F --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,007H,006H,006H,004H,004H,004H,00 4H,004H,004H,004H,007H,007H,004H,004H ,000H.word0C0H,080H,000H,01FH,007H,002H,002H,00 2H,002H,002H,002H,0FFH,0FFH,000H,000H ,000H.word000H,000H,000H,0C0H,000H,000H,000H,00 0H,000H,000H,000H,0FFH,0FFH,000H,000H ,000H.word000H,000H,000H,000H,000H,000H,000H,00 0H,000H,040H,040H,0C0H,0C0H,040H,040H ,000Htab03:;-- 文字: D --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,001H,003H,002H,006H,00 4H,004H,004H,004H,007H,007H,004H,004H ,000H.word000H,01FH,0FFH,0E0H,000H,000H,000H,00 0H,000H,000H,000H,0FFH,0FFH,000H,000H ,000H.word000H,0F0H,0FCH,00FH,001H,000H,000H,00 0H,000H,000H,000H,0FFH,0FFH,000H,000H ,000H.word000H,000H,000H,000H,080H,080H,0C0H,04 0H,040H,040H,040H,0C0H,0C0H,040H,040H ,000Htab04:;-- 文字: 7 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,006H,007H,006H,006H,006H,00 6H,006H,006H,006H,007H,007H,001H,000H ,000H.word000H,000H,000H,000H,0C0H,030H,00CH,00 3H,000H,000H,000H,000H,080H,0E0H,000H ,000H.word000H,000H,000H,000H,000H,000H,000H,08 0H,07FH,00FH,000H,000H,000H,000H,000H ,000H.word000H,000H,000H,000H,000H,000H,000H,00 0H,0C0H,0C0H,000H,000H,000H,000H,000H ,000Htab05:;-- 文字: 8 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 -- .word000H,000H,000H,001H,003H,006H,004H,00 4H,004H,004H,006H,003H,001H,000H,000H ,000H.word000H,000H,0F0H,0F8H,00CH,003H,003H,00 3H,003H,006H,00FH,01DH,0F8H,0F0H,000H ,000H.word000H,000H,03EH,07FH,0E1H,0C0H,080H,00 0H,000H,000H,000H,080H,0C1H,07FH,03EH ,000H.word000H,000H,000H,000H,080H,080H,040H,04 0H,040H,040H,040H,080H,080H,000H,000H ,000Htab06:;-- 文字: 9 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,000H,001H,002H,004H,00 4H,004H,004H,004H,002H,003H,001H,000H ,000H.word000H,000H,03FH,0FFH,083H,001H,000H,00 0H,000H,000H,000H,000H,081H,0FFH,07EH ,000H.word000H,000H,0E0H,0FCH,01EH,083H,081H,04 0H,040H,040H,040H,0C0H,083H,003H,000H ,000H.word000H,000H,000H,000H,000H,000H,080H,0C 0H,040H,040H,040H,040H,080H,080H,000H ,000Htab07:;-- 文字: C --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,007H,003H,002H,004H,004H,00 4H,004H,006H,002H,001H,000H,000H,000H.word000H,060H,080H,000H,000H,000H,000H,00 0H,000H,000H,000H,080H,0E0H,07FH,00FH ,000H.word000H,00CH,003H,001H,000H,000H,000H,00 0H,000H,000H,000H,001H,00FH,0FEH,0F0H ,000H.word000H,000H,000H,080H,080H,040H,040H,04 0H,040H,040H,080H,080H,000H,000H,000H ,000Htab08:;-- 文字: 4 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,000H,007H,007H,003H,00 0H,000H,000H,000H,000H,000H,000H,000H ,000H.word000H,000H,000H,000H,0FFH,0FFH,0FFH,08 0H,060H,018H,00CH,003H,000H,000H,000H ,000H.word000H,010H,010H,010H,0FFH,0FFH,0FFH,01 0H,010H,010H,010H,010H,090H,070H,010H ,000H.word000H,020H,020H,020H,0E0H,0E0H,0E0H,02 0H,020H,020H,000H,000H,000H,000H,000H ,000Htab09:;-- 文字: 5 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,006H,006H,006H,006H,006H,00 6H,006H,006H,006H,007H,000H,000H,000H ,000H.word000H,000H,000H,003H,006H,00CH,008H,00 8H,008H,008H,004H,0C2H,03FH,000H,000H .word000H,000H,0FCH,0FFH,003H,000H,000H,00 0H,000H,000H,000H,000H,00CH,00FH,000H ,000H.word000H,000H,000H,000H,080H,080H,040H,04 0H,040H,040H,040H,040H,080H,000H,000H ,000Htab10:;-- 文字: 6 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,001H,003H,004H,004H,004H,00 4H,006H,002H,001H,000H,000H,000H,000H ,000H.word000H,000H,081H,083H,006H,004H,004H,00 4H,004H,002H,003H,0E1H,07FH,00FH,000H ,000H.word000H,0FCH,0FFH,001H,000H,000H,000H,00 0H,000H,000H,001H,087H,0FEH,0F8H,000H ,000H.word000H,000H,000H,080H,080H,040H,040H,04 0H,040H,0C0H,080H,000H,000H,000H,000H ,000Htab11:;-- 文字: B --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,001H,003H,003H,006H,004H,00 4H,004H,004H,004H,007H,007H,004H,004H ,000H.word000H,000H,0F0H,0F9H,00DH,006H,002H,00 2H,002H,002H,002H,0FFH,0FFH,000H,000H ,000H.word000H,03EH,0FFH,081H,000H,000H,000H,00 0H,000H,000H,000H,0FFH,0FFH,000H,000H.word000H,000H,000H,080H,0C0H,040H,040H,04 0H,040H,040H,040H,0C0H,0C0H,040H,040H ,000Htab12:;-- 文字: 1 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,000H,000H,000H,000H,00 7H,003H,001H,001H,001H,001H,000H,000H ,000H.word000H,000H,000H,000H,000H,000H,000H,0F FH,0FFH,000H,000H,000H,000H,000H,000H ,000H.word000H,000H,000H,000H,000H,000H,000H,0F FH,0FFH,000H,000H,000H,000H,000H,000H ,000H.word000H,000H,000H,040H,040H,040H,0C0H,0C 0H,0C0H,0C0H,040H,040H,040H,000H,000H ,000Htab13:;-- 文字: 2 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,003H,003H,006H,004H,00 4H,004H,004H,004H,002H,001H,000H,000H ,000H.word000H,000H,0F8H,0FCH,006H,001H,000H,00 0H,000H,000H,000H,000H,030H,0F0H,000H ,000H.word000H,000H,00FH,001H,000H,000H,080H,04 0H,020H,010H,008H,004H,002H,001H,000H ,000H.word000H,000H,000H,0C0H,0C0H,0C0H,0C0H,0C 0H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,000H tab14:;-- 文字: 3 --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,000H,003H,003H,006H,00 4H,004H,004H,004H,002H,003H,001H,000H ,000H.word000H,000H,000H,0F0H,0F9H,00DH,007H,00 2H,002H,002H,000H,000H,0E0H,0E0H,000H ,000H.word000H,000H,03CH,0FFH,081H,000H,000H,00 0H,000H,000H,000H,000H,00FH,00FH,000H ,000H.word000H,000H,000H,000H,080H,080H,040H,04 0H,040H,040H,040H,080H,080H,000H,000H ,000Htab15:;-- 文字: A --;-- 宋体24; 此字体下对应的点阵为:宽x高=16x32 --.word000H,000H,000H,000H,000H,000H,000H,00 FH,007H,007H,000H,000H,000H,000H,000H ,000H.word000H,000H,000H,000H,000H,007H,07FH,0F 8H,000H,0C0H,07CH,007H,000H,000H,000H ,000H.word000H,000H,000H,003H,07FH,0FCH,0C0H,04 0H,040H,040H,040H,0C0H,07CH,007H,000H ,000H.word000H,040H,040H,0C0H,0C0H,040H,000H,00 0H,000H,000H,000H,040H,040H,0C0H,0C0H ,040H.include "240xa.inc".def _c_int0.text_c_int0setc INTMclrc SXMclrc OVMclrc CNFldp #0e0hsplk #0e8h,WDCRldp #0Splk #0h,IMRsplk #0ffffh,IFRldp #dp_usersplk #0FFFH,r22out r22,WSGRldp #dp_pf2lacl #00hsacl mcralacl mcrblacl #0ff00hsacl mcrblacl #000hsacl mcrcnopldp #5lacl #0sacl lcdtabsacl keydatalong1:lacl #0ff00h ldp #0e1hsacl PADATDIRrpt #20 noplacl #0ff00hsacl PCDATDIR rpt #20noplacl #0ff00h sacl pedatdirrpt #20nop ldp #dp_usersplk #3eh,r16call write_ins0rpt #100 noprpt #100 noprpt #100nop ldp #dp_usersplk #3fh,r16call write_ins0 call write_ins1rpt #100nop rpt #100nopl1: ldp #dp_user splk #0c0h,r16call write_ins0noplong2:ldp #dp_user splk #0bfh,r16call write_ins0ldp #dp_usersplk #40h,r16call write_ins0ldp #dp_user call display_cs0call display_cs1long100: LAR AR4,#07Hcall display_cs0 SAR AR4,r28scan_again:call scan_keylacl keydatabcnd scan_again,eqlacl #0ff00hldp #0e1hsacl PADATDIRrpt #20noplacl #0ff00hsacl PCDATDIR noplacl #0ff00hsacl pedatdirlacl #0hldp #5hsacl lcdtablacc #0mar *,ar5ldp #5hlacl keydatasub #01hsacl keydatalar ar5,keydatalar ar0,#00hlacl #00lay1:LACL lcdtabadd #6sacl lcdtabsbrk #1hnopcmpr 00bcnd lay1,NTCsacl lcdtablong35:ldp #dp_usersplk #10h,r22ldp #dp_usersplk #0beh,r23ldp #dp_userlt r28mpy #16SPL r24ldp #dp_usersplk #0bbh,r25lacc lcdtabadd #tab00sacl lcdtabcall display4 ldp #dp_user LAR AR4,r28mar *,ar4long4:BANZ long444,*-b long100long444:SAR AR4,r28call delaylong445:call scan_key lacl keydatabcnd scan_again,eqcall delayb long445scan_key:lacl #0ff00hldp #0e1hsacl pfdatdirrpt #20noplacl #000hsacl pcdatdirrpt #20noplacl #0ff00hsacl pedatdirldp #dp_userlacl #00hsacl keydatalacl #04hSaclrowdata Lacl #0fff7hsacl scandataLDP #0e1hmmm:lacl #0ff00hsacl pfdatdirnoplacl pcdatdirnopldp #5hsacl keybufferand #0ffhor #1ehxor #0ffhbcnd scanout ,eqscan:ldp #5hlacl scandataldp #0e1hsacl pfdatdirnoplacl pcdatdirnopand #0ffhor #1ehxor #0ffhbcnd scannext,eqldp #dp_userbit keybuffer,15bcnd key1,tcldp #5hlacl keydataadd #01hsacl keydatab scanoutkey1: bit keybuffer,10bcnd key2,tclacl keydataadd #02hsacl keydatab scanoutkey2: bit keybuffer,9bcnd key3,tclacl keydataadd #03hsacl keydatanopb scanoutkey3: bit keybuffer,8bcnd scanout,tclacl keydataadd #04hsacl keydatab scanout scannext:ldp #dp_userlacl scandatasfrldp #5hsacl scandatalacl keydataadd #04hsacl keydatalacl rowdatasub #01hsacl rowdatabcnd scan,neq scanout: retdisplay4:ldp #dp_userlacl r22sacl r21ldp #dp_userpage_cycle4:ldp #dp_userlacl r24sacl r16call write_ins0ldp #dp_userLaclr23sacl r16call write_ins0ldp #dp_userlacl #0c0hsacl r16call write_ins0arrange_cycle4:ldp #dp_userlacl lcdtabldp #dp_usertblr lcddatalacl lcddataldp #dp_usersacl r16call write_data0ldp #dp_userlacl lcdtabadd #1sacl lcdtabldp #dp_userlacl r22sub #1sacl r22lar ar0,#0ldp #dp_userlar ar6,r22mar *,ar6cmpr 00bcnd arrange_cycle4,NTC LDP #dp_userlacl r21sacl r22ldp #dp_userlar ar0,r23ldp #dp_userlar ar7,r25lacl r23sub #1hldp #dp_usersacl r23mar *,ar7cmpr 00bcnd page_cycle4,NTCretdisplay5:ldp #dp_userlacl r22sacl r21ldp #dp_userpage_cycle5:ldp #dp_userlacl r24sacl r16call write_ins1ldp #dp_userLaclr23sacl r16call write_ins1ldp #dp_userlacl #0c0h sacl r16call write_ins1arrange_cycle5:ldp #dp_userlacl lcdtabldp #dp_usertblr lcddatalacl lcddataldp #dp_usersacl r16call write_data1ldp #dp_userlacl lcdtabadd #1sacl lcdtab ldp #dp_userlacl r22sub #1sacl r22lar ar0,#0ldp #dp_userlar ar6,r22mar *,ar6cmpr 00bcnd arrange_cycle5,NTC LDP #dp_userlacl r21sacl r22ldp #dp_userlar ar0,r23ldp #dp_userlar ar7,r25lacl r23sub #1hldp #dp_usersacl r23mar *,ar7cmpr 00bcnd page_cycle5,NTCret write_ins1:ldp #dp_pf2lacl #03fchsacl padatdirnoplacl #1c08hsacl pcdatdirrpt #20nopldp #0e1hlacl #0301hsacl padatdirnopldp #dp_userlacl r16or #0ff00hldp #0e1hsacl pedatdirrpt #50nopldp #0e1hlacl #03fchsacl padatdirrpt #5nopldp #0e1h lacl #0302hsacl padatdirldp #dp_pf2lacl #1c0chsacl pcdatdirldp #dp_userrpt #5nopretwrite_ins0:ldp #dp_pf2lacl #03fchsacl padatdirnoplacl #1c04hsacl pcdatdirrpt #20nopldp #0e1h lacl #0301hsacl padatdir nopldp #dp_userlacl r16or #0ff00hldp #0e1hsacl pedatdirrpt #50nopldp #0e1hlacl #03fchsacl padatdirrpt #5nopldp #0e1h lacl #0302hsacl padatdir ldp #dp_pf2lacl #1c0chsacl pcdatdirldp #dp_userrpt #5nopretwrite_data1:ldp #0e1hlacl #0ff00hsacl padatdirnopldp #0e1hlacl #1c18hsacl pcdatdirrpt #10nopldp #0e1h lacl #0ff01hsacl padatdirnopldp #dp_userlacl r16or #0ff00hldp #0e1hsacl pedatdirrpt #5nopldp #0e1hlacl #0ff00hsacl padatdirrpt #5nopldp #0e1hlacl #0ff02hSaclpadatdir ldp #dp_pf2lacl #1c0chsacl pcdatdirldp #dp_userrpt #5nopretwrite_data0:ldp #0e1hlacl #0ff00hsacl padatdirnopldp #0e1hlacl #1c14hsacl pcdatdirrpt #10nopldp #0e1hlacl #0ff01hsacl padatdirnopldp #dp_userlacl r16or #0ff00hldp #0e1hsacl pedatdir rpt #5nopldp #0e1hlacl #0ff00hsacl padatdirrpt #5nopldp #0e1h lacl #0ff02hsacl padatdirldp #dp_pf2lacl #1c0chsacl pcdatdirldp #dp_userrpt #5nopretdisplay_cs0:ldp #5hsplk #0c0h,r16call write_ins0ldp #5hsplk #0b8h,r17 arrange00:ldp #5hsplk #040h,r18 ldp #5hlacl r17sacl r16call write_ins0ldp #5hlacl r18sacl r16call write_ins0arrange01:ldp #5hsplk #00h,r16call write_data0ldp #5hlacl r18Add#1hsacl r18ldp #5hmar *,ar6lar ar6,r18lar ar0,#128cmpr 01Bcndarrange01,TCldp #5hlacl r17add #1hsacl r17call delaylar ar5,r17lar ar0,#0c0hmar *,ar5cmpr 01bcndarrange00,tcretdisplay_cs1:ldp #5hsplk #0c0h,r16call write_ins1ldp #5hsplk #0b8h,r17 arrange10:ldp #5hsplk#040h,r18ldp #5hlacl r17Saclr16call write_ins1ldp #5hlaclr18sacl r16call write_ins1arrange11:ldp #5hsplk #00h,r16call write_data1ldp #5hlacl r18add #1h ;sacl r18ldp #5hmar *,ar6ar ar6,r18lar ar0,#128cmpr 01bcnd arrange11,TCldp #5hlacl r17add #1hsacl r17call delayar ar5,r17lar ar0,#0c0hmar *,ar5cmpr 01bcndarrange10,tc retdelay:mar *,ar3lar ar3,#0fffhlar ar0,#00hdelay1:sbrk #1hnopcmpr 00bcnd delay1,NTCretend。
12864显示文字+图像
引用12864液晶原理分析3他山之石2010-07-21 20:52:05 阅读7 评论0 字号:大中小小峰的12864液晶原理分析3一、ST7920控制IC的LCD12864实现反白显示从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。
但是ST7920 控制器的128×64 点阵液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接第二行。
所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,第三行必然也反白显示;第二行反白,第四行也必然反白。
其实还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。
其理论支持在于:在ST7920中,字符显示的DDRAM和图形的GDRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。
具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。
假如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。
所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图!这样一来可以实现任何地方、任意大小的反白显示,反而比原指令中的单行反白的功能更好更强大。
二、对于整屏既有图象又有文本,则可以用两种方式实现:1、首先文本DDRAM写入要写的字符,其余全部空格(即0X00),然后再在没有字符的地方(即非点亮的晶格中,0X00)绘入图象。
DDRAM与GDRAM异或后就可以整屏实现图象与文本。
参见程序实例1。
12864液晶屏学习使用手册
12864液晶屏学习手册1.液晶模组概览12864A-1汉字图形点阵液晶显示模块,可显示汉字和图形,内置8192个汉字(16X16点矩阵,16 * 8 = 128,16 * 4 = 64,一行,4行只能写8个汉字;),128个字符(8X16点矩阵)和64X256点矩阵显示RAM(GDRAM)。
主要技术参数和显示特性:电源:VDD 3.3V〜+5伏(内置升压电路,无负压);显示内容:128列X第64行(128分)显示颜色:黄绿色显示角度:直接看6:00LCD类型:STN与MCU的接口:8位或4位并行/ 3位串行配置LED背光多种软件功能:光标显示,屏幕移位,自定义字符,睡眠模式等2.尺寸1.尺寸2。
主要尺寸项目标准尺寸单元模子片身体产品113.0X65.0X12.8毫米2.模块引脚说明逻辑工作电压(VDD):4.5〜5.5V电源地(GND):0V穿孔温度(Ta):0〜60°C(常温)/ -20〜75°C(宽温度)三,接口定时模块有两种连接方式:并行和串行(时间如下):8位并行连接时序图MPU将数据写入模块MPU从模块读取数据2,串行连接时序图串行数据传输以三个字节完成:第一个字节:串口控制—格式11111ABCA是数据传输方向控制:H表示从LCD到MCU的数据,L表示从MCU到LCD的数据B是数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三个字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T =25℃VDD = 4.5V)备注:1,在模块接受指令之前,微处理器必须首先确认模块不忙,即读取高炉签到时间高炉需要0接受新说明之前;如果你不这样做’t在发送命令之前检查高炉商标,(通常在输入每日命令之前添加延迟)那么上一条指令和该指令之间必须有很长的延迟,也就是等待上一条命令的执行完成,有关命令的执行时间,请参阅命令表中的各个命令描述。
J12864 液晶模块使用说明书
技术QQ:1035715441非常感谢您使用我们的产品,我们竭诚为您提供服务J12864中文字库注释:(1)模组背部自带3*3 10K硬封可调电位器VR1,可以调到理想对比度(默认5V出厂已经调试好,也可自行再次调节,电位器为微调,请尽量小心调试)(2)LED背光极性可调,JP4为液晶背光正负反接处(3)模组自带原装三星正品防静电电容,抗干扰性更强C6 C7 C8(4)串并口可通过两种方式调节1种PSB接口控制2 种JP2短路到P为并口短路到S为串口(5)自改3.3V可通过JP3调节,默认接+级为5V,接-为3.3V,然后C4 C5加极性电容即可型号为106A或者104A,背光电阻33欧改成3.3欧技术QQ:1035715441一、液晶显示模块概述J12864中文汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压);显示内容:128列× 64行显示颜色:黄绿/蓝屏显示角度:6:00钟直视LCD类型:STN与MCU接口:8位或4位并行/3位串行配置LED背光多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等二、外形尺寸外观尺寸:93×70×12.5mm 视域尺寸:73×39mm外形尺寸图外形尺寸技术QQ:1035715441ITEM NOMINAL DIMEN UNIT模块体积93×70×12.5 mm视域73.0×39.0 mm行列点阵数128×64 dots点距离0.52×0.52 mm点大小0.48×0.48 mm二、模块引脚说明128X64HZ 引脚说明引脚号引脚名称方向功能说明1 GND - 模块的电源地2 VCC - 模块的电源正端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 /RST H/L 复位低电平有效18 VOUT 倍压输出脚(VDD=+3.3V有效)19 LED_A (LED+5V)背光源正极20 LED_K (LED-OV)背光源负极逻辑工作电压(VDD):4.5~5.5V电源地(GND):0V工作温度(Ta):-10℃~60℃(常温) / -20℃~70℃(宽温)技术QQ:1035715441三、接口时序模块有并行和串行两种连接方法(时序如下):8位并行连接时序图MPU写资料到模块MPU从模块读出资料2、串行连接时序图技术QQ:1035715441串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCDB为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD串行接口时序参数:(测试条件:T=25℃VDD=4.5V)技术QQ :1035715441四、用户指令集 1、指令表1:(RE=0:基本指令集)指令码指令R SR W DB 7DB 6DB 5DB 4DB 3DB 2DB 1DB 0说明执行时间(540KHZ ) 清除显示0 0 0 0 0 0 0 0 0 1将DDRAM 填满“20H ”,并且设定DDRAM 的地址计数器(AC )到“00H ”4.6ms地址归位0 0 0 0 0 0 0 0 1 X设定DDRAM 的地址计数器(AC )到“00H ”,并且将游标移到开头原点位置;这个指令并不改变DDRAM 的内容 4.6ms进入点设定 00 0 0 0 0 0 1 I/D S指定在资料的读取与写入时,设定游标移动方向及指定显示的移位72us 显示状态 开/关 0 0 0 0 0 0 1 D C B D=1:整体显示ON C=1:游标ON B=1:游标位置ON72us游标或01S/R/XX设定游标的移动与显示的移位72us技术QQ:1035715441显示移位控制C L 控制位元;这个指令并不改变DDRAM的内容功能设定0 0 0 0 1 DL XREX XDL=1 (必须设为1)RE=1:扩充指令集动作RE=0:基本指令集动作72us设定CGRA M地址0 0 0 1AC5AC4AC3AC2AC1AC设定CGRAM地址到地址计数器(AC)72us设定DDRA M地址0 0 1AC6AC5AC4AC3AC2AC1AC设定DDRAM地址到地址计数器(AC)72us读取忙碌标志(BF)和地址0 1 BFAC6AC5AC4AC3AC2AC1AC读取忙碌标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值0us写资料到RAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0写入资料到内部的RAM(DDRAM/CGRAM/IRAM/GDRAM)72us读出RAM 的值1 1 D7 D6 D5 D4 D3 D2 D1 D0从内部RAM读取资料(DDRAM/CGRAM/IRAM/GDRAM)72us指令表—2:(RE=1:扩充指令集)指令码指令RS RWDB7DB6DB5DB4DB3DB2DB1DB说明执行时间(540KHZ)待命模式0 0 0 0 0 0 0 0 0 1将DDRAM填满“20H”,并且设定DDRAM的地址计数器(AC)到“00H”72us卷动地址或IRAM地址选择0 0 0 0 0 0 0 0 1 SRSR=1:允许输入垂直卷动地址SR=0:允许输入IRAM地址72us反白选择0 0 0 0 0 0 0 1 R1 R0选择4行中的任一行作反白显示,并可决定反白与否72us技术QQ:1035715441睡眠模式0 0 0 0 0 0 1 SL X XSL=1:脱离睡眠模式SL=0:进入睡眠模式72us扩充功能设定0 0 0 0 1 1 X1REG 0RE=1:扩充指令集动作RE=0:基本指令集动作G=1 :绘图显示ONG=0 :绘图显示OFF72us设定IRAM地址或卷动地址0 0 0 1AC5AC4AC3AC2AC1AC0SR=1:AC5—AC0为垂直卷动地址SR=0:AC3—AC0为ICON IRAM地址72us设定绘图RAM 地址0 0 1AC6AC5AC4AC3AC2AC1AC0设定CGRAM地址到地址计数器(AC)72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。
12864液晶按键显示
#include<msp430x14x.h>#include "Keypad.h" //键盘扫描#include "Keypad.c"#include "HB12864.h"#include "Uart.H"#define uchar unsigned char#define uint unsigned int#define ulong unsigned longulong temp; //矩阵键盘中间变量//**************************引用外部变量的声明************************** extern unsigned char key_val;extern unsigned char key_Flag;//***************************主函数**************************************void main( void ){WDTCTL = WDTPW + WDTHOLD;//关闭看门狗Uart_Init();//液晶初始化_EINT();Screen_Con(LIGHT_SET);//开背光m1: Screen_Con(SCREEN_CLA);//清屏uchar yi=1; //检测输入的状态//Screen_Cont(CUR_SET,0X00);//关光标Display_StrChar(STR_CHAR,0,4,"液晶键盘测试");//第一排的显示部分Display_StrChar(STR_CHAR,2,0,"键盘输入:");//第三排的显示部分Screen_Cont(CUR_SET,0X0A);//设置光标长度Display_Dot(CUR_LOC_SET,47,72);//设置光标位子Init_Keypad();while(1){Key_Event();if(key_Flag==1){ key_Flag=0;if(yi==1){temp= key_val;//QSPL=temp*10000;Display_shuzi(STR_NUM_6_12,36,72,0x30+temp); //第一位的输入值}if(yi==2){temp = key_val;if (temp==67) //OK键break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,78,0x30+temp);}}if(yi==3){temp = key_val;if (temp==67) //okbreak;if(temp==79) //清除键{ yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{//QSPL=QSPL+temp*100;Display_shuzi(STR_NUM_6_12,36,84,0x30+temp);}}if(yi==4){temp = key_val;if (temp==67)break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,90,0x30+temp);}}if(yi==5){temp = key_val;if (temp==67)break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,96,0x30+temp);}}if(yi==6){temp = key_val;if (temp==67)break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,102,0x30+temp);}}if(yi==7){temp = key_val;if (temp==67)break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,108,0x30+temp);}}if(yi==8){temp = key_val;if (temp==67)break;if(temp==79) //清除键{yi=0; //归位Display_StrChar(STR_CHAR,2,9," "); //清零Display_Dot(CUR_LOC_SET,47,72);//设置光标位子}else{Display_shuzi(STR_NUM_6_12,36,114,0x30+temp);yi++;break;}}yi++;//P2IFG = 0;}}while(1){Key_Event();if(key_Flag==1){ key_Flag=0;temp=key_val;if(temp==25)goto m1;}}}。
12864液晶图像显示图文教程——最全版
uchar i,j; write_cmd(0x34);//扩充指令集动作 write_cmd(0x34);//关绘图显示功能 for(i=0;i<32;i++)//上半屏 { write_cmd(0x80+i);//垂直地址 write_cmd(0x80); //水平地址,水平地址自动加 1 for(j=0;j<16;j++) { write_data(0x00); } } for(i=0;i<32;i++)//下半屏 { write_cmd(0x88+i);//垂直地址 write_cmd(0x88);//水平地址,水平地址自动加 1 for(j=0;j<16;j++) { write_data(0x00); } } write_cmd(0x36);//开绘图显示 write_cmd(0x30);//回到基本指令集 } //函数名称:display_image(uchar *p) //函数功能:显示图片 void display_image(uchar *p) { uchar i,j; write_cmd(0x34);//扩充指令集动作 write_cmd(0x34);//关绘图显示功能 /*上半屏显示设置*/ for(i=0;i<32;i++)//上半屏 { write_cmd(0x80+i);//垂直地址 write_cmd(0x80); //水平地址,水平地址自动加 1
12864的液晶显示程序(无字库)
12864的液晶显示程序(无字库)12864.h#ifndef __12864_H__#define __12864_H__#include#include/***************************************利用I/O口模拟点阵液晶所需时序点阵液晶控制端口定义,需根据硬件适当改变****************************************/sbit LCD_RS = P2^0;//控制端口定义sbit LCD_RW = P2^1;sbit LCD_E = P2^2;sbit LCD_CSA = P2^3;//H选通,即高电平有效sbit LCD_CSB = P2^4;#define LCD_Data P0//LCD数据端口8位#define R 1#define L 2/*****************************************函数声明*****************************************/void ReadStatusLCD(unsigned char select);//从LCD读出忙标志位unsigned char ReadDataLCD(unsigned char select);//从LCD 读出数据void WriteDataLCD(unsigned char WDLCD,unsigned char select);//向LED写入数据void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select);//向LCD写入命令void LcdReset(void) ;//初始化函数,完成液晶模块的初始设置void clear_LCD(unsigned char select);//清屏函数void Clr_All_Lcd(void);//全清屏函数void set_XY(unsigned char Column,unsigned char Page);//设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址void xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW);//向指定行列写数据void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte );//显示点void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] );//显示16×16点阵的编码void WhiteWord_Com(unsigned char Column,unsigned char Page,unsigned char C_num,unsigned char V_num, unsigned char * puts );//通用的显示函数void Drawing_dot(unsigned char x,unsigned char y);void Drawing_line_vertical(unsigned x);#endif12864.c/****************************************************LCD12864点阵液晶屏,通过I/O口直接控制,采用模拟时序控制****************************************************/#include"12864.h"#include/*********************************************************** 功能:从LCD读取状态位变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏***********************************************************/ void ReadStatusLCD(unsigned char select){switch(select){case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右default: break;}LCD_Data = 0xff;//置位输入口,已实现输入LCD_RS=0;LCD_RW=1;LCD_E=1;//高电平读取数据//_nop_(); //若晶振速度高,可在此作延时处理while(LCD_Data&0x80);//最高位为忙标志,检测忙信号状态LCD_E=0;//_nop_(); //若晶振速度高,可在此作延时处理}/*********************************************************** 功能:从LCD读取数据变量:select用于选择LCD屏的左右,1选择左屏,2选择右屏***********************************************************/ unsigned char ReadDataLCD(unsigned char select){unsigned char dataR;LCD_Data = 0xff;//置位输入口,已实现输入switch(select){case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右default: break;}LCD_RW=1;LCD_RS=1;LCD_E = 1;// 操作允许脉冲信号,高电平读出//_nop_(); //若晶振速度高,可在此作延时处理dataR = LCD_Data;LCD_E= 0;return dataR;}/***********************************************************功能:向LCD写入数据参数:WDLCD待写入的字符数据select用于选择LCD屏的左右,1选择左屏,2选择右屏***********************************************************/void WriteDataLCD(unsigned char WDLCD,unsigned char select){switch(select){case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右default: break;}ReadStatusLCD(select);//检测忙标志LCD_RS = 1;LCD_RW = 0;LCD_Data = WDLCD;LCD_E = 1;//_nop_(); //若晶振速度高,可在此作延时处理LCD_E = 0; //下降沿写入数据//_nop_(); //若晶振速度高,可在此作延时处理}/***********************************************************功能:向LCD写入命令参数:WDLCD待写入的字符数据BusyC是否要检查忙标志位选择标志,1为进行,0为不检测select用于选择LCD屏的左右,1选择左屏,2选择右屏***********************************************************/void WriteCommandLCD(unsigned char WCLCD , unsigned char BusyC,unsigned char select) {if(BusyC) ReadStatusLCD(select);//根据需要检测忙switch(select){case 1:{LCD_CSA=1;LCD_CSB=0;break;}//左case 2:{LCD_CSA=0;LCD_CSB=1;break;}//右default: break;}LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;//_nop_(); //若晶振速度高,可在此作延时处理LCD_E = 0;}/************************************************************** **************** 功能:清显示RAM区(清屏)参数:select为驱动控制器选择1为左2为右*************************************************************** **************** */void clear_LCD(unsigned char select){unsigned char i,j;for(i=0;i<8;i++){ //8页,换页清零WriteCommandLCD( 0xb8|i,1 ,select);//页面地址设置,并分别写入左右模块中WriteCommandLCD( 0x40,1 ,select);//列地址设置,设置为0列,并分别写入左右三个模块中for(j=0;j<64;j++){ //页内清零WriteDataLCD( 0 ,select);}}}/************************************************************** *************** 功能:清LCD左右屏*************************************************************** **************/ void Clr_All_Lcd(void){clear_LCD(1);clear_LCD(2);}/************************************************************** **************** 功能:LCD初始化,分为左,右模块初始化参数:select为驱动控制器选择1为左2为右*************************************************************** **************** */void LcdReset(void){unsigned char i;for(i=0;i<5;i++){WriteCommandLCD( 0xc0,0 ,R);//设置显示起始行为第一行,并分别写入左右模块中,不检测忙标志WriteCommandLCD( 0xc0,0 ,L);//_nop_(); //若晶振速度高,可在此作延时处理}WriteCommandLCD( 0xc0,1 ,R);//设置显示起始行为第一行,并分别写入左右模块中,检测忙标志WriteCommandLCD( 0xc0,1 ,L);WriteCommandLCD( 0x3f,1 ,R);//开显示设置,并分别写入左右模块中WriteCommandLCD( 0x3f,1 ,L);clear_LCD(R);//清左屏clear_LCD(L);//清右屏}/************************************************************** **************** 功能:设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址参数:Column表示列号,Page表示页号*************************************************************** **************** */void set_XY(unsigned char Column,unsigned char Page){unsigned char x,y;unsigned char select;switch (Column&0x40) //完成左右屏的判断,根据列号完成区分,<64为左屏,>=64为右屏{case 0x00: {select = 1;ReadStatusLCD(select);break;}/*为左区*/case 0x40: {select = 2;ReadStatusLCD(select);break;}/*为右区*/}x = Column&0x3F|0x40; /* col.and.0x3f.or.Set Y Address*/ y = Page&0x07|0xB8; /* row.and.0x07.or.set Page */WriteCommandLCD( y,1 ,select);//设置页面地址WriteCommandLCD( x,1 ,select);//设置列地址}/************************************************************** **************** 功能:根据地址值(页数和列号),写入数据,即写入显示缓冲区,便可以显示在LCD屏上参数:Column表示列号,Page表示页号,dataW表示待写入的数据*************************************************************** **************** */void xy_Write(unsigned char Column,unsigned char Page,unsigned char dataW){set_XY(Column,Page);LCD_RW=0;LCD_RS=1;_nop_();//若晶振速度高,可在此作延时处理LCD_Data = dataW;// 送数据_nop_(); //若晶振速度高,可在此作延时处理LCD_E = 1;_nop_(); //若晶振速度高,可在此作延时处理LCD_E= 0; // 操作允许脉冲信号,下降沿写入}/************************************************************** **************** 功能:用于显示点阵参数:Column表示列号,Page表示页号,*************************************************************** **************** */void LcmPutDots(unsigned char Column,unsigned char Page, unsigned char DotByte ){unsigned char i;i=Column;for(;Page<8;Page++){for(;Column<128;Column++){xy_Write(Column,Page,DotByte);//DotByte = ~DotByte;}Column=i;}}/************************************************************** **************** 功能:在指定列,指定页显示待显示的点阵编码,用于显示16*16点阵码参数:Column表示列号,Page表示页号,puts待显示的点阵编码首指针*************************************************************** **************** */void whiteword(unsigned char Column,unsigned char Page, const unsigned char puts[][16] ){unsigned char i,j;for(i=0;i<2;i++)//此处的2为控制点阵行数,实际点阵行数为2*8=16行,此处的16(对应的点行数)应为8的倍数{for(j=0;j<16;j++)//此处控制每行显示的列数{xy_Write(Column+j,Page+i,puts[i][j]);}}}/****************************************************************************** 功能:在指定列,指定页显示待显示指定点阵的编码参数:Column表示列号,Page表示页号,C_num为显示点阵的行数(物理行8的倍数),V_num 为列(物理列)puts待显示的点阵编码首指针*************************************************************** **************** */void WhiteWord_Com(unsigned char Column,unsigned char Page,unsigned char C_num,unsigned char V_num, unsigned char * puts){unsigned char i,j;for(i=0;i<(C_num/8);i++)//此处的2为控制点阵行数,实际点阵行数为2*8=16行,此处的16(对应的点行数)应为8的倍数{for(j=0;j<="">{xy_Write(Column+j,Page+i,*(puts+i*V_num+j));//注意地址的变化规律}}}/************************************************************** **************** 功能:绘点参数:Column表示列号,Page表示页号,C_num为显示点阵的行数(物理行8的倍数),V_num 为列(物理列)puts待显示的点阵编码首指针*************************************************************** **************** */void Drawing_dot(unsigned char x,unsigned char y){unsigned char y_byte,x_bit,y_bit,reverse_y;//此处y_byte为page,y_bit为具体行号,x_bit 为行号unsigned char dot;reverse_y=63-y;x_bit=x;y_byte=reverse_y/8;y_bit=y%8;// for(;x_bit<128;x_bit++)if(y_bit==0) dot=0x80;if(y_bit==1) dot=0x40;if(y_bit==2) dot=0x20;if(y_bit==3) dot=0x10;if(y_bit==4) dot=0x08;if(y_bit==5) dot=0x04;if(y_bit==6) dot=0x02;if(y_bit==7) dot=0x01;xy_Write(x_bit,y_byte,dot);/* reverse_y=64-y;if(y_bit==7) y_byte=y_byte-1;y_bit=y%8;if(y_byte==(-1)) break;*/}/************************************************************** **************** 功能:绘垂直直线参数:x表示列号*************************************************************** **************** */void Drawing_line_vertical(unsigned char x){xy_Write(x,0,0xff);xy_Write(x,1,0xff);xy_Write(x,2,0xff);xy_Write(x,3,0xff);xy_Write(x,4,0xff);xy_Write(x,5,0xff);xy_Write(x,6,0xff);xy_Write(x,7,0xff);}主程序.c/************************************************************** **************** ****************12864液晶屏上显示"南京绝妙科技发展有限公司,025-******** 开发板欢迎使用","0~9",刷新后重显。
12864串行显示中文
LCD12864_PSB=0; //串行
WrCom(0x01);//清屏
WrCom(0x30);//基本指令用0x30,扩展指令用0x34
Delay1ms(20);
WrCom(0x0C);//显示开,光标关
WrCom(0x06);//进入模式指针加1,屏幕不移动
}
/****************************************************************************
#endif
/********************************12864.C*************************************/
#include"12864.h"
#include<reg51.h>
#include"string.h"
//#define LCM_ST7920_FIRST_LINE_ADDRESS0x80
void LcdInit(void);
//void Print(unsigned char);
void SetAddress( unsigned char,unsigned char );
void DisplayString(unsigned char x ,unsigned char y,unsigned char *add);
sbit LCD12864_SID = P2^5; //RW
sbit LCD12864_CS = P2^6; //RS
sbit LCD12864_RET= P2^0;
sbit LCD12864_PSB =P2^2;