|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
求教有關(guān)液晶顯示 |
| 作者:baiguo 欄目:單片機(jī) |
初次使用液晶,仿《例說8051》(51,匯編)寫了一液晶顯示程序如下: "Mega8.h" #include "delay.h" #define lcd_en PORTB.2 #define lcd_rs PORTB.0 #define lcd_rw PORTB.1 //#define lcd_write_data PORTD //#define lcd_read_data PIND unsigned CHAR busy_flag; unsigned CHAR CHAR_a[10]={0x10,0x20,0x30,0x40}; unsigned CHAR CHAR_b[10]={'A','B','C','D','E','F','G'}; //-------------------------------------------------------------- void check_bf(void) { PORTD=0x00; /*1*/ DDRD=0x00; while(1) { lcd_rs=0; lcd_rw=1; lcd_en=1; busy_flag=PIND&0x80; lcd_en=0; /*2*/ if(busy_flag==0x00) break; } delay_ms(3); } void wr_inst(unsigned CHAR cmd) { check_bf(); DDRD=0xFF; lcd_rs=0; lcd_rw=0; lcd_en=1; PORTD=cmd; lcd_en=0; } void lcd_initialize(void) { unsigned CHAR cmd_a; cmd_a=0x38; wr_inst(cmd_a); //設(shè)定為8bit,2行,5*7字型 cmd_a=0x08; wr_inst(cmd_a); //關(guān)閉顯示屏 cmd_a=0x01; wr_inst(cmd_a); //清除顯示屏 cmd_a=0x0F; wr_inst(cmd_a); //開啟顯示屏,游標(biāo),與閃爍 cmd_a=0x06; wr_inst(cmd_a); //設(shè)定AC+1 } void main(void) { unsigned CHAR cmd_b,i; DDRB|=0x07; lcd_initialize(); for(;;) { cmd_b=0x80; wr_inst(cmd_b); //設(shè)定第一行起始地址 /*3*/ for(i=0;i<10;i++) { check_bf(); DDRD=0xFF; lcd_rs=1; lcd_rw=0; lcd_en=1; //lcd_write_data=CHAR_a[i]; PORTD=CHAR_a[i]; lcd_en=0; } delay_ms(100); cmd_b=0xC0; wr_inst(cmd_b); //設(shè)定第二行起始地址 for(i=0;i<10;i++) { check_bf(); DDRD=0xFF; lcd_rs=1; lcd_rw=0; lcd_en=1; //lcd_write_data=CHAR_b[i]; PORTD=CHAR_b[i]; lcd_en=0; } delay_ms(100); } } 程序編譯通過,在AVRstudio,Proteus中調(diào)試發(fā)現(xiàn):若/*1*/,/*2*/兩句不加, 液晶屏點(diǎn)亮,光標(biāo)在第一行第一字符處閃爍,無字符顯示;若兩句都加上,僅僅液晶屏點(diǎn)亮;若去除/*1*/句,在AVRstudio中看到程序在/*3*/處死循環(huán)(PIND.7=1),我看了很久不知所以然,望各位大蝦指正,謝謝! (顯示什么都無所謂,但不要用庫函數(shù),編譯環(huán)境CVAVR1.24c,AVRstudio4.11,Proteus6.3可以免費(fèi)提供--popo傳送) |
| 2樓: | >>參與討論 |
| 作者: NE5532 于 2006/2/26 9:57:00 發(fā)布:
AVR不是51,*1*那句不用要 51是OC的結(jié)構(gòu),AVR是真正的I/O,那句話相當(dāng)于寫了個(gè)0x00出去。 另外你沒有說液晶是什么主控芯片的,看出來是在查忙標(biāo),其他的只有靠猜。 |
|
| 3樓: | >>參與討論 |
| 作者: baiguo 于 2006/2/26 11:37:00 發(fā)布:
h 的確如樓上所說,/*1*/不加,液晶將一直處于忙(因用一句是PORTD=0x80),后來我將/*1*/改為PORTD&=0x7F,顯示正常. 液晶為Proteus元件庫中LM032L |
|
| 4樓: | >>參與討論 |
| 作者: baiguo 于 2006/2/26 11:42:00 發(fā)布:
d 感覺第二行地址設(shè)置不對,不知那位大蝦能給我一份LM032L的資料,謝謝! |
|
| 5樓: | >>參與討論 |
| 作者: baiguo 于 2006/2/27 14:38:00 發(fā)布:
j 結(jié)果程序改寫如下: #include "Mega8.h" #include "delay.h" #define lcd_en PORTB.2 #define lcd_rs PORTB.0 #define lcd_rw PORTB.1 #define lcd_write_data PORTD #define lcd_read_data PIND #define unCHAR unsigned CHAR unCHAR busy_flag; unCHAR CHAR_a[20]={'0','1','2','3','4','5','6', '7','8','9','0','1','2','3','4','5','6','7','8','9'}; unCHAR CHAR_b[19]={'A','B','C','D','E','F','G','H','I', 'J','a','b','c','d','e','f','g','h'}; unCHAR *p; /******************************************************************** LCD判忙子程序 ********************************************************************/ void check_bf(void) { DDRD=0x00; PORTD&=0x7F; while(1) { lcd_rs=0; lcd_rw=1; lcd_en=1; busy_flag=lcd_read_data&0x80; lcd_en=0; if(busy_flag==0x00) break; } delay_ms(3); } /******************************************************************** LCD功能設(shè)置子程序 ********************************************************************/ void wr_inst(unsigned CHAR cmd) { check_bf(); DDRD=0xFF; lcd_rs=0; lcd_rw=0; lcd_en=1; PORTD=cmd; lcd_en=0; } /******************************************************************** LCD初始化 ********************************************************************/ void lcd_initialize(void) { wr_inst(0x38); //設(shè)定為8bit,2行,5*7字型 wr_inst(0x08); //關(guān)閉顯示屏 wr_inst(0x01); //清除顯示屏 wr_inst(0x0E); //開啟顯示屏,游標(biāo),與閃爍 wr_inst(0x06); //設(shè)定AC+1 } /******************************************************************** 主程序 ********************************************************************/ void main(void) { unCHAR i; DDRB|=0x07; lcd_initialize(); for(;;) { wr_inst(0x80); //設(shè)定第一行起始地址 /*1*/ p=&CHAR_a[0]; for(i=0;i<20;i++) { check_bf(); DDRD=0xFF; lcd_rs=1; lcd_rw=0; lcd_en=1; lcd_write_data=*p++; lcd_en=0; delay_ms(100); } delay_ms(500); wr_inst(0xC0); //設(shè)定第二行起始地址 p=&CHAR_b[0]; for(i=0;i<19;i++) { check_bf(); DDRD=0xFF; lcd_rs=1; lcd_rw=0; lcd_en=1; lcd_write_data=*p++; lcd_en=0; delay_ms(100); } delay_ms(500); } } 在Proteus中調(diào)試,能顯示字符,但字符不能自定位(比如:字符從第一行第三個(gè)字符處開始顯示),/*1*/行中0x80該為任意數(shù),顯示效果都不變.為何?請各位幫幫忙 |
|
| 6樓: | >>參與討論 |
| 作者: vfdff 于 2006/3/3 20:05:00 發(fā)布:
lcd Mega8.h 這個(gè)是什么?/ |
|
| 7樓: | >>參與討論 |
| 作者: baiguo 于 2006/3/16 20:39:00 發(fā)布:
d 回樓上的:頭文件 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |