1602资料和程序电路图-文档

合集下载

1602时钟程序和原理图

1602时钟程序和原理图

XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C52X1CRYSTALC127pC227pR110kR21kC310uD 714D 613D 512D 411D 310D 29D 18D 07E 6R W 5R S 4V S S 1V D D 2V E E3LCD1LM016LRV11k用1602显示时钟,能调节时分秒,周年月日,P1^0是调节显示位置按一下到秒,第二下到分,。

依次第七次到年,每到一个位置可以通过P1^1、 P1^2来调节对应位置的数据,P1^1是加数据P1^2是减数据。

#include<reg52.h>#define uchar unsigned char #define uint unsigned int sbit rs=P2^0; sbit lcden=P2^2; sbit s1=P1^0; sbit s2=P1^1; sbit s3=P1^2;uchar count,s1num;uchar shi,fen,miao,zhou,ri,yue,nian; uchar code table[]=" 2001-01-01 1"; uchar code table1[]=" 00:00:00"; void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<110;y++); }void w_com(uchar com) { rs=0; lcden=0; P3=com; delay(5); lcden=1;//给高脉冲 delay(5); lcden=0; }/********************************* 写指令*********************************/ void w_data(uchar date) { rs=1; lcden=0; P3=date; delay(5); lcden=1; delay(5); lcden=0; }/********************************* 写数据*********************************/ void init(){uchar num;lcden=0;//初始化使能为0//fen=59;//miao=52;//shi=23;zhou=1;ri=1;yue=1;nian=1;w_com(0x38);//写入显示模式指令码w_com(0x0c);//写入显示开/关及光标指令码w_com(0x06);//当写一个字符后,地址指针加一,光标加一,不动光标不闪烁w_com(0x01); //清零作w_com(0x80);//代表第一行第一位for(num=0;num<15;num++){w_data(table[num]);delay(5);}w_com(0x80+0x40);//代表第二行第一位for(num=0;num<12;num++){ w_data(table1[num]);delay(5);}TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;}/*********************************初始化函数*********************************/void w_sfm(uchar add,uchar date)//时分秒{uchar shi,ge;shi=date/10;ge=date%10;w_com(0x80+0x40+add);w_data(0x30+shi);w_data(0x30+ge);}void w_zhou(uchar add,uchar date)//周{uchar z;z=date;w_com(0x80+add);w_data(0x30+z);}void w_ryn(uchar add,uchar date)//日{uchar shi,ge;shi=date/10;ge=date%10;w_com(0x80+add);w_data(0x30+shi);w_data(0x30+ge);}void keyscan(){if(s1==0)//闪烁位置{delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1)//s1键按一下依次从秒分周日月时向左移{TR0=0;w_com(0x80+0x40+0x0b);w_com(0x0f);//左移光标开始闪烁}if(s1num==2){w_com(0x80+0x40+0x08);//w_com(0x0f);TR0=1;}if(s1num==3){w_com(0x80+0x40+0x05);//w_com(0x0f);TR0=1;}if(s1num==4){w_com(0x80+0x0e);TR0=1;}if(s1num==5){w_com(0x80+0x0b);TR0=1;}if(s1num==6){w_com(0x80+0x08);TR0=1;}if(s1num==7){w_com(0x80+0x05);TR0=1;}if(s1num==8){s1num=0;w_com(0x80+0x40+12);w_com(0x0c);//光标恢复原样,不闪烁TR0=1;}}}if(s1num!=0)//用于调节年月日时分秒{if(s2==0){delay(10);if(s2==0){while(!s2);if(s1num==1)//秒升调节{miao++;if(miao==60)miao=0;w_sfm(10,miao);w_com(0x80+0x40+11);}if(s1num==2)//分升调节{fen++;if(fen==60)fen=0;w_sfm(7,fen);w_com(0x80+0x40+8);}if(s1num==3)//时升调节{shi++;if(shi==24)shi=0;w_sfm(4,shi);w_com(0x80+0x40+5);}if(s1num==4)//周升调节{zhou++;if(zhou==8)zhou=1;w_zhou(14,zhou);w_com(0x80+14);}if(s1num==5)//日升调节{ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri==32)ri=1;w_ryn(10,ri);w_com(0x80+11);}if(yue==2){if(ri==29)ri=1;w_ryn(10,ri);w_com(0x80+11);}if(yue==4||yue==6||yue==9||yue==11){if(ri==31)ri=1;w_ryn(10,ri);w_com(0x80+11);}}if(s1num==6)//月升调节{yue++;if(yue==13)yue=1;w_ryn(7,yue);w_com(0x80+8);}if(s1num==7)//年升调节{nian++;if(nian==99)nian=1;w_ryn(4,nian);w_com(0x80+5);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1)//秒降调节{miao--;if(miao==-1)miao=59;w_sfm(10,miao);w_com(0x80+0x40+11);}if(s1num==2)//分降调节{fen--;if(fen==-1)fen=59;w_sfm(7,fen);w_com(0x80+0x40+8);}if(s1num==3)//时降调节{shi--;if(shi==-1)shi=23;w_sfm(4,shi);w_com(0x80+0x40+5);}if(s1num==4)//周降调节{zhou--;if(zhou==0)zhou=7;w_zhou(14,zhou);w_com(0x80+14);}if(s1num==5)//日降调节{ri--;if(ri==0)ri=31;w_ryn(10,ri);w_com(0x80+11);}if(s1num==6)//月降调节{yue--;if(yue==0)yue=12;w_ryn(7,yue);w_com(0x80+8);}if(s1num==7)//年降调节{nian--;if(nian==0)nian=99;w_ryn(4,nian);w_com(0x80+5);}}}}}void main(){init();while(1){keyscan();if(count==16){count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;zhou++;ri++;if(zhou==8){zhou=1;}w_zhou(14,zhou);if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri==32){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}if(yue==2){if(ri==29){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}if(yue==4||yue==6||yue==9||yue==11){if(ri==31){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==100)nian=1;w_ryn(4,nian);}w_ryn(7,yue);}w_ryn(10,ri);}}w_sfm(4,shi);}w_sfm(7,fen);}w_sfm(10,miao);}}}void timer0() interrupt 1{TH0=0x3c;TL0=0xb0;count++;}。

LCD1602地电路图和程序

LCD1602地电路图和程序

实用标准文档文案大全MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38设置16*2显示,5*7点阵,8位数据接口0x01清屏0x0F开显示,显示光标,光标闪烁0x08只开显示0x0e开显示,显示光标,光标不闪烁0x0c开显示,不显示光标0x06地址加1,当写入数据的时候光标右移0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。

1602液晶显示计算器电路图及程序

1602液晶显示计算器电路图及程序

#include <reg51.h>#include <intrins.h>#include <stdio.h>#include <stdlib.h>unsigned char code Error[]={"error"};unsigned char code Systemerror[]={"system error"};unsigned char code Lcd[]={"lcd calculate"};char str[16];sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit BF=P0^7;/***********************函数功能:延时1ms***********************/void delay1ms(){unsigned char i,j;for (i=0;i<10;i++)for (j=0;j<33;j++);}/************************函数功能:延时n毫秒入口参数:n************************/void delaynms(unsigned char n){unsigned char i;for (i=0;i<n;i++)delay1ms();}/************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙。

************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平、RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读/写_nop_();_nop_();_nop_();_nop_();result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate**************************************/void WriteInstruction(unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同为低电平时,可以写入指令RW=0;E=0;_nop_();_nop_();P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();E=1; //E置高电平_nop_();_nop_();_nop_();_nop_();E=0;}/*****************************************函数功能:指定字符显示的实际地址入口参数:x,y*****************************************/void WriteAddress(unsigned char x,unsigned char y){unsigned char temp;if(x==0){switch(y){case 0:temp=0x00; break;case 1:temp=0x01; break;case 2:temp=0x02;break;case 3:temp=0x03;break;case 4:temp=0x04;break;case 5:temp=0x05;break;case 6:temp=0x06;break;case 7:temp=0x07;break;case 8:temp=0x08;break;case 9:temp=0x09;break;case 10:temp=0x0a;break;case 11:temp=0x0b;break;case 12:temp=0x0c;break;case 13:temp=0x0d;break;case 14:temp=0x0e;break;case 15:temp=0x0f;break;}}if(x==1){switch(y){case 0:temp=0x40;break;case 1:temp=0x41;break;case 2:temp=0x42;break;case 3:temp=0x43;break;case 4:temp=0x44;break;case 5:temp=0x45;break;case 6:temp=0x46;break;case 7:temp=0x47;break;case 8:temp=0x48;break;case 9:temp=0x49;break;case 10:temp=0x4a;break;case 11:temp=0x4b;break;case 12:temp=0x4c;break;case 13:temp=0x4d;break;case 14:temp=0x4e;break;case 15:temp=0x4f;break;}}WriteInstruction(temp|0x80); //显示位置的确定方法规定为“80H+地址码x”}/*****************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y*****************************************/void WriteData (unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0; //当E由高电平跳变成低电平时,液晶模块开始执行指令}/*****************************************函数功能:对LCD的显示模式进行初始化设置*****************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delaynms(5);WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5);WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delaynms(5);}/***************************************函数功能:显示字符串***************************************/void display_error(){unsigned char i;WriteAddress(0,0);i=0;while(Error[i]!='\0'){WriteData(Error[i]);i++;delaynms(100);}}void display_systemerror(){unsigned char i;WriteAddress(0,0);i=0;while(Systemerror[i]!='\0'){WriteData(Systemerror[i]);i++;delaynms(100);}}void display_lcd(){unsigned char i;WriteAddress(0,0);i=0;while(Lcd[i]!='\0'){WriteData(Lcd[i]);i++;delaynms(100);}}/*************************** 函数功能:按键判断**************************/bit judge(){unsigned char keycode;P1=0x0f;keycode=P1;if(keycode==0x0f)return(0);elsereturn(1);}/*****************************函数功能:键盘扫描*****************************/ unsigned char scan(){unsigned char keycode,keyscan;keyscan=0xef;while(keyscan!=0xff){P1=keyscan;keycode=P1;if((keycode&0x0f)!=0x0f)break;keyscan=(keycode<<1)|0x0f;}keycode=~keycode;return(keycode);}/*******************************函数功能:扫描键盘返回值******************************/ unsigned char Key_Num(){unsigned char keycode;unsigned char yong;if(judge()){delaynms(20);if(judge()){keycode=scan();while(judge());switch(keycode){case 0x11:yong='7';break;case 0x12:yong='4';break;case 0x14:yong='1';break;case 0x18:yong=0;break;case 0x21:yong='8';break;case 0x22:yong='5';break;case 0x24:yong='2';break;case 0x28:yong='0';break;case 0x41:yong='9';break;case 0x42:yong='6';break;case 0x44:yong='3';break;case 0x48:yong='=';break;case 0x81:yong='/';break;case 0x82:yong='*';break;case 0x84:yong='-';break;case 0x88:yong='+';break;default:display_systemerror() ;}return(yong);}}elsereturn(0xff);}/************************************** itoa函数定义*********************************/ unsigned char itoa(long int num){unsigned char i,j,L;unsigned char temp[16];for(i=0;num!=0;i++){temp[i]=num%10+48;num=num/10;}L=i;if(i>16){display_systemerror();}for(j=0;j<=L;j++){str[j]=temp[i];i--;}return(L);}/*****************************************函数功能:主函数****************************************/void main(){long int a;long int b;unsigned char flag;unsigned char sign;unsigned char i,j,s,x;unsigned char num;unsigned char fgh;unsigned char temp[16];LcdInitiate();display_lcd();delaynms(20);WriteInstruction(0x01);flag=1;while(1){num=Key_Num();if(num!=0xff){if(fgh==1){WriteInstruction(0x01);fgh=0;}if((num!='+')&&(num!='-')&&(num!='*')&&(num!='/')&&(num!='.')&&(num!='=')){if(flag==1){a=a*10+num-48;}else{b=num-48+b*10;}}if(num==0){i=0;flag=1;a=0;b=0;WriteInstruction(0x01);}if((num=='+')||(num=='-')||(num=='*')||(num=='/')){flag=0;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/': {if(b!=0){ a=a/b;break; }else{WriteInstruction(0x01);flag=1;WriteAddress(0,1);display_error();delaynms(40);WriteInstruction(0x01);break;}}default:break;}sign=num;b=0;}if(num=='='){flag=1;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/':a=a/b;break;default:break;}temp[i]=num;WriteAddress(0,i);WriteData(num);for(s=0;s<16;s++)temp[s]=0;s=0;//WriteAddress(1,8);//WriteData(a+48);x=itoa(a); //函数转换WriteAddress(1,1);while(s<=x){WriteData(str[s]);s++;delaynms(100);}sign=0;a=b=0;j=0;for(s=0;s<16;s++)str[s]=0;s=0;fgh=1;i=0;}if(i<16){if(num!='='){if((i==1)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符{temp[0]=num; //如果是1-9数字,说明0没有用,则直接替换第一位0WriteAddress(0,0);//输出数据WriteData(num);}else{temp[i]=num;WriteAddress(0,i);//输出数据WriteData(num);i++; //输入数值累加}}}else{i=0;WriteInstruction(0x01);}}}}枯藤老树昏鸦,小桥流水人家,古道西风瘦马。

LCD1602最详细资料

LCD1602最详细资料

1602字符液晶所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。

目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。

DDRAM就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的00H地址写入“A”字的代码就行了。

但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。

那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。

第二行也一样用前16个地址。

对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。

这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。

依次类推。

大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”上表中的字符代码与我们PC中的字符代码是基本一致的。

1602资料

1602资料

字符型液晶显示模块由字符型液晶显示屏(LCD),控制驱动主电路HD44780及其扩展驱动电路HD44100,少量阻、容元件,结构件等装配在PCB板上而成。

字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形式都是统一的。

因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块。

第二章字符型液晶显示模块的基本特点1、液晶显示屏是以若干个5´8或5´11点阵块组成的显示字符群。

每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。

2、主控制驱动电路为HD44780(HITACHI)及其他公司全兼容电路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPAN RADIO)。

