240128液晶程式
#include io.h> //IO連線埠暫存器配置檔案,必須包含
#include delay.h> //GCC中的延時函式頭檔案
//連線埠位定義
#define CD PC6 //數據/命令控制端 1命令,0數據
#define RD PG1 //讀選擇控制端 0讀 選通信號 低電平有效 輸入信號
#define RW PG0 //寫選擇控制端 0寫 選通信號 低電平有效 輸入信號
#define E PE0 //使能端 低電平有效
//全局變數聲明
unsigned char LCD_DispBuff1[]=" AVR單片機";
unsigned char LCD_DispBuff2[]=" 240128液晶顯示";
unsigned char LCD_DispBuff3[]="程式設計: 慧淨電子";
unsigned char LCD_DispBuff4[]=" http://hi.baidu.com/szcgq";
//函式聲明
void Port_Init(void); //連線埠初始化
void LCD_Init(void); //LCD初始化
void Write_Com(unsigned char LCD_Com); //LCD寫指令
void Write_Data(unsigned char LCD_Data); //LCD寫數據
void Check_Busy(void); //讀寫檢測函式,每次對液晶操作前都要進行讀寫檢測
int main(void)
{
unsigned char Disp_Number;
Port_Init(); //連線埠初始化
LCD_Init(); //LCD初始化
//下面這段程式演示在LCD上顯市字元
Write_Com(0X80+0X00);
for(Disp_Number = 0;Disp_Number < 16;Disp_Number++)
{
Write_Data(LCD_DispBuff1[Disp_Number]);
_delay_ms(5);
}
Write_Com(0X90+0X00);
for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
{
Write_Data(LCD_DispBuff2[Disp_Number]);
_delay_ms(5);
}
Write_Com(0X88+0X00);
for(Disp_Number = 0;Disp_Number < 16;Disp_Number++)
{
Write_Data(LCD_DispBuff3[Disp_Number]);
_delay_ms(5);
}
Write_Com(0X98+0X00);
for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
{
Write_Data(LCD_DispBuff4[Disp_Number]);
_delay_ms(5);
}
while(1)
{
}
}
void Port_Init()//LCD數據連線埠設定
{
PORTA = 0X00; //
DDRA = 0XFF; //配置連線埠PA全部為輸出口,LCD數據連線埠
//LCD控制連線埠設定
PORTG = 0X00; //
DDRG |= (1 << CD) | (1 << RW) | (1 << E) ;
//DDRA |= (1 << RW) | (1 << E); //配置連線埠PG的第0、1為輸出口
PORTC =0x00;
DDRC |= (1 << CD); //配置連線埠PC的第6為輸出口
}
void LCD_Init()
{
Write_Com(0X01); //清屏
_delay_ms(5);
Write_Com(0X38); //顯示模式設定 16x2顯示,5x7點陣,8位數據接口
_delay_ms(5);
Write_Com(0X0f); //顯示開關控制,開顯示,游標顯示,游標閃爍
Write_Com(0X0c); //顯示開關控制,開顯示,游標不顯示,游標不閃爍
_delay_ms(5);
Write_Com(0X06); //游標設定,讀或寫一個字元後,地址指針加一,游標加一,整屏不移動
_delay_ms(5);
}
void Write_Com(unsigned char LCD_Com) //寫指令函式
{
Check_Busy();
PORTC |= (1 << CD); //CD=1,寫命令通道
PORTG &= ~(1 << RW); //RW=0,寫指令
PORTE &=~(1 << E); //E=0,寫操作
_delay_ms(5);
PORTA = LCD_Com; //指令送數據連線埠
PORTE |=(1 << E); //E=1,停止寫操作
_delay_ms(5);
}
void Write_Data(unsigned char LCD_Data) //寫數據函式
{
Check_Busy();
PORTC &= (1<< CD); //RS=0,寫數據
PORTG&= ~(1 << RW); //RW=0,寫指令
PORTE |= (1 << E); //E=0,寫操作
_delay_ms(5);
PORTA = LCD_Data; // 數據送數據連線埠
PORTE|=(1 << E); //E=1,停止寫操作
_delay_ms(5);
}
void Check_Busy()
{
DDRA = 0X00; //PB口置為輸入口,準備讀取數據
PORTC &= ~(1 << CD); //RS=0,讀命令
PORTG &=~(1 << RD); //RD=0,讀指令
PORTE &=~(1 << E); //E=0,使能
while(0X80 & PINA); //監測忙信號,直到忙信號為0,才能進行讀寫操作
PORTE &= ~(1 << E); //E=0
DDRA = 0XFF; //PB口置為輸出口,準備向連線埠傳送數據
}