找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1971|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)問各位大神,我這電路圖錯(cuò)的嗎?怎么1602顯示不了字符

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:847202 發(fā)表于 2020-11-22 11:22 來自觸屏版 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我單片機(jī)學(xué)得不是很好,因?yàn)槲沂亲詫W(xué)的,師傅還沒有教到,而且程序是復(fù)制別人的,程序我還不是全部都理解,但是編譯沒有出現(xiàn)錯(cuò)誤,求指導(dǎo)


單片機(jī)源程序如下:
#include<reg52.h>

#define Lcd1602_DB P2
sbit Lcd1602_RS = P3^0;
sbit Lcd1602_RW = P3^1;
sbit Lcd1602_E = P3^2;

void InitLcd1602();
void Lcdwritecmd(unsigned char cmd);
void LcdWaitReady();
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str);
void Lcdcursor(unsigned char x, unsigned char y);
void LcdWritedat( unsigned char str);

void main()
{
        InitLcd1602();
        LcdShowstr(5, 0, "L Z Y");
        LcdShowstr(3, 1, "come on!!!");
        while(1);
}
//初始化1602液晶
void InitLcd1602()
{
        Lcdwritecmd(0x38);//16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
        Lcdwritecmd(0x0C); //顯示器開,光標(biāo)關(guān)閉
        Lcdwritecmd(0x06);//文字不動(dòng),地址自動(dòng)加+1
        Lcdwritecmd(0x01);//清屏
}
//向LCd1602寫入一個(gè)一字節(jié)命令,cmd為待寫入命令值
void Lcdwritecmd(unsigned char cmd)
{
        LcdWaitReady();
        Lcd1602_RS = 0;
        Lcd1602_RW = 0;
        Lcd1602_DB = cmd;
        Lcd1602_E = 1;
        Lcd1602_E = 0;
}
//等待液晶準(zhǔn)備好
void LcdWaitReady()
{
        unsigned char sta;
        Lcd1602_DB = 0xFF;
        Lcd1602_RS = 0;
        Lcd1602_RW = 1;
        do{
           Lcd1602_E = 1;
           sta = Lcd1602_DB;//讀取狀態(tài)字
           Lcd1602_E = 0;
        }while(sta & 0x80);//bit7等于1表示液晶正忙,重復(fù)檢測(cè)直到其等于0為止
}
//在液晶上顯示字符串,(x,y)為對(duì)應(yīng)屏幕上的起始坐標(biāo),str為字符指針
void LcdShowstr(unsigned char x, unsigned char y, unsigned char *str)
{
        Lcdcursor(x, y);//設(shè)置起始地址
        while(*str != '\0')//連續(xù)寫入字符串?dāng)?shù)據(jù),直到檢測(cè)到結(jié)束符
        {
                LcdWritedat(*str++);//先取str指向的數(shù)據(jù),然后str自加1
        }
}
//設(shè)置顯示RAM起始地址,亦即光標(biāo)位置,(x,y)為對(duì)應(yīng)屏幕上的字符坐標(biāo)
void Lcdcursor(unsigned char x, unsigned char y)
{
          unsigned char addr;
          if(y == 0)//由輸入的屏幕坐標(biāo)計(jì)算顯示RAM的地址
          {
                  addr = 0x00 + x; //第一行字符坐標(biāo)地址從0x00起始
          }
          else         
          {
                  addr = 0x40 +  x;//第二行字符地址從0x40起始
          }
          Lcdwritecmd(addr | 0x80);//設(shè)置RAM地址
}
//向液晶寫入一個(gè)一字節(jié)數(shù)據(jù),dat為待寫入數(shù)據(jù)值
void LcdWritedat(unsigned char str)
{
        LcdWaitReady();
        Lcd1602_RS = 1;
        Lcd1602_RW = 0;
        Lcd1602_E = 1;
        Lcd1602_DB = str;
        Lcd1602_E = 0;        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:342822 發(fā)表于 2020-11-22 17:45 | 只看該作者
沒有錯(cuò)誤可以仿真
重新編譯一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:687694 發(fā)表于 2020-11-22 19:36 | 只看該作者
如果程序無誤,大概率是時(shí)序問題,通常此類例程在8951上運(yùn)行,為12T單片機(jī)。故使用類似        Lcd1602_E = 1;
Lcd1602_E = 0;
這種直接控制io電平反轉(zhuǎn)是可以的,仿真中未必能行,請(qǐng)參考控制時(shí)序加入適當(dāng)延遲就行了。
回復(fù)

使用道具 舉報(bào)

地板
ID:275826 發(fā)表于 2020-11-22 19:54 | 只看該作者
程序沒有錯(cuò)誤,應(yīng)該是電路圖那里畫的有問題
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2020-11-22 20:06 | 只看該作者
程序和仿真都沒有問題


回復(fù)

使用道具 舉報(bào)

6#
ID:847479 發(fā)表于 2020-11-22 22:24 | 只看該作者
看著沒毛病��!
回復(fù)

使用道具 舉報(bào)

7#
ID:278840 發(fā)表于 2020-11-23 10:25 | 只看該作者
實(shí)測(cè)沒毛病,看看自己畫的圖是不是哪里畫錯(cuò)了
回復(fù)

使用道具 舉報(bào)

8#
ID:748788 發(fā)表于 2020-11-23 10:31 | 只看該作者
將你的程序和仿真發(fā)上來,讓大家運(yùn)行一下看看
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表