📄 lcd.c
字号:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
const unsigned char UserImg[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
void WriteUserImgLCM()
{
unsigned char i;
for(i=0;i<8;i++)
{
WriteCommandLCM(0x40|i,1);
WriteDataLCM(UserImg[i]);
}
}
//写数据函数: E =高脉冲 RS=1 RW=0
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_CTRL_PORT|=(1<<LCM_RS);//RS=1
LCM_CTRL_PORT&=~(1<<LCM_RW);//RW=0
LCM_CTRL_PORT&=~(1<<LCM_EN);//E=0,下面给LCD一个高脉冲
LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
LCM_DATA_PORT=WDLCM;
LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0
}
//写指令函数: E=高脉冲 RS=0 RW=0
void WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_CTRL_PORT&=~(1<<LCM_RS);//RS=0
LCM_CTRL_PORT&=~(1<<LCM_RW);//RW=0
LCM_CTRL_PORT&=~(1<<LCM_EN);//E=0,下面给LCD一个高脉冲
LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
LCM_DATA_PORT=WCLCM;
LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0
}
//读状态
void ReadStatusLCM(void)
{
LCM_BUSY_DDR&=~BUSY;//设置BUSY口为输入
LCM_CTRL_PORT&=~(1<<LCM_RS);//RS=0
LCM_CTRL_PORT|=(1<<LCM_RW);//RW=1
LCM_CTRL_PORT|=(1<<LCM_EN);//E=1
while(LCM_BUSY_PIN&BUSY);//等待LCD_DB7为0
LCM_CTRL_PORT&=~(1<<LCM_EN);//重设E=0
LCM_BUSY_DDR|=BUSY;//设置BUSY口为输出
}
void LCMInit(void) //LCM初始化
{
_delay_ms(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
_delay_ms(5);
WriteCommandLCM(0x38,0);
_delay_ms(5);
WriteCommandLCM(0x38,0);
_delay_ms(5);
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
//WriteCommandLCM(0x0F,1); // 显示开及光标设置(有光标)
WriteCommandLCM(0x0C,1); // 显示开及光标设置(无光标)
WriteUserImgLCM();
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 1); //发命令字
WriteDataLCM(DData); //发数据
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -