LCD1602(Liquid Crystal Display), 每行可显示16个字符共2行。
Vss:电源接地。 VDD:电源正极。 VL:液晶显示偏压。可以接0~5V调节屏幕的对比度,电压越高对比度越低,对比度越高显示效果越鲜艳。 RS:数据/命令选择端。RS=1时选择数据寄存器,RS=0时选择指令寄存器。 RW:读写选择端。RW=1时读操作(读取LCD内数据),RW=0时写操作(向LCD写入数据)。 E:使能信号。当E为下降沿(从高电平到低电平)时LCD执行写入的指令。 D0~D7:8位双向数据总线。 A:背光源正极 K:背光源负极
write_data(unsigned char show_data) { read_busy_flag() // 判忙 RS = 1; // RS为高电平,选择数据寄存器 RW = 0; // RW为低电平,写操作 E = 0; // E使能端拉低 Px = show_data; // 将数据赋给8位数据总线DB0-DB7,这里的Px为LCD上8位数据总线所连接的单片机IO端口 delay(); // 延时 E = 1; // 使能端拉高 delay(); // 延时 E = 0; // 使能端拉低,下降沿有效,数据写入DDRAM }
write_cmd(unsigned char cmd) { read_busy_flag(); // 判忙 RS = 0; // RS为高电平,选择指令寄存器 RW = 0; // RW为低电平,写操作 Px = cmd; // 将指令赋给8位数据总线DB0-DB7 delay(); // 延时 E = 1; // 使能端拉高 delay(); // 延时 E = 0; // 使能端拉低,下降沿有效。 }
lcd_init() { write_cmd(0x06) // 指令5,屏幕不动,地址+1 write_cmd(0x38); // 指令6,16*2,5*8点阵8位数据 write_cmd(0x0c); // 指令4,显示开光标关 write_cmd(0x01); // 指令1,清屏 }
read_busy_flag() { unsigned char flag; // flag为LCD状态标志 Px = 0xFF; // 给8位数据总线赋值11111111 RS = 0; // 选择指令寄存器,读取LCD状态字 RW = 1; // 读操作 do { E = 1; // 使能端拉高 flag = Px; // 读取LCD状态 E = 0; // 使能端拉低 } while(flag & 0x80); // 如果DB7依然为1,表示忙,直到DB7为0时跳出 }