3、具有字符发生器ROM可显示192种字符(160个5´7点阵字符和32个5´10点阵字符,见附录一)4、具有64个字节的自定义字符RAM,可自定义8个5´8点阵字符或四个5´11点阵字符。

5、具有80个字节的RAM。

6、标准的接口特性,适配M6800系列MPU的操作时序。

7、模块结构紧凑、轻巧、装配容易。

8、单+5V电源供电。

9、低功耗、长寿命、高可靠性。

HY字符型液晶显示模块特性一、HY系列接口特性及时序信号真值表RS R/W E 功能0 0 下降沿写指令代码0 1 高电平读忙标志和AC码1 0 下降沿写数据1 1 高电平读数据2、接口引脚功能引脚号符号状态功能1 Vss 电源地2 Vdd +5V逻辑电源3 V0 液晶驱动电源4 RS 输入寄存器选择1:数据;0:指令5 R/W 输入读、写操作选择1:读;0:写6 E 输入使能信号7 DB0 三态数据总线(LSB)8 DB1 三态数据总线9 DB2 三态数据总线10 DB3 三态数据总线11 DB4 三态数据总线12 DB5 三态数据总线13 DB6 三态数据总线14 DB7 三态数据总线(MSB)15 LEDA 输入背光+5V16 LEDK 输入背光地注:15、16两管脚用于带背光模块,不带背光的模块这两个管脚悬空不接。

