文档详情

lcd1602指令解读及基本程序

汽***
实名认证
店铺
DOCX
21.31KB
约6页
文档ID:446642197
lcd1602指令解读及基本程序_第1页
1/6

/*HD44780 内置了 DDRAM、CGROM 和 CGRAMCGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAMDDRAM就是显示数据RAM,用来寄存待显示的字符代码共80个字节,其地址和屏幕的对应关系如下表:显示位置: 1 2 3 4 5 6 7 8 40第一行: 00H 01H 02H 03H 04H 05H 06H 07H 27H第二行: 40H 41H 42H 43H 44H 45H 46H 47H 67H */1602LCD 的 RAM 地址映射液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙 标志为低电平,表示不忙,否则此指令失效要显示字符时要先输入显示字符地 址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址也就是说想要在LCD1602屏幕的第一行第一列显示一个〃A〃字,就要向DDRAM的 00H地址写入“A”字的代码就行了但具体的写入是要按LCD模块的指令格式 来进行的,后面我会说到的那么一行可有40个地址呀?是的,在1602中我们 就用前16个就行了第二行也一样用前16个地址对应如下:DDRAM地址与显示位置的对应关系i 06H SIH 92H 93H S4H 肪H 66H B7H 9SH 渺H 脯H 朋H QCH UDH MEH SFH iI II I:llOH mH 11SH 44H 山弓H U6H U7H 4SH 期呂H UCH MDH UEH MFH :LCD16字吃行00020304050607080A0&0C0D0E0F227’40414243444546474S494A4&4C4D4E501图五:LCD1602内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位 在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B (40H) +10000000B(80H)=11000000B(C0H)。

/*1602 液晶模块内部的控制器共有 11条控制指令,如下表序号 指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**D3=l移字符D3=0移光标D2=l右移D2=0左移6 功能设置 000 01 DLNF**DL=1总线8位DL=0总线4位N=0显单彳丁 N=1显双彳丁F=0 5X7 点阵 F=1 5X10 点阵7置字符发生器地址 0 0 0 1 -字符发生存贮器地址(6位)-8置数据存贮器地址 0 0 1 --显示数据存贮器地址(7位)---9读忙标志或地址 0 1 BF ----计数器地址(7位) 10 写CGRAM或DDRAM 1 0 要写的数据内容(8位-11 读CGRAM或DDRAM 1 1 读出的数据内容(8位)*/// 51单片机对lcd1602 —些基础程序/*基本操作时序:写指令 输入:RS=0, RW=0, E=下降沿脉冲,DB0〜DB7=指令码 输出:无 写数据 输入:RS=1, RW=0, E=下降沿脉冲,DB0〜DB7=数据 输出:无 读状态输入:RS=0, RW=1, E=1输出:DB0〜DB7=状态字读数据输入:RS=1, RW=1, E=1输出:DB0〜DB7=数据/*/严lcd_1602 指令:指令位 D7 D6 D5 D4 D3 D2 D1 D0功能设置 0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0 显单丁 N=1 显双丁F=0 5X7 点阵 F=1 5X10 点阵lcd_1602 指令汇总0x28 设置16*2显示, 5*7点阵, 4位数据接口0x38 设置16*2显示, 5*7点阵, 8位数据接口0x01 清屏,光标复位到地址 00H 位置0x020x0F0x0e0x0c0x080x06光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80) 开显示,显示光标,光标闪烁开显示,显示光标,光标不闪烁 开显示,不显示光标只开显示 地址加一,当写入数据的时候光标右移设定显示屏或光标移动方向指令0x180x1c0x100x14字符全部左移一格,但光标不动 字符全部右移一格,但光标不动 光标左移1格,且AC值减1 光标右移 1 格,且 AC 值加 1*/#include vintrins.h>#define dataport Plsbit RS=P2人 6;sbit RW=P2A5;sbit EN=P2A4;void waitfor() 〃检测忙信号函数{dataport=Oxff;RS=0;RW=1; 〃选择指令寄存器读操作 RS=0指令RS=1数据;RW=0写RW=1 读EN=1; 〃使能操作while(dataport&0x80); 〃如果最高位是1表示1602正忙 原地踏步 忙完后芯片会将高位拉低EN=0;}void writedata(unsigned char dataw) //写数据到 LCD1602{waitfor();RS=1;RW=0;RW=1 读dataport=dataw;EN=1;EN=0;//测忙//选择数据寄存器 写操作 RS=0 指令 RS=1 数据; RW=0 写//将数据送到数据口//使能下降沿脉冲}void writecmd(unsigned char cmd)//写命令到 LCD1602{waitfor(); //测忙RS=0;RW=0; //选择指令寄存器 写操作dataport=cmd; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void init(void) // 初始化函数{writecmd(0x38); 〃功能设定8位数据传输双行显示 设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示writecmd(OxOc); 〃显示器开关writecmd(OxOl); 〃清屏writecmd(0x06); 〃字符进入模式 每进入一个字符光标向右移动一格原有字符不动} void location(unsigned char x,unsigned char y) 〃坐标函数 {unsigned char temp;temp=x&0x0f; 〃只要x数据的后四位if(y){temp=templ0x40;} 〃第一行为0第二行为1如果y=1则地址加0x40 temp|=0x80; //DDRAM 地址的命令 DB7 为writecmd(temp);void DisplayOneChar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数 {location(x,y);writedata(dataw);}void displaylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串{while(*p) 〃当一个字符型数组读完时*P指的为零{displayonechar(x,y,*(p++));x++;}}void WriteCgram(unsigned char address,unsigned char *p) 〃写 CGRAM 的数据{unsigned char i=8;writecmd(address); //CGRAM 里的地址 初始值 0x40 每次加 0x80 while(i--){writedata(*p);p++;}} void DisplayOneChar(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) // 显示一个自定义字符{unsigned char i=8;writecmd(address); //CGRAM 里的地址 初始值 0x40 每次加 0x08while(i--){writedata(*p);p++;} location(x,y); //设定要显示的位置writedata((address&=0x3f)/0x08); //要从 CGRAM 中读出数据在 1602 上显示 搞了 半天发现 CGRAM 里的地址} //和 DDRAM 里的地址有上面的转换关系 void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数 {unsigned int number[8];int k,gh; for(k=0;;k++){*(number+k)=(unsigned int)(num%10);〃强制类型转换 num=num/10;if(num==O)break;}for(gh=k;gh>=0;gh__){ displyonechar(x,y,(*(number+gh)+48)); x++;}}〃字型码uchar code nian[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};〃 '年"uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};〃 "月"uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};〃 日"〃显示汉字displyonecharacter(0,0,0x40,nian); displyonecharacter(1,0,0x80,yue);displyonecharacter(1,0,0xc0,ri);。

下载提示
相似文档
正为您匹配相似的精品文档