赞
踩
LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两
行
第 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 脚:背光源负极。
//电源
VSS – GND
VDD – 5V
//对比度
VO – GND
//控制线
RS – P1.0
RW – P1.1
E – P1.4
//背光灯
A – 5V
K – GDN
//数据
D0到D7 – P0.到P0.7
如何显示,在哪里显示?
例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实
际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)
#include "reg52.h" #include "intrins.h" /* RS -- P1.0 RW -- P1.1 E -- P1.4 */ #define databuffer P0 //定义8位数据线,Po端口组 sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^4; void check_busy() { char tmp = 0x80; databuffer = 0x80; while(tmp & 0x80){//1000 0000 RS = 0; RW = 1; EN = 0; _nop_(); EN = 1; _nop_(); _nop_(); tmp = databuffer; EN = 0; _nop_(); } } void Write_Cmd_Func(char cmd) { check_busy(); RS = 0; RW = 0; EN = 0; _nop_(); databuffer = cmd; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Write_Data_Func(char dataShow) { check_busy(); RS = 1; RW = 0; EN = 0; _nop_(); databuffer = dataShow; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Delay15ms() { unsigned char i, j; i = 27; j = 226; do { while (--j); } while (--i); } void Delay5ms() { unsigned char i, j; //@11.0592MHz //@11.0592MHz i = 9; j = 244; do { while (--j); }while (--i); } void LCD1602_INIT() { //(1)延时 15ms Delay15ms(); //(2)写指令 38H(不检测忙信号) Write_Cmd_Func(0x38); //(3)延时 5ms Delay5ms(); //(4)以后每次写指令,读/写数据操作均需要检测忙信号 //(5)写指令 38H:显示模式设置 Write_Cmd_Func(0x38); //(6)写指令 08H:显示关闭 Write_Cmd_Func(0x08); //(7)写指令 01H:显示清屏 Write_Cmd_Func(0x01); //(8)写指令 06H:显示光标移动设置 Write_Cmd_Func(0x06); //(9)写指令 0CH:显示开及光标设置} Write_Cmd_Func(0x0c); } void LCD1602_showLine(char row, char col, char *string) { switch(row){ case 1: Write_Cmd_Func(0x80+col); while(*string){ Write_Data_Func(*string); string++; } break; case 2: Write_Cmd_Func(0x80+0x40+col); while(*string){ Write_Data_Func(*string); string++; } break; } } void main() { char position = 0x80 + 0x05; //char dataShow = 'C'; LCD1602_INIT(); LCD1602_showLine(1,5,"NO.1"); LCD1602_showLine(2,0,"hello word"); }
databuffer对应P0口 ,dataShow对应要传输的字符,最终会被编译为ASCII 码。
假设 P0 = 0x68,这意味着你希望将 0x68(即二进制的 01101000)赋值给 P0 端口,使得 P0 端口的 8 个引脚分别对应这个二进制值的每一位。
步骤:
假设调用 LCD1602_showLine(1, 5, “hello”):
第一个字符 h 的 ASCII 码是 0x68,对应的二进制是 01101000。通过 databuffer = ‘h’;,P0 端口的8个引脚将变为 01101000,然后触发使能信号使LCD读取该字符。
第二个字符 e 的 ASCII 码是 0x65,对应的二进制是 01100101。通过 databuffer = ‘e’;,P0 端口的8个引脚将变为 01100101,然后触发使能信号使LCD读取该字符。
依此类推,直到发送完字符串中的所有字符
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。