本文主要是介绍LCD1602显示屏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LCD1602显示
-
概述
LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)
-
引脚说明
//电源 VSS -- GND VDD -- 5V //对比度 VO -- GND //控制线 RS -- P1.0 RW -- P1.1 E -- P1.4 //背光灯 A -- 5V K -- GDN //数据 D0到D7 -- P0.0到P0.7
-
开发逻辑
-
在哪里显示
例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)
-
显示什么
-
读写操作时序
-
读操作时序
-
写操作时序
-
数序参数
-
-
显示一个字符
#include "reg52.h" #include "intrins.h"#define BUFF P0 /* 控制线接口: RS -- P1.0 RW -- P1.1 E -- P1.4 */ sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy()//每次写指令,读/写数据操作均需要检测忙信号 {char tmp = 0x80;BUFF = 0x80;while(tmp & 0x80){RS = 0;RW = 1;EN = 0;_nop_();EN = 1;_nop_();tmp = BUFF;_nop_();_nop_();EN = 0;_nop_();} }void Write_cmd(char cmd)//写指令 {check_busy();RS = 0;RW = 0;EN = 0;_nop_();BUFF = cmd;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_(); } void Write_data(char _data)//写数据 {check_busy();RS = 1;RW = 0;EN = 0;_nop_();BUFF = _data;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_(); } void Delay15ms() //@11.0592MHz {unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i); } void Delay5ms() //@11.0592MHz {unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i); }void LCD1602_init()//LCD1602初始化 {//(1)延时 15msDelay15ms();//(2)写指令 38H(不检测忙信号)Write_cmd(0x38);//(3)延时 5msDelay5ms();//(4)以后每次写指令,读/写数据操作均需要检测忙信号//(5)写指令 38H:显示模式设置Write_cmd(0x38);//(6)写指令 08H:显示关闭Write_cmd(0x08);//(7)写指令 01H:显示清屏Write_cmd(0x01);//(8)写指令 06H:显示光标移动设置Write_cmd(0x06);//(9)写指令 0CH:显示开及光标设置Write_cmd(0x0c);} void main() {char cmd = 0x80 + 0x05;//第一行第五个位置char _data = 'C';LCD1602_init();Write_cmd(cmd);Write_data(_data); }
-
显示一行字符
#include "reg52.h" #include "intrins.h"#define BUFF P0 /* 控制线接口: RS -- P1.0 RW -- P1.1 E -- P1.4 */ sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy()//每次写指令,读/写数据操作均需要检测忙信号 {char tmp = 0x80;BUFF = 0x80;while(tmp & 0x80){RS = 0;RW = 1;EN = 0;_nop_();EN = 1;_nop_();tmp = BUFF;_nop_();_nop_();EN = 0;_nop_();} }void Write_cmd(char cmd)//写指令 {check_busy();RS = 0;RW = 0;EN = 0;_nop_();BUFF = cmd;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_(); } void Write_data(char _data)//写数据 {check_busy();RS = 1;RW = 0;EN = 0;_nop_();BUFF = _data;_nop_();EN = 1;_nop_();_nop_();EN = 0;_nop_(); } void Delay15ms() //@11.0592MHz {unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i); } void Delay5ms() //@11.0592MHz {unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i); }void LCD1602_init()//模块初始化 {//(1)延时 15msDelay15ms();//(2)写指令 38H(不检测忙信号)Write_cmd(0x38);//(3)延时 5msDelay5ms();//(4)以后每次写指令,读/写数据操作均需要检测忙信号//(5)写指令 38H:显示模式设置Write_cmd(0x38);//(6)写指令 08H:显示关闭Write_cmd(0x08);//(7)写指令 01H:显示清屏Write_cmd(0x01);//(8)写指令 06H:显示光标移动设置Write_cmd(0x06);//(9)写指令 0CH:显示开及光标设置Write_cmd(0x0c);} void LCD1602_print_line(char line,char col,char *string)//写入一行数据 {switch(line){//switch选择那一行case 1:Write_cmd(0x80+col);//col 决定从哪个地方开始while(*string){Write_data(*string);string++;}break;case 2:Write_cmd(0x80+0x40+col);while(*string){Write_data(*string);string++;}break;} } void main() {LCD1602_init();LCD1602_print_line(1,0,"hello world");LCD1602_print_line(2,0,"to be number one"); }
这篇关于LCD1602显示屏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!