📄 lcd.c
字号:
// LCD型号:TC802B
// P0为数据口线
#include "../header/lcd.h"
/***********************************************
函 数: InitLcdMouble
功 能: 初始化TCB802B所有内部寄存器
输 入: /
输 出: /
描 述: /
***********************************************/
void InitLcdMouble(void)
{
WriteLcdCmd(0x01); // 清屏命令
Delay(3); // 延时3ms
WriteLcdCmd(0x38); // 8位数据接口,两行5x7点显示
Delay(3); // 延时3ms
WriteLcdCmd(0x06); // 地址从左至右,自动加1
Delay(3); // 延时3ms
WriteLcdCmd(0x0c); // 开显示,光标关闭,无闪烁
LcdDclear();
LcdDisplay(&logo,0x10);
}
/***********************************************
函 数: WriteLcdCmd
功 能: 写TCB802B一个内部寄存器
输 入: CmdValue
输 出: /
描 述: /
***********************************************/
void WriteLcdCmd(uchar CmdValue)
{
LCD_Rs = false; // 选择指令寄存器
LCD_Rw = false; // 选择写使能
LCD_En = true;
Delay(1); // 延时1ms
P0 = CmdValue;
Delay(1); // 延时1ms
LCD_En = false; // 下降沿触发锁定
LCD_Rw = true; // 恢复默认读使能
LCD_Rs = true; // 恢复默认数据寄存器
}
/***********************************************
函 数: WriteLcdData
功 能: 写TCB802B一个显示数据
输 入: DataValue
输 出: /
描 述: /
***********************************************/
void WriteLcdData(uchar DataValue)
{
LCD_Rw = false; // 选择写使能
Delay(1); // 延时1ms
LCD_En = true;
Delay(1); // 延时1ms
P0 = DataValue;
Delay(1); // 延时1ms
LCD_En = false; // 下降沿触发锁定
LCD_Rw = true; // 恢复默认读使能
}
/***********************************************
函 数: Lcd_Display_Hex()
功 能: 显示十六进制数据在LCD上
输 入: /
输 出: /
描 述: /
***********************************************/
void Lcd_Display_Hex(uchar hex)
{
uchar temp;
temp = hex;
temp >>= 0x04;
/* 以下程序为把十六进制数据换为LCD显示的字模 */
if((temp&0x0f) >= 0x0a)
WriteLcdData((temp&0x0f)+0x37);
else
WriteLcdData((temp&0x0f)+0x30);
if((hex&0x0f) >= 0x0a)
WriteLcdData((hex&0x0f)+0x37);
else
WriteLcdData((hex&0x0f)+0x30);
}
/***********************************************
函 数: LcdDisplay
功 能: 显示缓冲区数据
输 入: buffer,number
输 出: /
描 述: 从LCD第一个位置开始显示number个数据
***********************************************/
void LcdDisplay(uchar *buffer,uchar number)
{
uchar i;
uchar temp;
WriteLcdCmd(0x08); //关显示,光标关闭,无闪烁
Delay(3); // 延时3ms
if(number>0x08)
{
temp = number - 0x08;
WriteLcdCmd(0x80); // 设置DDRAM地址第一行
Delay(3); // 延时3ms
for(i=0x00;i<0x08;i++)
{
WriteLcdData(*buffer);
buffer ++;
}
Delay(3); // 延时3ms
WriteLcdCmd(0xc0); // 设置DDRAM地址第二行
Delay(3); // 延时3ms
for(i=0x00;i<temp;i++)
{
WriteLcdData(*buffer);
buffer ++;
}
}
else
{
WriteLcdCmd(0x80); // 设置DDRAM地址第一行
Delay(3); // 延时3ms
for(i=0x00;i<number;i++)
{
WriteLcdData(*buffer);
buffer ++;
}
}
WriteLcdCmd(0x0c); // 开显示,光标关闭,无闪烁
}
/***********************************************
函 数: Lcd_Display_Character
功 能: 显示一个字符
输 入: /
输 出: /
描 述: /
***********************************************/
void Lcd_Display_Character(uchar character)
{
WriteLcdData(character);
}
/***********************************************
函 数: LcdDclear
功 能: 清除缓冲区数据
输 入: /
输 出: /
描 述: /
***********************************************/
void LcdDclear(void)
{
uchar i;
WriteLcdCmd(0x08); // 关显示,光标关闭,无闪烁
Delay(3); // 延时3ms
WriteLcdCmd(0x80); // 设置DDRAM地址第一行
Delay(3); // 延时3ms
for(i=0x00;i<0x08;i++)
{
WriteLcdData(0x20);
}
Delay(3); // 延时3ms
WriteLcdCmd(0xc0); // 设置DDRAM地址第二行
Delay(3); // 延时3ms
for(i=0x00;i<0x08;i++)
{
WriteLcdData(0x20);
}
WriteLcdCmd(0x0c); // 开显示,光标关闭,无闪烁
}
/***********************************************
函 数: Delay
功 能: 延时X(0x00-0xff)毫秒
输 入: X
输 出: /
描 述: 误差1ms,要求有定时器定时1ms,使用全局变量Time_count
***********************************************/
void Delay(uchar X)
{
Time_Count = X;
while(Time_Count)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -