




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7讲 I/O口高级应用-时序读写 -以JHD162A液晶为例,主讲:王泽华 电话青岛科技大学,本章重点,时序 时序编程要点,材料清单,最小系统板。 +5V电源。 JHD162A液晶1个;10K可调电阻1个。 圆孔插座若干(2.54mm);单列直插(2.54mm)排针若干。 排线若干;焊锡丝,助焊剂若干。,LCD1602介绍,LCD1602是指162,表示显示2行,每行16个字符。是点阵型LCD,控制芯片为HD44780。可显示ASCII码字符表中的任意字符,是目前除了数码管以外,使用最广泛显示设备。 优点是很少的外围设备,使用方便,价格便宜(15元左右),编程简单;其缺点是显示的字符较小,占用多个I/O口(11个)。,JHD162A液晶针脚排列及外围电路,针脚排列和焊接外围电路如下图所示;从左到右为1-16;针脚功能如左表所示。,实际焊接正面图,实际焊接反面图,1602显示原理,HD44780内置了DDRAM(显示数据存储RAM);CGROM(字符存储ROM);CGRAM(用户自定义RAM),显示效果不好,一般不用。 1、DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,1602只用32个字节,其地址和屏幕(屏幕2行,每行16字节)的对应关系如下表:,2、CGROM:共存储了160个点阵字符图形,每一字符存储到一个8bit地址中,比如字母“A”的代码是0B0100,0001=0x41,显示时模块把地址41H中的点 阵字符图形显示出来,我们就能看到字母“A” 。表中的字符代码与我们PC中的字符代码是一致的。因此我们在向DDRAM字符代码程序时甚至可以直接用PORTXA这样的方法。PC在编译时就把“A”先转为41H代码了。,HD44780指令集,1、清屏-(写命令),功能: 清除液晶显示器,即将DDRAM的内容全部填入“空白”的字符码20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为0。,2、光标归位-(写命令),功能: 把光标撤回到显示器的左上方; 把地址计数器(AC)的值设置为0; 保持DDRAM的内容不变,3、输入模式设置-(写命令),4、显示开关控制-(写命令),功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否 移动。 参数设定的情况如下所示: 位名 设置 I/D 0=写入新数据后光标左移 1=写入新数据后光标右移 S 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字,功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名 设置 D 0=显示功能关 1=显示功能开 C 0=无光标 1=有光标 B 0=光标不闪烁 1=光标闪烁,5、设定显示屏或光标移动方向-(写命令),功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C R/L 设定情况 0 0 光标左移1格,且AC值减1 0 1 光标右移1格,且AC值加1 1 0 显示器上字符全部左移一格,但光标不动 1 1 显示器上字符全部右移一格,但光标不动,6.功能设定-(写命令),功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名 设置 DL 0=数据总线为4位 1=数据总线为8位 N 0=显示1行 1=显示2行 F 0=57点阵/每字符 1=510点阵/每字符,7、设定CGRAM地址-(写命令),功能:设定下一个要存入数据的CGRAM的地址。,8.设定DDRAM地址指令 -(写命令),功能:设定下一个要存入数据的DDRAM的地址。DDRAM地址对应屏幕上标出的地址,第一行是0x00-0xFF,第二行是0x40-0x4F (注意这里我们送地址的时候应该是0x80+Address),9.读取忙信号或AC地址-(读状态),功能: 读取忙碌信号FB的内容,FB=1表示液晶显示器忙,暂时无法接收单 片机送来的数据或指令; 当FB=0时,液晶显示器可以接收单片机送来的数 据或指令; 读取地址计数器(AC)的内容。,10.数据写入DDRAM或CGRAM指令 -(写数据),功能: 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符; 将用户自己设计的图形存入CGRAM。,11.从CGRAM或DDRAM读出数据-(读数据),功能:读取DDRAM或CGRAM中的内容。,HD44780指令集总结和时序图,共11条指令(时序图是jhd162A给出的时序) 读指令 读状态 输入:RS=0,R/W=1,E=1 输出:DB7-DB0,输出状态 读数据 输入:RS=1,R/W=1,E=1 输出:DB0DB7=数据 写指令 写命令 输入:RS=0,R/W=0,E=下降沿脉冲,DB0DB7=指令码 输出:无 写数据 输入:RS=1,R/W=0,E=下降沿脉冲,DB0DB7=数据 输出:无,读时序,读命令实际中使用的仅仅是读LCD是否忙(参见指令9),读数据几乎不用。 /*/ /LCD控制端口定义 #define LCD_CTRL_PORT PORTC #define LCD_CTRL_DDR DDRC /LCD 控制端口 /LCD数据端口定义 #define LCD_PORT PORTB /发送LCD数据端口 #define LCD_PIN PINB /读取LCD数据端口 #define LCD_DDR DDRB /LCD数据端口方向 /*好处是改变MCU的控制口和数据口只需要修改以上代码,不需要修改以下函数*/ /*/ / LCD忙等待 void LCD_BUSY_WAIT() LCD_CTRL_DDR |= 0x07;/设定控制端为cpu出 LCD_PORT = 0xFF; LCD_DDR = 0x00;/上拉输入 RS_0(); RW_1(); EN_1(); _NOP(); _NOP(); _NOP();/延时360ns等待数据建立。 while(LCD_PIN ,写时序,写操作有写命令和写数据两种,通过RS电平来区分,0写指令,1写数据 / 写LCD命令寄存器 void Write_LCD_Comm(unsigned char cmd) LCD_BUSY_WAIT(); LCD_CTRL_DDR |= 0x07;/设定控制端为cpu出 LCD_DDR = 0xFF; /lcd数据引脚输入 RS_0(); RW_0();EN_1(); LCD_PORT = cmd; _NOP(); _NOP(): EN_0(); / 写LCD数据寄存器 void Write_LCD_Data(unsigned char dat) LCD_BUSY_WAIT(); LCD_CTRL_DDR |= 0x07;/设定控制端为cpu出 LCD_DDR = 0xFF; /lcd数据引脚输入 RS_1(); RW_0(); EN_1(); LCD_PORT = dat; _NOP(); _NOP(): EN_0(); ,液晶显示程序,/PB0-PB7接DB0-DB7; PC0(RS),PC1(RW),PC2(E) #define F_CPU 8000000UL #include #include #include #define _NOP() _asm_ _volatile_(“nop“:) /*/ / LCD定义 /*/ /LCD1602 写指令; #define clear_scr 0x01 /清屏 #define cursor_return 0x02 /光标回左上角 #define data_cur_right 0x06 /数据写入光标右移,AC+1 #define disp_on 0x0C /显示开 #define disp_off 0x08 /显示关 #define cursor_right 0x14 /整体显示,光标右移,AC+1 #define disp_line 0x38 /两行显示,5*7点阵,/LCD控制端口定义 #define LCD_CTRL_PORT PORTC #define LCD_CTRL_DDR DDRC /LCD 控制端口 /LCD数据端口定义 #define LCD_PORT PORTB /发送LCD数据端口 #define LCD_PIN PINB /读取LCD数据端口 #define LCD_DDR DDRB /LCD数据端口方向 / LCD控制功能定义 PC0(RS),PC1(RW),PC2(E) #define RS_0() LCD_CTRL_PORT &= 0xFE #define RS_1() LCD_CTRL_PORT |= 0x01 #define RW_0() LCD_CTRL_PORT &= 0xFD #define RW_1() LCD_CTRL_PORT |= 0x02 #define EN_0() LCD_CTRL_PORT &= 0xFB #define EN_1() LCD_CTRL_PORT |= 0x04,/ LCD忙等待 void LCD_BUSY_WAIT() LCD_CTRL_DDR |= 0x07;/设定控制端为cpu出 LCD_PORT = 0xFF; LCD_DDR = 0x00;/上拉输入 RS_0(); RW_1();EN_1(); _NOP(); _NOP(); _NOP();/针脚赋予一定电平后,加空延时再读针脚电平 while(LCD_PIN ,/ 写LCD数据寄存器 void Write_LCD_Data(unsigned char dat) LCD_BUSY_WAIT(); LCD_CTRL_DDR |= 0x07;/设定控制端为cpu出 LCD_DDR = 0xFF; RS_1(); RW_0(); EN_1(); LCD_PORT = dat; _NOP(); _NOP(); EN_0(); / LCD初始化 void Init_LCD() Write_LCD_Comm(disp_line); Write_LCD_Comm(clear_scr); Write_LCD_Comm(data_cur_right); Write_LCD_Comm(disp_on); ,/ 显示字符串,cDDRAM取值为0x00-0x0F,0x40-0x4F void LCD_ShowStr(char *str,unsigned char cDDRAM) unsigned int i; cDDRAM += 0x80; for(i=0; stri!=0; i+) if(cDDRAM 0x8F ,液晶显示程序运行演示,思考题,编写数位分解程序,将结果显示在液晶上。 提示:若给出的数值为-,则前面显示-;若给出的数值为小数,要能显示小数点。若给出的数字1,显示的第一位应该是0后面跟小数点。,附录:数位分解源程序。能正确的显示正负数,小数点。 #include #include #include /x要分解的数;ipoint保留几位小数点;cDisp_Buff显示缓冲区;iLen_Buff显示缓冲区长度 void Division_Unit(int x,int iPoint, char *cDisp_Buff,int iLen_Buff) int i = 0; /abs(x)+0中的字符数 int j; /计数器 int k; /小数点位置 char siLen_Buff; /abs(x)分解后字符串 char disp_buffiLen_Buff; /abs(x)添加小数点后的字符串 /清空显示缓冲区 for(j=0; jiLen_Buff-1; j+) cDisp_Buffi = 0; itoa(abs(x),s,10); /10进制分解字符串 /计算位数 while(si != 0) i+; k = i- iPoint;,if(k1) /若x=36,保留3位小数,则应显示0.036,其前应添加0.0三个字符 for(j=0;j=abs(k)+1;j+) if(j=1) disp_buffj = .; else disp_buffj = 0; disp_buffj=0; strcat(disp_buff,s); else if(k = i) /保留0位小数,直接显示sj for(j=0;j=k;j+) disp_buffj=sj; ,else / 若x=36,保留1为小数,中间应添加小数点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实验设备租赁合同
- 透明彩钢瓦采购合同协议
- 软包定制工程合同协议
- 连锁酒店经营合同协议
- 买方土地居间合同协议合同书
- 法律知识产权法试题集
- 路基路面检测合同协议
- 道具修缮费合同协议
- 邯郸拆迁协议书范本
- 日剧恋爱协议书
- 《埃菲尔铁塔》课件
- 形象设计概论试题及答案
- (三模)南通市2025届高三第三次调研测试英语试卷(含答案解析)
- 红细胞生成素靶向治疗策略-全面剖析
- 2025年留置辅警笔试真题及答案
- 不同来源硫酸软骨素的化学结构、抗氧化与降脂活性对比
- 小学政治 (道德与法治)人教部编版二年级下册14 学习有方法教学设计
- 广东省2024-2025学年佛山市普通高中教学质量检测英语试卷及答案(二)高三试卷(佛山二模)
- 高端定制店面管理制度
- 2025年上半年广州市海珠区海幢街道招考康园工疗站工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 预设理论在人工智能中的应用-深度研究
评论
0/150
提交评论