音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
求教有關(guān)液晶顯示
   初次使用液晶,仿《例說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
AVR不是51,*1*那句不用要
51是OC的結(jié)構(gòu),AVR是真正的I/O,那句話相當(dāng)于寫了個(gè)0x00出去。
另外你沒有說液晶是什么主控芯片的,看出來是在查忙標(biāo),其他的只有靠猜。

3樓: >>參與討論
baiguo
h
的確如樓上所說,/*1*/不加,液晶將一直處于忙(因用一句是PORTD=0x80),后來我將/*1*/改為PORTD&=0x7F,顯示正常.

液晶為Proteus元件庫中LM032L

4樓: >>參與討論
baiguo
d
感覺第二行地址設(shè)置不對,不知那位大蝦能給我一份LM032L的資料,謝謝!

5樓: >>參與討論
baiguo
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
lcd
Mega8.h
這個(gè)是什么?/

7樓: >>參與討論
baiguo
d
回樓上的:頭文件

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
用在RTOS中的GCC庫函數(shù)itoa的懸疑
程序下載到板子里,為何不運(yùn)行
我看了ICC的中文說明 但是沒找到
使用AVR128內(nèi)部AD時(shí),用外部的Aref問題
一個(gè)比較郁悶的 強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤 請教大家。
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號