?? main.c
字號:
/***********************************************
**** AVR使用范例 1602液晶顯示 ***
**** MCU: ATmega16 ***
**** 作者: maweili ***
**** 編譯器:usbisp ***
**** ***
**** 2008.11.17 ***
***********************************************/
//頭文件包含
#include <avr/io.h> //io端口寄存器配置文件,必須包含
#include <util/delay.h> //GCC中的延時函數頭文件
//端口位定義
#define RS PA4 //數據/命令控制端 0命令,1數據
#define RW PA5 //讀/寫選擇控制端 0寫,1讀
#define E PA6 //使能端 下降沿讀,高電平寫
//全局變量聲明
unsigned char LCD_DispBuff1[]="Let's study AVR";
unsigned char LCD_DispBuff2[]=" WWW.LT430.COM";
//函數聲明
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初始化
//在任意位置處顯示字符
Write_Com(0X80+0X05); //發送字符顯示位置指令。0x05可以換成00-0f,40-4f之間的任意值
Write_Data('a'); //發送要顯示的字符
/*
//下面這段程序演示在LCD上顯示兩行字符
Write_Com(0X80+0X00);
for(Disp_Number = 0;Disp_Number < 15;Disp_Number++)
{
Write_Data(LCD_DispBuff1[Disp_Number]);
_delay_ms(5);
}
Write_Com(0X80+0X40);
for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
{
Write_Data(LCD_DispBuff2[Disp_Number]);
_delay_ms(5);
}
*/
/*
//下面這段程序演示在LCD上顯示兩行字符,字符從屏幕右邊移動到屏幕左邊
Write_Com(0X80+0X10);
for(Disp_Number = 0;Disp_Number < 15;Disp_Number++)
{
Write_Data(LCD_DispBuff1[Disp_Number]);
_delay_ms(5);
}
Write_Com(0X80+0X50);
for(Disp_Number = 0;Disp_Number < 14;Disp_Number++)
{
Write_Data(LCD_DispBuff2[Disp_Number]);
_delay_ms(5);
}
for(Disp_Number = 0;Disp_Number < 16;Disp_Number++)
{
Write_Com(0X18);
_delay_ms(200);
}
*/
while(1)
{
}
}
void Port_Init()
{
//LCD數據端口設置
PORTB = 0X00; //
DDRB = 0XFF; //配置端口PB全部為輸出口,LCD數據端口
//LCD控制端口設置
PORTA = 0X00; //
DDRA |= (1 << RS) | (1 << RW) | (1 << E);
//DDRA |= (1 << RS) | (1 << RW) | (1 << E); //配置端口PA的第4、5、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();
PORTA &= ~(1 << RS); //RS=0,寫命令
PORTA &= ~(1 << RW); //RW=0,寫指令
PORTA |= (1 << E); //E=1,寫操作
_delay_ms(5);
PORTB = LCD_Com; //指令送數據端口
PORTA &= ~(1 << E); //E=0,停止寫操作
_delay_ms(5);
}
void Write_Data(unsigned char LCD_Data)
{
Check_Busy();
PORTA |= (1 << RS); //RS=1,寫數據
PORTA &= ~(1 << RW); //RW=0,寫指令
PORTA |= (1 << E); //E=1,寫操作
_delay_ms(5);
PORTB = LCD_Data; // 數據送數據端口
PORTA &= ~(1 << E); //E=0,停止寫操作
_delay_ms(5);
}
void Check_Busy()
{
DDRB = 0X00; //PB口置為輸入口,準備讀取數據
PORTA &= ~(1 << RS); //RS=0,讀命令
PORTA |= (1 << RW); //RW=1,讀指令
PORTA |= (1 << E); //E=1,使能
while(0X80 & PINB); //監測忙信號,直到忙信號為0,才能進行讀寫操作
PORTA &= ~(1 << E); //E=0
DDRB = 0XFF; //PB口置為輸出口,準備向端口發送數據
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -