|
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
//LCD命令
#define LCD_CGR 0x22 //設(shè)置CGRAM偏移地址
#define LCD_dizhizhizhen 0x24 //設(shè)置地址指針
#define LCD_WenBen_qishi 0x40 //設(shè)置文本區(qū)起始地址
#define LCD_WenBen_kuandu 0x41 //設(shè)置文本區(qū)寬度
#define LCD_TuXing_qishi 0x42 //設(shè)置圖形區(qū)起始地址
#define LCD_TuXing_kuandu 0x43 //設(shè)置圖形區(qū)寬度
#define LCD_LuoJi_huo 0x80 //邏輯“或”模式
#define LCD_WenBen_texing 0x83 //文本特性模式
#define LCD_guanbixianshi 0x90 //關(guān)閉顯示
#define LCD_xieshezhi 0xb0 //數(shù)據(jù)自動(dòng)寫設(shè)置
#define LCD_duxiejieshu 0xb2 //數(shù)據(jù)自動(dòng)讀/寫結(jié)束
#define LCD_ShuJuJia_xie 0xc0 //數(shù)據(jù)寫,地址加1
#define LCD_ShuJuJia_du 0xc1 //數(shù)據(jù)讀,地址加1
#define LCD_ShuJuSame_xie 0xc4 //數(shù)據(jù)寫,地址不變
//設(shè)置控制位置
#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狀態(tài)檢查
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);
}
//寫數(shù)據(jù)
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);
}
//寫兩個(gè)命令
void Wr_Com2(uchar data,uchar com)
{
Wr_Data(data);
Wr_Com(com);
}
//寫三個(gè)命令
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); //寫數(shù)據(jù),位置不變
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); //寫數(shù)據(jù),位置不變
ADD+=30;
}
for(i=0;i<16;i++)
{
Wr_Com3(ADD,ADD>>8,0x24); //定位地址
Wr_Com2(data,0xc0); //寫數(shù)據(jù),位置+1
ADD+=30;
}
}
//清屏
void Screen_Clear(void)
{
uint i;
Wr_Com3(0x00,0x00,0x24); //設(shè)置從地址00開始
for(i=0;i<3840;i++) //點(diǎn)清零,一共清3840個(gè)點(diǎn)
{
Wr_Com2(0x55,0xc0); //一個(gè)一個(gè)清零
}
}
|
|