lcd1602液晶操作方法
控制任务:在显示屏上显示两行字,同时移动它们。
程序如下:
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit lcden = P3 ^ 4; // lcd使能
sbit lcdrs = P3 ^ 5; // lcd数据和指令选择
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
void init();
void writeCommand(uchar command);
void writeData(uchar dat);
void showMessage(uchar* message, uchar posCursor);
void clearMessage();
void delay5ms();
void delay100ms();
void moveString(uchar* message, uchar direction);
void main() {
uchar* message1 = "I like programming";
uchar* message2 = "Hello, World!";
init();
showMessage(message1, 0x00);
// clearMessage();
showMessage(message2, 0x40);
// 当移动两个message2时,整个屏幕上的字符都会移动
moveString(message2, 0);
while (1)
;
}
/**
* @brief 移动指定字符串
* @note
* @param message: 待移动的字符串,移动前首先要在lcd缓存中
* @param direction: 0 向左,1向右
* @retval None
*/
void moveString(uchar* message, uchar direction) {
for (; *message != '\0'; message++) {
if (direction == 0) {
writeCommand(0x18);
} else if (direction == 1) {
writeCommand(0x1c);
}
delay100ms();
}
}
/**
* @brief 清屏
* @note
* @retval None
*/
void clearMessage() { writeCommand(0x01); }
/**
* @brief 在指定的位置显示指定的字符
* @note
* @param message: 显示的字符
* @param posCursor: 字符的启示位置,0x00第一行首显示,0x40第二行首
* @retval None
*/
void showMessage(uchar* message, uchar posCursor) {
uchar firstPos = 0x80;
writeCommand(firstPos + posCursor);
for (; *message != '\0'; message++) {
writeData(*message);
}
}
/**
* @brief 发送数据给LED
* @note write_data('1'), 发送字符1,显示在led屏上
* @param dat: 待发送的数据
* @retval None
*/
void writeData(uchar dat) {
lcdrs = 1;
P0 = dat;
delay5ms();
lcden = 1;
delay5ms();
lcden = 0;
delay5ms();
}
/**
* @brief 发送指令
* @note
* @param command: 为待发送的指令码
* @retval None
*/
void writeCommand(uchar command) {
lcdrs = 0; // lcdrs为数据和命令选择,低电平为命令,高电平为数据
P0 = command;
delay5ms();
lcden = 1;
delay5ms();
lcden = 0;
delay5ms();
}
/**
* @brief 初始化相关设置,其中dula,wela为关闭数码管,防止干扰
* @note
* @retval None
*/
void init() {
dula = 0;
wela = 0;
lcden = 0; // lcd使能
writeCommand(0x38);
writeCommand(0x0e);
writeCommand(0x06);
writeCommand(0x01);
}
void delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 54;
j = 199;
do {
while (--j)
;
} while (--i);
}
void delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do {
while (--j)
;
} while (--i);
}