📄 lcm1602.c
字号:
#include<iom16v.h>
#include<eeprom.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define LCM1602_RS 3 //PA3
#define LCM1602_RW 2 //PA2
#define LCM1602_EN 1 //PA1
#define LCM1602_RS_1 PORTA|=BIT(PA3) //RS脚输出高电平的宏定义
#define LCM1602_RS_0 PORTA&=~BIT(PA3) //RS脚输出高电平的宏定义
#define LCM1602_RW_1 PORTA|=BIT(PA2) //RW脚输出高电平的宏定义
#define LCM1602_RW_0 PORTA&=~BIT(PA2) //RW脚输出高电平的宏定义
#define LCM1602_EN_1 PORTA|=BIT(PA1) //EN脚输出高电平的宏定义
#define LCM1602_EN_0 PORTA&=~BIT(PA1) //EN脚输出高电平的宏定义
#define dataport PORTC //数据端口宏定义
#define Busy 0x80 //忙信号的宏定义
#define XTAL 8 //晶振频率宏定义
/*****************1ms延时程序*********************
void Delay_nms(uint n)
{
uint i,j=0;
while(j<n)
{
for(i=1;i<(uint)(XTAL*143-2);i++)
{;}
j++;
}
}
/*************************************************/
/*****************LCD初始化函数*********************/
void InitLcd(void)
{
LcdWriteCommand(0x38,1);//8位数据传送,2行显示,5*7字型,检测忙信号
Delay_nms(1);
LcdWriteCommand(0x0c,1);//开显示,检测忙信号
Delay_nms(1);
LcdWriteCommand(0x06,1);//LCD显示光标移动设置,整屏显示不移动)
Delay_nms(1);
LcdWriteCommand(0x01,1);//清屏,检测忙信号
Delay_nms(1);
LcdWriteCommand(0x0f,1);//显示屏打开,光标不闪烁,检测忙信号
Delay_nms(1);
//LcdWriteCommand(0x1c,1);
}
/*****************写命令到LCD函数*********************/
void LcdWriteCommand(uchar CMD,uchar Attribc)
{
if(Attribc)WaitForEnable();
LCM1602_RS_0;LCM1602_RW_0;_NOP();
dataport=CMD;_NOP();_NOP();
LCM1602_EN_1;_NOP();_NOP();LCM1602_EN_0;
}
/*****************写数据到LCD函数*********************/
void LcdWriteData(uchar data)
{
WaitForEnable();
LCM1602_RS_1;LCM1602_RW_0;_NOP();
dataport=data;_NOP();
LCM1602_EN_1;_NOP();_NOP();LCM1602_EN_0;
}
/*****************检测LCD忙信号函数*********************/
void WaitForEnable(void)
{
uchar val;
dataport=0xff;
LCM1602_RS_0;LCM1602_RW_1;_NOP();
LCM1602_EN_1;_NOP();_NOP();
DDRC=0x00;//注意端口方向
val=PINC;//注意端口方向
while(val&Busy){val=PINC;}//注意端口方向
LCM1602_EN_0;
DDRC=0xff;//注意端口方向
}
/*****************显示指定坐标的一个字符函数*****************/
void Displayonechar(uchar x,uchar y,uchar data)
{
LocateXY(x,y);
LcdWriteData(data);
}
/********************显示光标定位子函数*********************/
void LocateXY(uchar posx,uchar posy)
{
uchar temp;
temp&=0x7f;
temp=posx&0x0f;
posy&=0x01;
if(posy)temp|=0x40;
temp|=0x80;
LcdWriteCommand(temp,0);
}
/*************显示指定坐标的一串字符函数*********************/
void eputstr(uchar x,uchar y,const uchar *ptr)
{
uchar i,l=10;
while(ptr[l]>31){l++;}
for(i=0;i<l;i++)
{
Displayonechar(x++,y,ptr[i]);
if(x==16)
{
x=0;
y^=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -