📄 lcd.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define delay125ns NOP()
#define delay250ns NOP();NOP()
#define delay500ns NOP();NOP();NOP();NOP()
//;NOP()
#define delay1us NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
#define delay2us delay1us;delay1us
#define RS PD4
#define RW PD5
#define EN PD7
#define DataLcd PORTB
#define DataLcdIn PINB
#define DataOut DDRB = 0XFF
#define DataIn DDRB = 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)
/*时钟为8MHZ* /
void delay_1us(void)
{
asm("nop");
}
void delay_us(unsigned int itimes)
{
unsigned int itemp;
for (itemp=0;itemp<itimes;itemp++)
{
delay_1us();
}
}
/**/
void ClearLcd(void)
{
EN_0;
RS_0;
RW_0;
DataOut;
DataLcd = 1;
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_1;
RW_1;
}
/**/
void home(void)
{
RS_0;
RW_0;
DataLcd = 2;
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_1;
RW_1;
}
void InputSet(void)
{
RS_0;
RW_0;
DataLcd = 6; //
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_1;
RW_1;
}
void VisionSet(void)
{
EN_0;
RS_0;
RW_0;
DataLcd = 0x0f; //设置D=1,C=1,B=1
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_1;
RW_1;
}
void FunctionSet(void)
{
DataOut;
EN_0;
RS_0;
RW_0;
DataLcd = 0x38; //设置DL=1,N=1,F=0
delay250ns; //地址建立时间,最小140ns
EN_1;
delay500ns; //脉冲宽度,最小450ns
EN_0;
delay125ns; //地址保持时间,最小10ns
RS_1;
RW_1;
}
void CgramSet(void)
{
}
void DdramSet(unsigned char addr)
{
EN_0;
RS_0;
RW_0;
DataLcd = (0x80+addr); //
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_1;
RW_1;
}
unsigned char BFRead(void)
{
unsigned char bf;
RS_0;
RW_1;
delay250ns;
EN_1;
delay500ns;
DataIn;
bf = DataLcdIn;
EN_0;
delay125ns;
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; //
delay250ns;
EN_1;
delay500ns;
EN_0;
delay125ns;
RS_0;
RW_1;
}
void LcdInit(void)
{
LCDReady();
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); //等待写入操作完成
}
}
void DataWrite(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!=0XFF)
{
CharWrite((*s)+0x30);
s++;
delay_us(80); //等待写入操作完成
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -