lcd1602指令解读及基本程序
更新时间:2023-11-02 01:34:01 阅读量: 综合文库 文档下载
- lcd1602写指令程序推荐度:
- 相关推荐
/*
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM DDRAM就是显示数据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屏幕的第一行第一列显示一个\字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: DDRAM地址与显示位置的对应关系
图五:LCD1602内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位
D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)
+10000000B(80H)=11000000B(C0H)。
/*
1602液晶模块内部的控制器共有11条控制指令,如下表
序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0 0 0 1 S/C R/L * *
D3=1移字符 D3=0移光标 D2=1右移 D2=0左移
6 功能设置 0 0 0 0 1 DL N F * *
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位置
0x02 光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80) 0x0F 开显示,显示光标,光标闪烁 0x0e 开显示,显示光标,光标不闪烁 0x0c 开显示,不显示光标 0x08 只开显示
0x06 地址加一,当写入数据的时候光标右移 设定显示屏或光标移动方向指令
0x18 字符全部左移一格,但光标不动 0x1c 字符全部右移一格,但光标不动 0x10 光标左移1格,且AC值减1 0x14 光标右移1格,且AC值加1 */
#include
void waitfor() //检测忙信号函数 {
dataport=0xff;
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; //选择数据寄存器 写操作 RS=0指令 RS=1数据; RW=0写 RW=1读
dataport=dataw; //将数据送到数据口 EN=1;
EN=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(0x0c); //显示器开关 writecmd(0x01); //清屏
writecmd(0x06); //字符进入模式 每进入一个字符光标向右移动一格 原有字符不动 }
void location(unsigned char x,unsigned char y) //坐标函数 {
unsigned char temp;
temp=x&0x0f; //只要x数据的后四位 if(y) {
temp=temp|0x40;
} //第一行为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 每次加0x08 while(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);//强制类型转换 num=num/10; if(num==0)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);
正在阅读:
lcd1602指令解读及基本程序11-02
山西玉米面积05-17
广告互换合同09-01
电子商务中的税收问题及其对策04-24
二年级传统文化教案(定稿) - 图文01-30
2015年高考化学冲刺题:专题(6)元素周期表元素周期律(含答案)12-19
房地产信息管理系统课设报告01-26
冷链药品委托运输合同12-18
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 指令
- 解读
- lcd1602
- 基本
- 程序
- 毕业班经验交流材料
- 高中生物 2.1 减数分裂和受精作用(2)学案 新人教版必修2
- 植物生产环境单元练习题
- 国民革命军各陆军师介绍之三
- 2018-2019人教版八年级物理节节练(附答案):9.1压强
- 2014-2015成都市高二英语上期期末调研考试试卷
- 礼记教案
- 国家学生体质健康标准测试上报常见问题解答
- 最新-2018年提前招生选拔考试数学试卷(浙教版)- 精品
- 细胞培养技术视频文本
- 成都市2007-2013年中考数学试题及答案 - 图文
- 剑桥国际少儿英语KB1 U1-12文本
- ASPNET沈士根实验报告(一)
- 酿酒工艺学复习题
- 超市饮品瓶罐开启方式的人机学评议
- 英汉对比语言学期末(汇总)
- 高考地理一轮复习区域地理部分教案:8 中国地理分区
- 伯努利方程实验报告
- 中国混凝土预制件市场前景及融资战略咨询报告(2018-2022年) - 图文
- 各岗位井控工作职责