#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); //一個一個清零
}
}
|