单片机驱动1602液晶电路图及c51程序

单片机驱动1602液晶电路图及c51程序

单片机驱动1602液晶电路图及c51程序原理图:1602液晶电路图51单片机驱动程序:#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char//这三个引脚参考资料sbit E=P2^7; //1602使能引脚sbit RW=P2^6; //1602读写引脚sbit RS=P2^5; //1602数据/命令选择引脚void init(){TMOD=0X00;TH0=0X03;TL0=0X32;IE=0X82;TR0=1;}/********************************************************************* 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************************/ void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(){_nop_();_nop_();_nop_();_nop_();_nop_();}bit Busy(void){bit busy_flag = 0;RS = 0;RW = 1;E = 1;delay();busy_flag = (bit)(P0 & 0x80);E = 0;return busy_flag;}void wcmd(uchar del){while(Busy());RS = 0;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}void wdata(uchar del){while(Busy());RS = 1;RW = 0;E = 0;delay();P0 = del;delay();E = 1;delay();E = 0;}void L1602_init(void){wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms(5);wcmd(0x38);Delay_1ms(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x06);wcmd(0x01);}void L1602_char(uchar hang,uchar lie,char sign) {uchar a;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;wcmd(a);wdata(sign);}void L1602_string(uchar hang,uchar lie,uchar *p) {uchar a,b=0;if(hang == 1) a = 0x80;if(hang == 2) a = 0xc0;a = a + lie - 1;while(1){wcmd(a++);if((*p == '\0')||(b==16)) break;b++;wdata(*p);p++;}}uchar Keyscan(void){uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};for(j=0; j<4; j++){P1 = Buffer[j];temp = 0x10;for(i=0; i<4; i++){if(!(P1 & temp)){return (i+j*4);}temp <<= 1;}}}void Main(void){uchar Key_Value; //读出的键值L1602_init();init();L1602_string(1,16," 4*4 KeyBoard ");L1602_string(2,16,"You Press The ");for(Key_Value=15;Key_Value>0;Key_Value--){wcmd(0x18);Delay_1ms(250);Delay_1ms(250);}while(1){P1 = 0xf0;if(P1 != 0xf0){Delay_1ms(20); //按键消抖if(P1 != 0xf0){Delay_1ms(20); //按键消抖if(P1 != 0xf0){Key_Value = Keyscan();}}}L1602_char(2,30,Key_Value / 10 + 48);L1602_char(2,31,Key_Value % 10 + 48);}}void timer0() interrupt 1{}。

1602最详细资料

1602最详细资料

一、关于LCD1602:在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。

1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

2.操作时序:信号真值表RS R/W EN 操作说明0 0 1→0 写入指令D0~D70 1 1 读出的D0~D7状态字1 0 1→0 写入D0~D7数据1 1 1 读出D0~D7数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)3.指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0f 开显示,显示光标,光标闪烁0x08 关闭显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18 光标和显示一起向左移动4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。

5.读写时序:时序图1602手册中有,这里不引用了。

1602电子时钟电路_原理图_PCB图

1602电子时钟电路_原理图_PCB图

1602电子时钟电路_原理图_PCB图一、引言电子时钟作为现代生活中常见的时间显示设备,广泛应用于各个领域。

本篇文章将着重介绍1602电子时钟的电路原理图和PCB设计图,旨在让读者了解该电子时钟的工作原理和实现方法。

二、电路原理图1602电子时钟的电路主要由以下几个模块组成:时钟源、微处理器、液晶显示屏和按键控制模块。

下面将对每个模块进行详细的介绍。

1. 时钟源模块时钟源模块是电子时钟的核心,用于提供准确的时间信号。

常见的时钟源模块有晶振和RTC(实时时钟)芯片。

晶振通常使用32.768kHz的石英晶体,通过振荡脉冲产生稳定的时间基准。

而RTC芯片则内部集成了时钟电路,能够提供准确的时间信号。

2. 微处理器模块微处理器模块负责控制整个电子时钟的运行。

常用的微处理器有单片机和微控制器。

单片机通常具有丰富的外设接口和可编程功能,适用于复杂的时钟控制需求。

而微控制器则在单芯片上集成了微处理器核心、存储器和外设接口,更加简易和紧凑。

3. 液晶显示屏模块液晶显示屏模块用于将时间信息以数字形式显示出来。

1602液晶显示屏是基于字符型液晶显示技术,具有两行十六个字符的显示能力。

其工作原理是通过外部电压的作用,控制液晶分子的排列来实现显示效果。

4. 按键控制模块按键控制模块允许用户通过按键来设定和调整电子时钟的功能和显示参数。

它通常包括多个按键、键盘扫描接口和按键控制电路。

三、PCB图设计PCB图是电子时钟电路的物理实现图,能够直观地显示所有元器件之间的连接和布局关系。

本节将介绍1602电子时钟的PCB图设计过程。

1. 元器件布局在PCB设计之前,需要对各个元器件进行布局。

首先,将时钟源模块与微处理器模块放置在一起,以便于时钟信号的输入和处理。

其次,根据液晶显示屏的位置要求,将其与微处理器模块相连接。

最后,将按键控制模块与微处理器模块相连,并设置按键的位置。

2. 连接导线通过导线将各个元器件进行连接。

导线的设计应考虑信号的传输距离、屏蔽和抗干扰等因素,以保证电子时钟的稳定性和可靠性。

1602串行控制(配合74HC164)

1602串行控制(配合74HC164)

52系列单片机之串行控制LCD16022010-09-02 17:52串行控制LCD1602原理图:/*************************************************************** ****///注:由于使用74HC164,故不能读出命令,即不能判忙,采用延时处理#include <reg52.h>//头文件#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit RS=P2^4; //定义I/O的硬件接口sbit RW=P2^5;sbit E=P2^6; //定义I/O的硬件接口sbit A_B=P2^2; //定义I/O的硬件接口数据sbit CP=P2^3; //定义I/O的硬件接口时钟unsigned char code blog_adr[] = {"china"}; unsigned char code email[] = {"Julian"}; unsigned char code zimo[]={0x00,0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02, //年0x00,0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13, //月0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F, //日};/*------------------------------------------------ uS延时函数------------------------------------------------*/ void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------ mS延时函数------------------------------------------------*/ void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/******************************************************************** 函数功能:LCD1602写指令********************************************************************/void write_Directive(uchar a)//写指令{uchar i;//DelayUs2x(5);RS=0;RW=0;for(i=0;i<8;i++){if((a&0x80)==0x80) A_B=1;else A_B=0;CP=0;DelayUs2x(2);CP=1;CP=0;a=a<<1; //先将指令移位转换为串行数据}E=0;DelayUs2x(5);E=1;}/******************************************************************** 函数功能:LCD1602写数据********************************************************************/void write_Data(uchar a)//写数据{uchar i;//DelayUs2x(5);RS=1;RW=0;for(i=0;i<8;i++){if((a&0x80)==0x80) A_B=1;else A_B=0;CP=0;DelayUs2x(2);CP=1;CP=0;a=a<<1;}E=0;DelayUs2x(5);E=1;}/******************************************************************** 函数功能:LCD1602初始化********************************************************************/ void lcd1602init()//初始化{write_Directive(0x38);DelayMs(5);write_Directive(0x38);DelayMs(5);write_Directive(0x38);DelayMs(1);write_Directive(0x08); /*显示关闭*/DelayMs(1);write_Directive(0x01); //清屏DelayMs(1);write_Directive(0x02); //归位,AC=0;DelayMs(1);write_Directive(0x06);DelayMs(1);write_Directive(0x0c);DelayMs(1);}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x01;X &= 0x0F; //限制 X 不能大于 15,Y 不能大于 1if(Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码DelayUs2x(10);write_Directive(X);DelayMs(1);write_Data(DData);write_Directive(X);DelayMs(1);}//按指定位置显示一串字符void Displaystr(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x01;X &= 0x0F; //限制 X 不能大于 15,Y 不能大于 1while (DData[ListLength]!='\0') //若到达字串尾则退出{if (X <= 0x0f) //X 坐标应小于 0x0F{DisplayOneChar(X,Y,DData[ListLength]); //显示单个字符ListLength++; X++;if(X>=16){X=0;Y++;if(Y==2)Y=0;}}else{X=0;Y++;if(Y==2)Y=0;}}}/*------------------------------------------------生成自定义字符------------------------------------------------*/void Write_CGRAM(unsigned char *p){unsigned char i,j,kk;unsigned char tmp=0x40; //操作CGRAM的命令码kk=0;for(j=0;j<3;j++){for(i=0;i<8;i++) // 8 个字节生成 1 个字符点阵{DelayUs2x(100);write_Directive(tmp+i); //操作CGRAM的命令码+写入CGRAM地址. DelayUs2x(2);write_Data(p[kk]); //写入数据kk++;}tmp+= 8;}}void main(){lcd1602init();Write_CGRAM(zimo);Displaystr(0,0,blog_adr);Displaystr(6,0,email);Displaystr(0,1,"2011");DisplayOneChar(4,1,0x00); Displaystr(5,1,"8");DisplayOneChar(6,1,0x01); Displaystr(7,1,"28");DisplayOneChar(9,1,0x02); while(1);}。

1602液晶显示屏模块资料--附程序

1602液晶显示屏模块资料--附程序

液晶显示屏模块说明一.功能说明:该模块可以通过单片机控制并行口数据16字×2行的字符型液晶模块的显示。

二.硬件设计:核心控制:Freescale MC9S12D64 单片机系统板执行部分:16字X2行的字符型液晶模块操作部分:通过USBDM将已写好的程序刷入单片机指示部分:单片机上的发光二极管电源部分:提供给电机5V的直流稳压电源硬件说明:一.液晶显示屏引脚的定义:1602采用标准的16脚接口,其中:(模块背面有标注)。

1脚VSS:接地;2脚Vdd:接+5V电源;3脚VO:对比度调整端,LCD驱动电压范围为Vdd~VO。

当VO接地时,对比度最强;4脚RS:寄存器选择端,RS为0时,选择命令寄存器IR;RS为1时,选择数据寄存器DR;5脚:读写控制端,为1时,选择读出;为0时,则选择写入;6脚Enable:使能控制端,Enable为1时,使能;Enable 为0,禁止;7脚~14脚D0~D7:数据总线;15脚LED+:背景光源,接+5V;16脚LED-:背景光源,接地。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,其中数字与字母同ASCII码兼容。

其内部还有自定义字符(CGRAM),可用业存储自已定义的字符。

指令说明:指令1:清显示屏;指令2:光标复位;指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。

R/L,高向左,低向右。

1602液晶显示计算器电路图及程序

1602液晶显示计算器电路图及程序

#include <>#include <>unsigned char code Error[]={"error"};unsigned char code Systemerror[]={"system error"};unsigned char code Lcd[]={"lcd calculate"};char str[16];sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit BF=P0^7;/***********************函数功能:延时1ms***********************/void delay1ms(){unsigned char i,j;for (i=0;i<10;i++)for (j=0;j<33;j++);}/************************函数功能:延时n毫秒入口参数:n************************/void delaynms(unsigned char n){unsigned char i;for (i=0;i<n;i++)delay1ms();}/************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙。

************************************/bit BusyTest(void){bit result;RS=0; 0a0c0f4a4c4f0c0f0f0f0f0f&&(num!='=')) {if(flag==1){a=a*10+num-48;}else{b=num-48+b*10;}}if(num==0){i=0;flag=1;a=0;b=0;WriteInstruction(0x01);}if((num=='+')||(num=='-')||(num=='*')||(num=='/')){flag=0;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/': {if(b!=0){ a=a/b;break; }else{WriteInstruction(0x01);flag=1;WriteAddress(0,1);display_error();delaynms(40);WriteInstruction(0x01);break;}}default:break;}sign=num;b=0;}if(num=='='){flag=1;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/':a=a/b;break;default:break;}temp[i]=num;WriteAddress(0,i);WriteData(num);for(s=0;s<16;s++)temp[s]=0;s=0;//WriteAddress(1,8);//WriteData(a+48);x=itoa(a); //函数转换WriteAddress(1,1);while(s<=x){WriteData(str[s]);s++;delaynms(100);}sign=0;a=b=0;j=0;for(s=0;s<16;s++)str[s]=0;s=0;fgh=1;i=0;}if(i<16){if(num!='='){if((i==1)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符{temp[0]=num; //如果是1-9数字,说明0没有用,则直接替换第一位0WriteAddress(0,0);//输出数据WriteData(num);}else{temp[i]=num;WriteAddress(0,i);//输出数据WriteData(num);i++; //输入数值累加}}}else{i=0;WriteInstruction(0x01);}}}}。

单片机液晶显示(以1602为例)

单片机液晶显示(以1602为例)

液晶显示(所有程序都经过测试合格)一、基础部分。

(以1602与12864介绍)本部分以液晶1602为主,来引出关于单片机操作液晶的基本知识。

为以后液晶的高级应用打好基础。

Ⅰ、本程序最终目的为:显示一个双行数字,并实现整屏移动。

总的原理图及源程序如下:原理图:液晶电路图\液晶显示.ddb源程序:液晶例程\液晶显示.c#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="";sbit lcdwr=P2^5;//R/S命令选择端,H/L;sbit lcden=P2^7;//使能端sbit lcdrs=P2^6;//RS数据/命令选择端。

H/L;//sbit dula=P2^6;//sbit wela=P2^7;uchar num;void delay(uint z)//延时程序,z的数是几就是几ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//写命令函数,{lcdrs=0;//写入命令初始化,设置为低电平表示命令选择端。

P0=com; //由时序图可知,在使能en触发时,早就有数据写入。

delay(5); //并且有一段延时,此处设置为5毫秒lcden=1; //使能端开始拉高delay(5); //由时序图,使能端拉低一段时间thD2后,数据传输?lcden=0; //然后将使能端拉低}void write_data(uchar date){lcdrs=1;P0=date;delay(5);//此处延时,是为了对应数据中:在E拉高之前,有数据的一段准备时间。

1602显示实验报告

1602显示实验报告

一、1602显示二、实验项目:1602显示三、实验地点:四、五、实验时间:2014年7月9日~2014年7月23日六、实验要求:1、在单片机最小系统中加入LCD1602显示屏。

2、能进行数字和字符的显示3、扩展功能一:将实验四中的“单片机时钟”改为1602显示。

4、用Protel99SE绘制实验原理图并完成实验报告。

七、实验具体内容:1、在单片机最小系统中加入LCD1602显示屏。

(1)实验电路图:(2)实验原理:1602显示屏采用标准的16引脚(有背光),其各个引脚接线及作用说明如下:(3)实验中遇到的问题:在电路接线工作完成以后,上电实验时LCD只有背光,无任何显示。

问题原因分析:在接线过程中,我最为关注的是RS、R/W、E三个端口的接线,忽视了D0~D7的接线顺序,从而使D7~D0的方向接反。

因此1602内部的11条指令码都会对应不上,例如清屏指令是0x01,而我则需要写成0x20。

所以按照正常程序指令,在初始化之后,屏幕会一直没有显示。

(4)实验小结:在完成电路图之后觉得本次的接线相对来说比较简单。

心想只要接好RS、R/W、E正负极不反接,就没什么问题。

结果却出乎我的意料,看是简单的D0~D7八个端口的顺序同样起着关键的作用。

因自己的忽视,使我在完成接线之后长时间找不到问题原因之所在。

这次的接线也很好的提醒了我,看似简单的工作,可千万不敢再掉意轻心。

2、能进行数字和字符的显示并将实验四中的“单片机时钟”改为1602显示。

(1) 实验原理:LCD6102的显示方式是先从DDRAM写入要显示地址,在往DDRAM写入要显示的字符码。

控制其操作的有11条LCD1602的内部指令,具体如下:指令1:清显示;指令2:光标复位,光标复位到地址00H;指令3:光标和显示模式设置;I/D:光标移动方向,高电平左移,低电平右移S:屏幕上所有文字是否左移或者右移(高电平有效,低电平无效)指令4:显示开关控制;D:控制整体显示开关,高电平表示开,低电平表示关C:控制光标的开关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标显示移位;S/C:高电平时移动显示文字,低电平时移动显示光标指令6:功能设置命令;DL:高电平时为四位总线,低电平时为八位总线N:低电平时为单行显示,高电平时为双行显示F:低电平时为5x7点阵字符,高电平时为5x10点阵字符指令7:字符发生器存储器地址:指令8:DDRAM地址设置指令9:读忙信号和光标地址BF为忙标志高电平表示忙,此时模块不能接收命令或者数据,低电平表示不忙指令10:写数据指令11:读数据时序控制:读状态:输入RS=0 R/W=1 E=1 输出:D0~D7=状态字写指令:输入RS=0 R/W=1 D0~D7=指令码E=高脉冲输出:无读数据:输入RS=1 R/W=1 E=1 输出:D0~D7=数据写数据:输入RS=1 R/W=0 D0~D7=数据E=高脉冲输出:无(2)程序流程图如下所示:(3)实验中遇到的问题按下4#键时钟显示减1,当显示为00后,继续减1,会出现ASCLL在0之后的码。

1602电子、程序,ARM

1602电子、程序,ARM

实验五字符型LCD控制实验5_08电信一班_黄惠强_46实验目的1、了解字符型LCD的基本工作原理2、掌握字符型LCD控制程序的设计和调试方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、字符型LCD介绍液晶显示器具有功耗低,寿命长的特点。

是目前单片机应用的重要领域,无论机器,仪表,等都可以看到他的身影。

液晶显示器常见外观如图4-42所示。

图4-42 液晶显示器常见外观此外,还有彩色点阵LCD等。

这里以1602字符型液晶为例说明。

1602字符型型液晶可以显示2行16个字符。

2、1602字符型LCD命令1602液晶模块内部的控制器共有11条控制指令。

如表4-8所示。

表4-8 1602液晶模块指令表3、1602的接口电路与工作时序LCD 与单片机接口电路如图4-48所示。

调整电位器RP400可改变LCD 的对比度。

LCD 的工作时序如图4-49所示。

从图中可以看出,写入命令或数据时,在LCD 使能端E 的下降沿时锁存数据;读状态或数据时,在LCD 使能端E为高电平时输出数据。

图4-48 1602LCD 接口图(a)读时序图 (b)写时序图图4-49 1602LCD 读写时序图3、 1602字符型LCD 驱动程序设计1602驱动程序设计主要是读写程序的设计。

由时序图可知,LCD 的工作时序与51单片机的读写时序不同。

只能用软件模拟的方式产生工作时序。

驱动程序可分为四种情况:LCD 写命令、LCD 读状态、LCD 读数据、LCD 写数据。

流程图如图4-50所示。

图4-50 1602LCD 驱动程序流程图在1602的基本读写程序基础上,还要再设计光标控制、打印字符串、显示开关、清屏等子程序。

由于一些子程序只要一条命令即可完成,这里以印字符串为例说明。

其它子程序均可不再编写。

在1602LCD上显示字符串程序流程图如图4-51所示。

图4-51 1602LCD显示字符串程序实验内容(编写学号和姓名左右循环移动程序)#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar num;uchar code table[]="huang hui qiang";uchar code table1[]="20084081046";/****LCD1602端口定义****************/sbit lcd_en=P2^2;sbit lcd_rw=P2^3;sbit lcd_rs=P2^4;#define lcd_date P0/*****数码管端口定义*******************/sbit LEDCLK=P3^4;sbit LEDDIN=P2^3;/***************************//**************************************************************延时函数*功能: 可随意设置延时时间,延时时间为(tt*9+16)us.晶振为12MHz***************************************************************/void delay_us(unsigned int tt){while(tt--){;}}/***************************************************** 延时函数*功能: 可随意设置延时时间,延时时间为tt ms.晶振为12MHz *****************************************************/ void delay_ms(unsigned int tms){unsigned char i;while(tms--)for(i=123;i>0;i--);}void close_led(){uchar i;for(i=8;i>0;i--){LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;_nop_();}}void fbusy(){uchar i=0;lcd_date=0xff;lcd_rs=0;lcd_rw=1;lcd_en=1;while((lcd_date&0x80)&&(i<=100)){i++;lcd_en=0;lcd_en=1;}i=0;lcd_en=0;}void Write_com(uchar com){fbusy();lcd_rs=0;lcd_rw=0;lcd_date=com;lcd_en=1;_nop_();lcd_en=0;}void Writ_dat(uchar dat){fbusy();lcd_rs=1;lcd_rw=0;lcd_date=dat;lcd_en=1;_nop_();lcd_en=0;}void lcd_init(){lcd_rw=0;lcd_en=0;delay_ms(15);Write_com(0x38);delay_ms(5);Write_com(0x38);delay_ms(5);Write_com(0x38);//显示模式设置Write_com(0x08);//显示关闭Write_com(0X01);//清屏Write_com(0x06);//显示光标移动设置Write_com(0X0c);//显示开及光标设置}void main(){close_led();lcd_init();Write_com(0X80+0x10);//写地址for(num=0;num<15;num++){Writ_dat(table[num]);delay_ms(20);}Write_com(0X80+0x40+0x10);for(num=0;num<11;num++){Writ_dat(table1[num]);delay_ms(20);}while(1){for(num=0;num<32;num++){Write_com(0x18);delay_ms(500);}for(num=0;num<32;num++){Write_com(0x1c);delay_ms(500);}}}思考题1、当输入的字符串长度超过16个字时,显示情况如何,说明原因。

1602液晶资料

1602液晶资料

1602液晶资料蓝底白字标准型16X2液晶显示字符模块(背光/蓝屏)1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:背光电源正极第16脚:背光电源负极1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序:ORG0000HRSEQUP3.7;确定具体硬件的连接方式RWEQUP3.6;确定具体硬件的连接方式EEQUP3.5;确定具体硬件的连接方式MOVP1,#00000001B;清屏并光标复位ACALLENABLE;调用写入命令子程序MOVP1,#00111000B;设置显示模式:8位2行5x7点阵ACALLENABLE;调用写入命令子程序MOVP1,#00001111B;显示器开、光标开、光标允许闪烁ACALLENABLE;调用写入命令子程序MOVP1,#00000110B;文字不动,光标自动右移ACALLENABLE;调用写入命令子程序MOVP1,#0C0H;写入显示起始地址(第二行第一个位置)ACALLENABLE;调用写入命令子程序MOVP1,#01000001B;字母A的代码SETBRS;RS=1CLRRW;RW=0;准备写入数据CLRE;E=0;执行显示命令ACALLDELAY;判断液晶模块是否忙?SETBE;E=1;显示完成,程序停车AJMP$ENABLE:CLRRS;写入控制命令的子程序CLRRWCLREACALLDELAYSETBERETDELAY:MOVP1,#0FFH;判断液晶显示器是否忙的子程序CLRRSSETBRWCLRENOPSETBEJBP1.7,DELAY;如果P1.7为高电平表示忙就循环等待RETEND程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。

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

lcd1602中文资料在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。

除了黑白显示外,液晶显示器还有多灰度有彩色显示等。

如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。

③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH 时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。

这就是LCD显示的基本原理。

字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。

这样一来就组成某个字符。

但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

10.8.2 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。

一般1602字符型液晶显示器实物如图10-53:图10-53 1602字符型液晶显示器实物图10.8.2.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-54 1602LCD尺寸图1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:表10-13:引脚接口说明表第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W 共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:背光源正极。

第16脚:背光源负极。

10.8.2.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。

指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:字符发生器RAM地址设置。

指令8:DDRAM地址设置。

指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:写数据。

指令11:读数据。

与HD44780相兼容的芯片时序表如下:表10-15:基本操作时序表读写操作时序如图10-55和10-56所示:图10-55 读操作时序图10-56 写操作时序10.8.2.4 1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。

图10-57 1602LCD内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。

每次输入指令前都要判断液晶模块是否处于忙的状态。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”图10-58 字符代码与图形对应图10.8.2.5 1602LCD的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置10.8.3 1602LCD的软硬件设计实例在1602LCD第一行显示网站名:在第二行显示联系电话:####。

实验前应先将显示切换开关切换到LCD工作状态。

图10-59 1602LCD实验演示图10.8.3.1 硬件原理图1602液晶显示模块可以和单片机AT89C51直接接口,电路如图10-60所示。

图10-60 硬件原理图10.8.3.2 程序流程图图10-61 软件流程图10.8.3.3 软件代码#include <reg51.h>#include <intrins.h>sbit rs= P2^0;sbit rw = P2^1;sbit ep = P2^2;unsigned char code dis1[] = {""};unsigned char code dis2[] = {"####"}; void delay(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}bit lcd_bz(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P0 & 0x80);ep = 0;return result;}void lcd_wcmd(unsigned char cmd) {while(lcd_bz());//判断LCD是否忙碌rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}void lcd_pos(unsigned char pos){lcd_wcmd(pos | 0x80);}void lcd_wdat(unsigned char dat) {while(lcd_bz());//判断LCD是否忙碌rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}void lcd_init(){lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);}void main(void){unsigned char i;lcd_init();// 初始化LCDdelay(10);lcd_pos(0x01);//设置显示位置i = 0;while(dis1[i] != '\0'){lcd_wdat(dis1[i]);//显示字符i++;}lcd_pos(0x42);// 设置显示位置i = 0;while(dis2[i] != '\0'){lcd_wdat(dis2[i]);// 显示字符i++;}。

相关文档
最新文档