📄 lcd_code.c
字号:
#include <iom16v.h>
#include <macros.h>
//#include<Delay.h>
//---------------变量类型宏定义-------------
#define uchar unsigned char
#define uint unsigned int
//-------------引脚电平-------------------
#define RS_1 PORTB|=BIT(PB0)
#define RS_0 PORTB&=~BIT(PB0)
#define RW_1 PORTB|=BIT(PB1)
#define RW_0 PORTB&=~BIT(PB1)
#define EN_1 PORTB|=BIT(PB2)
#define EN_0 PORTB&=~BIT(PB2)
//=================================
#define Dataport PORTC //数据端口
#define Busy 0x80 //忙信号
#define Xtal 8 //晶振
#define LCM_RS PORTD7 //选中指令寄存器
#define LCM_RW PORTD6 //写模式
#define LCM_EN PORTD5 //置LCM_EN 端为低电平,延时一会儿
//================================================================待显示字符
uchar str0[]="I LOVE AVR";
/*-----------------------------写指令到LCM 子函数-------------------------------*/
void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函数名为WriteCommandLCM 的写
指令到LCM 子函数。定义WCLCM、BusyC 为无符号字符型变量*/
{ //WriteCommandLCM 函数开始
if(BusyC)
{ReadStatusLCM();} /*若BusyC 为"1",则调用ReadStatusLCM 子
函数进行忙检测*/
Dataport=WCLCM; //将变量WCLCM 中的指令传送至P1 口
RS_0; //选中指令寄存器
RW_1; //写模式
EN_0; //置LCM_EN 端为低电平
EN_0; //置LCM_EN 端为低电平,延时一会儿
EN_1; //置LCM_EN 端为高电平,写入使能
} // WriteCommandLCM 函数结束
/*----------------------------写数据到LCM 子函数-------------------------------*/
void WriteDataLCM(uchar WDLCM) /*函数名为WriteDataLCM 的写数据到LCM 子函数。
定义WDLCM 为无符号字符型变量*/
{ // WriteDataLCM 函数开始
ReadStatusLCM(); //调用ReadStatusLCM 子函数检测忙信号
Dataport=WDLCM; //将变量WDLCM 中数据传送至P1 口
RS_1; //选中数据寄存器
RW_0; //写模式
EN_0; //置LCM_EN 端为低电平
EN_0; //置LCM_EN 端为低电平,延时一会儿
EN_1; //置LCM_EN 端为高电平,写入使能
} // WriteDataLCM 函数结束
/*--------------------------------读数据到MCU 子函数---------------------------*/
uchar ReadDataLCM(void) //函数名为ReadDataLCM 的读数据到MCU 子函数
{ // ReadDataLCM 函数开始
RS_1; //选中数据寄存器
RW_1; //读模式
EN_0; //置LCM_EN 端为低电平
EN_0; //置LCM_EN 端为低电平,延时一会儿
EN_1; //置LCM_EN 端为高电平,读使能
return(Dataport); //返回P1 口的内容
} // ReadDataLCM 函数结束
//--------------------------------读状态到MCU 子函数-----------------------------
uchar ReadStatusLCM(void) //函数名为ReadStatusLCM 的读状态到MCU 子函数
{ //ReadStatusLCM 函数开始
Dataport=0xFF; //置P1 口为全1
RS_0; //选中指令寄存器
RW_1; //读模式
EN_0; //置LCM_EN 端为低电平
EN_0; //置LCM_EN 端为低电平,延时一会儿
EN_1; //置LCM_EN 端为高电平,读使能
while(PORTC&Busy); //检测忙信号。当P1 口内容与Busy(80H)相与后不为零时,程序
//原地踏步
return(Dataport); //返回P1 口的内容
} // ReadStatusLCM 函数结束
/*--------------------------LCM 初始化子函数----------------------------*/
void InitLcd() //函数名为InitLcd 的LCM 初始化子函数
{ // InitLcd 函数开始
WriteCommandLCM(0x38,1);//8 位数据传送,2 行显示,5*7 字形,检测忙信号
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号
WriteCommandLCM(0x01,1);//清屏,检测忙信号
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
} // InitLcd 函数结束
/*-------------------显示指定座标的一个字符子函数---------------------------*/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y) X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/*--------------------显示指定座标的一串字符子函数----------------------*/
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength=0;
Y&=0x1;
X&=0xF;
while(X<=15)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
void Delay(uint i)
{
uint j;
for(i=0;i<0xff;i++);
{
for(j=0;j<0xff;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -