標(biāo)題: 為什么仿真液晶無顯示 [打印本頁]

作者: 一片一城    時(shí)間: 2021-10-15 12:00
標(biāo)題: 為什么仿真液晶無顯示
請教了,不知錯(cuò)在哪里,仿真時(shí)液晶就是啥都沒有。謝謝。



作者: 一片一城    時(shí)間: 2021-10-15 12:01
上圖的代碼

#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
void Initialize_LCD();
void DelayMS(uint ms);
void ShowString(uchar,uchar,uchar *);
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
uchar code Prompt[]="Press K1 - K3 To Start Demo Prog";
//待滾動顯示的信息段落,每行不超過80個(gè)字符,共6行
uchar const Line_Count=6;       
uchar code Msg[][80]=
{
        "Many CAD users dismiss schematic capture as a necessary evil in the ",
        "process of creating PCB layout but we have always disputed this point ",
        "of view. With PCB layout now offering automation of both component ",
        "can often be the most time consuming element of the exercise.",
        "And if you use circuit simulation to develop your ideas, ",
        "you are going to spend even more time working on the schematic."
};
//顯示緩沖(2行)
uchar Disp_Buffer[32];

void V_Scroll_Display() //垂直滾動顯示
{
        uchar i,j,k=0;
        uchar *p=Msg[0];
        uchar *q=Msg[Line_Count]+strlen(Msg[Line_Count]);
        //以下僅使用顯示緩沖的前16字節(jié)空間
        while(p<q)
        {
                for(i=0;i<16&&p<q;i++)
                {        //消除顯示緩沖中待顯示行首尾可能出現(xiàn)的空格
                        if((i==0||i==15)&&*p==' ') p++;
                        if(*p!='\0')
                        {
                                Disp_Buffer[i]=*p++;
                        }
                        else
                        {
                                if(++k>Line_Count) break;
                                p=Msg[k];                                        //p指向下一串的首地址
                                Disp_Buffer[i]=*p++;
                        }
                }
                //不足16個(gè)字符時(shí)空格補(bǔ)充
                for(j=i;j<16;j++) Disp_Buffer[j]=' ';
                //垂直滾動顯示
                while(F0) DelayMS(5);
                ShowString(0,0,"                 ");
                DelayMS(150);
                while(F0) DelayMS(5);
                ShowString(0,1,Disp_Buffer);
                DelayMS(150);
                while(F0) DelayMS(5);
                ShowString(0,0,Disp_Buffer);
                ShowString(0,1,"                 ");
                DelayMS(150);
        }
        //最后清屏
        ShowString(0,0,"                 ");
        ShowString(0,1,"                 ");
}

void H_Scroll_Display()//水平滾動顯示
{
        uchar i,j,k=0,L=0;
        uchar *p=Msg[0];
        uchar *q=Msg[Line_Count]+strlen(Msg[Line_Count]);
        //將32個(gè)字符的顯示緩沖前16個(gè)字符設(shè)為空格
        for(i=0;i<16;i++) Disp_Buffer[i]=' ';
        while(p<q)
        {
                //忽略緩沖中首尾可能出現(xiàn)的空格
                if((i==16||i==31)&&*p==' ') p++;
                for(i=16;i<32&&p<q;i++)
                {       
                        if(*p!='\0')
                        {
                                Disp_Buffer[i]=*p++;
                        }
                        else
                        {
                                if(++k>Line_Count) break;
                                p=Msg[k];                                        //p指向下一串的首地址
                                Disp_Buffer[i]=*p++;
                        }
                }
                //不足32個(gè)字符時(shí)空格補(bǔ)充
                for(j=i;j<32;j++) Disp_Buffer[j]=' ';
                //水平滾動顯示
                for(i=0;i<=16;i++)
                {
                        while(F0) DelayMS(5);
                        ShowString(0,L,Disp_Buffer+i);
                        while(F0) DelayMS(5);
                        DelayMS(20);
                }
                L=(L==0)?1:0;                //行號在0,1間交替
                DelayMS(300);
        }
        //如果顯示結(jié)束時(shí)停留在第0行,則清除第1行的內(nèi)容
        if(L==1) ShowString(0,1,"                 ");       
}

void EX_INT0() interrupt 0//外部中斷0,由K3控制暫停與繼續(xù)顯示
{
  F0=!F0;                //暫停與繼續(xù)顯示控制標(biāo)志位
}

void main()
{
        uint Count=0;
        IE=0x81;                //允許外部中斷0
        IT0=1;                        //下降沿觸發(fā)
        F0=0;                        //暫停與繼續(xù)顯示控制標(biāo)志位
        Initialize_LCD();
        ShowString(0,0,Prompt);
        ShowString(0,1,Prompt+16);
        while(1)
        {
                if(K1==0)
                {
                        V_Scroll_Display();
                        DelayMS(300);
                }
                else
                if(K2==0)
                {       
                        H_Scroll_Display();
                        DelayMS(300);       
                }
        }
}
作者: munuc_w    時(shí)間: 2021-10-16 11:29
仿真中用到的器件要有相應(yīng)的仿真數(shù)學(xué)模型,有的器件缺這個(gè)模型,就不能仿真,可以換一個(gè)試試。
作者: Lxy18    時(shí)間: 2021-10-16 12:11
樓主,仿真圖中排阻網(wǎng)絡(luò)標(biāo)號錯(cuò)位,lcd不確定是否有錯(cuò)。
另外,程序中沒有看到lcd控制引腳的定義。
以下是我仿真的lcd1602和排阻接法,可以參考。

自用的lcd1602驅(qū)動奉上,僅供參考
Lcd1602驅(qū)動.zip (1.67 KB, 下載次數(shù): 2)






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1