📄 lcd.c
字号:
//lcd.c
#include <string.h>
#include "lcd.h"
unsigned long data;
//HD44780 4位间接驱动需要的E端片选脉冲
void E_Pulse() {
IO0SET_bit.P0_28 = 1; // E=1
Delay(100);
IO0CLR_bit.P0_28 = 1; // E=0
}
void LCDInit() {
//配置4位数据线 D4, D5, D6, D7, 寄存器选择 RS, 读写 RW, 片选 E 为输出
IO0DIR_bit.P0_10 = 1; //D4
IO0DIR_bit.P0_11 = 1; //D5
IO0DIR_bit.P0_12 = 1; //D6
IO0DIR_bit.P0_13 = 1; //D7
IO0DIR_bit.P0_22 = 1; //RS
IO0DIR_bit.P0_29 = 1; //R/W
IO0DIR_bit.P0_28 = 1; //E
//LCD 初始化,4位间接驱动方式
IO0CLR_bit.P0_22 = 1; // RS = 0
IO0CLR_bit.P0_29 = 1; // R/W = 0
IO0CLR_bit.P0_28 = 1; // E = 0
Delay(10000); // 延时110ms
IO0SET_bit.P0_10 = 1; // D4 = 1
IO0SET_bit.P0_11 = 1; // D5 = 1
E_Pulse(); // E端片选脉冲
Delay(10000); // 延时10ms
IO0SET_bit.P0_10 = 1; // D4 = 1
IO0SET_bit.P0_11 = 1; // D5 = 1
E_Pulse(); // E端片选脉冲
Delay(10000); // 延时10ms
IO0SET_bit.P0_10 = 1; // D4 = 1
IO0SET_bit.P0_11 = 1; // D5 = 1
E_Pulse(); // E端片选脉冲
Delay(10000); // 延时10ms
IO0SET_bit.P0_11 = 1; // D5 = 1
IO0CLR_bit.P0_10 = 1; // D4 = 0
E_Pulse(); // E端片选脉冲
}
void LCDSendCommand(unsigned long a) { //向LCD发送控制命令
IO0CLR_bit.P0_29 = 1; // RW = 0
Delay(20000); // 延时2ms
data = 0x0;
data = 0xffffff0f | a; // 高4位
IO0CLR |= 0x00003c00; // 清0 D4-D7
data = data << 6;
IO0SET = (IO0SET | 0x00003c00) & data; // 置1 D4-D7
IO0CLR_bit.P0_22 = 1; // RS = 0 -> 命令方式
E_Pulse(); // E端片选脉冲
data = 0x0;
a = a<<4;
data = 0xffffff0f | a; // 高4位
IO0CLR |= 0x00003c00; // 清0 D4-D7
data = data << 6;
IO0SET = (IO0SET | 0x00003c00) & data; // 置1 D4-D7
IO0CLR_bit.P0_22 = 1; // RS = 0 -> 命令方式
E_Pulse(); // E端片选脉冲
}
void LCDSendChar(unsigned long a){ //向LCD发送控显示数据
IO0CLR_bit.P0_29 = 1; // RW = 0
Delay(20000); // 延时2ms
data = 0x0;
data = 0xffffff0f | a; // 高4位
IO0CLR |= 0x00003c00; // 清0 D4-D7
data = data << 6;
IO0SET = (IO0SET | 0x00003c00) & data; // 置1 D4-D7
IO0SET_bit.P0_22 = 1; // RS = 1 -> 数据方式
E_Pulse(); // E端片选脉冲
data = 0x0;
a = a<<4;
data = 0xffffff0f | a; // 高4位
IO0CLR |= 0x00003c00; // 清0 D4-D7
data = data << 6;
IO0SET = (IO0SET | 0x00003c00) & data; // 置1 D4-D7
IO0SET_bit.P0_22 = 1; // RS = 1 -> 数据方式
E_Pulse(); // E端片选脉冲
}
void LCDSendTxt(char* a) { //向LCD写入字符串
for(int i=0; i<strlen(a); i++) {
LCDSendChar(a[i]);
}
}
void Light(short a) {
if(a == 1) { // 按键1压下,开启LCD背光
IO0SET_bit.P0_21 = 1;
IO0DIR_bit.P0_21 = 1;
IO0SET_bit.P0_25 = 1;
IO0DIR_bit.P0_25 = 1;
}
if(a == 0) { // 按键2压下,关闭LCD背光
IO0SET_bit.P0_21 = 0;
IO0DIR_bit.P0_21 = 0;
IO0SET_bit.P0_25 = 0;
IO0DIR_bit.P0_25 = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -