📄 lcd.c
字号:
#include "lcd.h"
#include <avr/io.h>
#include "delay.h"
#define RS PD4
#define RW PD5
#define EN PD7
#define DataLcd PORTA
#define DataLcdIn PINA
#define DataOut DDRA = 0XFF
#define DataIn DDRA = 0
#define RS_0 PORTD &=~ (1<<RS)
#define RS_1 PORTD |= (1<<RS)
#define RW_0 PORTD &=~ (1<<RW)
#define RW_1 PORTD |= (1<<RW)
#define EN_0 PORTD &=~ (1<<EN)
#define EN_1 PORTD |= (1<<EN)
void ClearLcd(void)
{
EN_0;
RS_0;
RW_0;
DataOut;
DataLcd = 1;
delay_us(200);
EN_1;
delay_us(300);
EN_0;
delay_us(300);
RS_1;
RW_1;
}
/**/
void home(void)
{
RS_0;
RW_0;
DataLcd = 2;
delay_us(100);
EN_1;
delay_us(100);
EN_0;
delay_us(100);
RS_1;
RW_1;
}
void InputSet(void)
{
RS_0;
RW_0;
DataLcd = 6; //
delay_us(100);
EN_1;
delay_us(100);
EN_0;
delay_us(100);
RS_1;
RW_1;
}
void VisionSet(void)
{
EN_0;
RS_0;
RW_0;
DataLcd = 0x0f; //设置D=1,C=1,B=1
delay_us(100);
EN_1;
delay_us(100);
EN_0;
delay_us(100);
RS_1;
RW_1;
}
void FunctionSet(void)
{
DataOut;
EN_0;
RS_0;
RW_0;
DataLcd = 0x38; //设置DL=1,N=1,F=0
delay_us(100); //地址建立时间,最小140ns
EN_1;
delay_us(100); //脉冲宽度,最小450ns
EN_0;
delay_us(100); //地址保持时间,最小10ns
RS_1;
RW_1;
}
void CgramSet(void)
{
}
void DdramSet(unsigned char addr)
{
EN_0;
RS_0;
RW_0;
DataLcd = (0x80+addr); //
delay_us(100);
EN_1;
delay_us(100);
EN_0;
delay_us(100);
RS_1;
RW_1;
}
unsigned char BFRead(void)
{
unsigned char bf;
RS_0;
RW_1;
delay_us(100);
EN_1;
delay_us(100);
DataIn;
bf = DataLcdIn;
EN_0;
delay_us(100);
RS_1;
RW_0;
return bf;
}
void LCDReady(void)
{
unsigned char bf;
do
{bf = BFRead();
//PORTA = bf; //just for debug
}
while((bf&0x80)==0x80);
DataOut;
}
void CharWrite(unsigned char data)
{
LCDReady();
RS_1;
RW_0;
DataLcd = data; //
delay_us(100);
EN_1;
delay_us(100);
EN_0;
delay_us(100);
RS_0;
RW_1;
}
void LcdInit(void)
{
FunctionSet();
LCDReady();
DdramSet(0);
LCDReady();
VisionSet();
LCDReady();
InputSet();
LCDReady();
ClearLcd();
LCDReady();
home();
delay_us(10);
}
void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
{
unsigned char addr;
if (addry==1)
{
addr = addrx;
}
else if (addry==2)
{
addr = (addrx+0x40);
}
else
{
addr = 0;
}
DdramSet(0); //初始化ddram地址
LCDReady();
DdramSet(addr); //设定ddram地址
delay_us(80);
while(*s)
{
CharWrite(*s);
s++;
delay_us(80); //等待写入操作完成
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -