📄 lcd.c
字号:
/****************************************************************************
* File: LCD.c
* 功能: LCD输出
****************************************************************************/
#include "config.h"
#define rs (1<<10) // 0000 0100 0000 0000 = 0x0400
#define rw (1<<11) // 0000 1000 0000 0000 = 0x0800
#define en (1<<12) // 0001 0000 0000 0000 = 0x1000
#define busy (1<<9) // 0000 0010 0000 0000 = 0x0200
uint32 IO0DIR_bak;
uint32 IO0SET_bak;
uint32 IO0CLR_bak;
/****************************************************************************
* 名称:ChkBusy()
* 功能:检查总线是否忙
****************************************************************************/
void ChkBusy()
{
IO0DIR_bak=IO0DIR;
IO0DIR=0x1c00; // 0001 1100 0000 0000 P10~P12 即 en, rw, rs 设置为输出, 其他为输入。
while(1)
{
IO0CLR=rs; // 置 rs 为 0
IO0SET=rw; // 置 rw 为 1
IO0SET=en; // 置 en 为 1, 禁用 LED
if(!(IO0PIN & busy))break; // 测试最低位数据,如果为低,总线空闲,跳出循环。
IO0CLR=en; // 置 en 为 0,使能 LCD
}
IO0DIR=0x1ffc; // 将 P0.2~P0.12 设置为输出 0001 1111 1111 1100
IO0DIR=IO0DIR_bak;
}
/****************************************************************************
* 名称:WrOp()
* 功能:写操作数函数
****************************************************************************/
void WrOp(uint8 dat)
{
ChkBusy();
IO0CLR=rs; //全部清零
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
* 名称:WrDat()
* 功能:写数据函数
****************************************************************************/
void WrDat(uint8 dat)
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff; //先清零
IO0SET=dat; //再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
* 名称:lcd_init()
* 功能:lcd初始化函数
****************************************************************************/
void lcd_init(void)
{
WrOp(0x38);
WrOp(0x06); //光标加1
WrOp(0x0c); //开显示
}
/****************************************************************************
* 名称:DisText()
* 功能:显示文本函数
****************************************************************************/
void DisText(uint8 addr,uint8 *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -