配置:
ATMega16L @3.3V @7.3728MHz 1602B LCD @5.0V @6 lines Compiler: WinAVR 20060125
我自己搭的萬(wàn)用板,1602用5V供電,M16用3.3V供電。為了使LCD盡快投入運(yùn)轉(zhuǎn),同時(shí)也因?yàn)閼卸?nbsp;... 便參考了網(wǎng)站上很多的1602的帖子,包括網(wǎng)站收集帖,程序下載后稍加修改,編譯通過(guò),下載到M16中,總是沒(méi)有反應(yīng)。
在這個(gè)過(guò)程中,我確信我的1602硬件是沒(méi)有問(wèn)題的,因?yàn)槲沂诸^上有個(gè)以前用51做的時(shí)間溫度計(jì)(1602+18B20),放到上面都能正常顯示。
整個(gè)過(guò)程中,感覺(jué)不管是網(wǎng)站收集的精華帖,還是普通帖子里面的1602程序,冗長(zhǎng)繁雜 ... 比如我在一個(gè)帖子中,看到的一個(gè)1602的初始化函數(shù),居然用了10幾行代碼!我在51中,不過(guò)也就4句而已啊 ...
后來(lái),遇到了下面的程序,簡(jiǎn)明扼要,一次成功。當(dāng)然,這也是從論壇中COPY的,我做了一些修改:
#include <avr/io.h>
#define LCD_EN_PORT PORTC #define LCD_RW_PORT PORTC #define LCD_RS_PORT PORTC #define LCD_DATA_PORT PORTA #define LCD_DATA_DDR DDRA #define LCD_DATA_PIN PINA
//LCD的 r/w 腳直接接 GND #define LCD_EN 0x80 //portd7 out #define LCD_RS 0x40 //portc6 out #define LCD_DATA 0xF0 //porta 4/5/6/7 out
/*-------------------------------------------------------------------------------------------------- Public function prototypes --------------------------------------------------------------------------------------------------*/ void LCD_init (void); void LCD_en_write (void); void LCD_write_char (unsigned command,unsigned data); void LCD_set_xy (unsigned char x, unsigned char y); void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s); void delay_nus (unsigned int n); void delay_nms (unsigned int n);
void LCD_init(void) //液晶初始化 { delay_nms(15); DDRA |= LCD_DATA; // 數(shù)據(jù)為輸出 DDRC |= LCD_RS | LCD_EN; //置位RS.EN LCD_write_char(0x28,0); //4位顯示 LCD_write_char(0x0c,0); //顯示開(kāi) LCD_write_char(0x01,0); //清屏 delay_nms(60); }
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) { LCD_set_xy( X, Y ); //寫(xiě)地址 while (*s) { LCD_write_char( 0, *s ); s ++; } } void LCD_set_xy( unsigned char x, unsigned char y ) //寫(xiě)地址函數(shù) { unsigned char address; if (y == 0) address = 0x80 + x; else address = 0xc0 + x; LCD_write_char(address, 0 ); }
void LCD_en_write(void) //液晶使能 { LCD_EN_PORT |= LCD_EN; delay_nus(1); LCD_EN_PORT &= ~LCD_EN; } void LCD_write_char(unsigned command,unsigned data) // 寫(xiě)數(shù)據(jù) { unsigned command_temp,data_temp; command_temp = command; data_temp = data; delay_nus(16); if(command == 0) { LCD_RS_PORT |= LCD_RS; //RS=1 LCD_DATA_PORT &= 0X0f; LCD_DATA_PORT |= data_temp & 0xf0; //寫(xiě)高四位 LCD_en_write(); data_temp = data_temp << 4; LCD_DATA_PORT &= 0X0f; LCD_DATA_PORT |= data_temp & 0xF0; //寫(xiě)低四位 LCD_en_write(); } else { LCD_RS_PORT &= ~LCD_RS; //RS=0 LCD_DATA_PORT &= 0X0f; LCD_DATA_PORT |= command_temp & 0xF0; //寫(xiě)高四位 LCD_en_write(); command_temp = command_temp << 4; LCD_DATA_PORT &= 0x0F; LCD_DATA_PORT |= command_temp & 0xF0; //寫(xiě)低四位 LCD_en_write(); } }
int main(void) {
LCD_init(); LCD_write_string(0,0,"Hello,AVR WORLD!!!"); LCD_write_string(0,1,"hitro@tom.com");
while(1); } /*----------------------------------------------------------------------- 延時(shí)函數(shù) 系統(tǒng)時(shí)鐘:8M -----------------------------------------------------------------------*/ void delay_1us(void) //1us延時(shí)函數(shù) { asm("nop"); }
void delay_nus(unsigned int n) //N us延時(shí)函數(shù) { unsigned int i=0; for (i=0;i<n;i++) delay_1us(); } void delay_1ms(void) //1ms延時(shí)函數(shù) { unsigned int i; for (i=0;i<1356;i++); } void delay_nms(unsigned int n) //N ms延時(shí)函數(shù) { unsigned int i=0; for (i=0;i<n;i++) delay_1ms(); }
|
|