#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
//LCD命令
#define LCD_CGR 0x22 //设置CGRAM偏移地址
#define LCD_dizhizhizhen 0x24 //设置地址指针
#define LCD_WenBen_qishi 0x40 //设置文本区起始地址
#define LCD_WenBen_kuandu 0x41 //设置文本区宽度
#define LCD_TuXing_qishi 0x42 //设置图形区起始地址
#define LCD_TuXing_kuandu 0x43 //设置图形区宽度
#define LCD_LuoJi_huo 0x80 //逻辑“或”模式
#define LCD_WenBen_texing 0x83 //文本特性模式
#define LCD_guanbixianshi 0x90 //关闭显示
#define LCD_xieshezhi 0xb0 //数据自动写设置
#define LCD_duxiejieshu 0xb2 //数据自动读/写结束
#define LCD_ShuJuJia_xie 0xc0 //数据写,地址加1
#define LCD_ShuJuJia_du 0xc1 //数据读,地址加1
#define LCD_ShuJuSame_xie 0xc4 //数据写,地址不变
//设置控制位置
#define WR PORTA4
#define RD PORTA5
#define CD PORTA6
#define CE PORTA7
#define LED PORTB1
void delay()
{
uchar i,j;
for(i=0;i<256;i++)
{
for (j=0;j<256;j++)
{
;
}
}
}
//端口初始化
void Init_IO(void)
{
DDRA=0xf8; //A0.A1.A2输入,其余输出
PORTA=0xf0; //0B 11110000
DDRB=0xd6; //B2.B3.B4输入,其余输出
PORTB=0x06; //0B 00000011
//DDRD=
//PORTD=
DDRC=0xff;
PORTC=0x00;
}
unsigned char a_456[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
void LCD_STA01_CHECK(void)
{
DDRC=0x00; //方向输入
PORTA|=(1<<CD); //CD=1
PORTA&=~(1<<RD); //RD=0
PORTA&=~(1<<WR); //WR=0;
while((PINA&0x03)!=0x03);
//'NOP'();
delay();
PORTA|=(1<<RD); //RD=1
DDRC=0xFF; //切换输出
}
//STA3状态检查
void LCD_STA3_CHECK(void)
{
DDRC=0x00; //方向输入
PORTA|=(1<<CD); //CD=1
PORTA&=~(1<<RD); //RD=0
while((PINA&0x08)!=0x08);
delay();
PORTA|=(1<<RD); //RD=1
DDRC=0xFF; //切换输出
}
//写命令
void Wr_Com(uchar com)
{
//LCD_STA01_CHECK(); //检查STA01
PORTA|=(1<<CD); //CD=1
PORTA&=~(1<<CE);
PORTA|=(1<<RD);
PORTA&=~(1<<WR);
PORTC=com; //
delay();
PORTA|=(1<<WR); //WR=1
PORTA|=(1<<CE);
}
//写数据
void Wr_Data(uchar data)
{
//LCD_STA01_CHECK(); //检查STA01
PORTA&=~(1<<CD); //CD=0
PORTA&=~(1<<CE);
PORTA|=(1<<RD);
PORTA&=~(1<<WR);
PORTC=data;
delay();
PORTA|=(1<<WR); //WR=0
PORTA|=(1<<CE);
}
//写两个命令
void Wr_Com2(uchar data,uchar com)
{
Wr_Data(data);
Wr_Com(com);
}
//写三个命令
void Wr_Com3(uchar data1,uchar data2,uchar com)
{
Wr_Data(data1);
Wr_Data(data2);
Wr_Com(com);
}
//写字符
void Wr_Char(uchar x,uchar y,uchar *data)
{
uint i;
uchar ADD;
ADD=x*30+y; //地址公式
for(i=0;i<16;i++)
{
Wr_Com3(ADD,ADD>>8,0x24); //定位地址
Wr_Com2(*data,0xc4); //写数据,位置不变
ADD+=30;
}
}
//写文字
void Wr_TXT(uchar x,uchar y,uchar data)
{
uint i;
uchar ADD;
ADD=x*30+y; //地址公式
for(i=0;i<16;i++)
{
Wr_Com3(ADD,ADD>>8,0x24); //定位地址
Wr_Com2(data,0xc4); //写数据,位置不变
ADD+=30;
}
for(i=0;i<16;i++)
{
Wr_Com3(ADD,ADD>>8,0x24); //定位地址
Wr_Com2(data,0xc0); //写数据,位置+1
ADD+=30;
}
}
//清屏
void Screen_Clear(void)
{
uint i;
Wr_Com3(0x00,0x00,0x24); //设置从地址00开始
for(i=0;i<3840;i++) //点清零,一共清3840个点
{
Wr_Com2(0x55,0xc0); //一个一个清零
}
}
|