標(biāo)題: 單片機(jī)+LCD1602液晶顯示問(wèn)題 中間有兩個(gè)黑點(diǎn) [打印本頁(yè)]

作者: lzl12399    時(shí)間: 2021-5-28 10:48
標(biāo)題: 單片機(jī)+LCD1602液晶顯示問(wèn)題 中間有兩個(gè)黑點(diǎn)
問(wèn)題描述: 1602顯示如圖,中間有兩個(gè)黑點(diǎn)。如何解決,我貼下1602程序部分


#define yi 0x80 //LCD第一行的初始位置,因?yàn)長(zhǎng)CD1602字符地址首位D7恒定為1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋(gè)字符位置地址是0x40)


//----------------延時(shí)函數(shù),后面經(jīng)常調(diào)用----------------------
void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}

//--------------------------寫(xiě)指令---------------------------
void write_1602com(uchar com)//****液晶寫(xiě)入指令函數(shù)****
{
        lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
        lcd1602_rw=0; //讀寫(xiě)選擇置為寫(xiě)
        P0=com;//送入數(shù)據(jù)
        delay(1);
        lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
        delay(1);
        lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}

//-------------------------寫(xiě)數(shù)據(jù)-----------------------------
void write_1602dat(uchar dat)//***液晶寫(xiě)入數(shù)據(jù)函數(shù)****
{
        lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
        lcd1602_rw=0; //讀寫(xiě)選擇置為寫(xiě)
        P0=dat;//送入數(shù)據(jù)
        delay(1);
        lcd1602_en=1; //en置高電平,為制造下降沿做準(zhǔn)備
        delay(1);
        lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}

//-------------------------初始化-------------------------
void lcd_init()
{
        write_1602com(0x01);//清顯示
        write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        write_1602com(0x0c);//開(kāi)顯示不顯示光標(biāo)
        write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
}


作者: 名字不是重點(diǎn)    時(shí)間: 2021-5-28 11:41
這樣的問(wèn)題,在線(xiàn)跟蹤一下1602的輸入數(shù)據(jù),一般都能解決
作者: lzl12399    時(shí)間: 2021-5-28 12:55
名字不是重點(diǎn) 發(fā)表于 2021-5-28 11:41
這樣的問(wèn)題,在線(xiàn)跟蹤一下1602的輸入數(shù)據(jù),一般都能解決

感謝賜教,請(qǐng)問(wèn)怎么在線(xiàn)跟蹤?
作者: wufa1986    時(shí)間: 2021-5-28 13:30
這很明顯是顯示數(shù)字沒(méi)有轉(zhuǎn)字符串
作者: hhdsdy    時(shí)間: 2021-5-28 13:44
主函數(shù)都沒(méi)貼出來(lái),應(yīng)該是送的顯示數(shù)據(jù)錯(cuò)誤了
作者: 名字不是重點(diǎn)    時(shí)間: 2021-5-28 14:07
用仿真器跑代碼
作者: lzl12399    時(shí)間: 2021-5-28 14:08
hhdsdy 發(fā)表于 2021-5-28 13:44
主函數(shù)都沒(méi)貼出來(lái),應(yīng)該是送的顯示數(shù)據(jù)錯(cuò)誤了
  1. void main()
  2. {
  3.          unsigned char KEY,NUM;
  4.         unsigned char i,j;
  5.          P1=0xFF;
  6.         EA=1;
  7.         TMOD=0x01;
  8.         IT1=1;//下降沿有效
  9.         EX1=1;//外部中斷1開(kāi)
  10.            
  11.         TH0=0;//T0賦初值
  12.         TL0=0;
  13.         TR0=1;//t0開(kāi)始計(jì)時(shí)
  14.          TL1=0x3c;
  15.          TH1=0xb0;
  16.          ET1=1;        
  17.          TR1=0;
  18.          Delay400Ms();         //啟動(dòng)等待,等LCM講入工作狀態(tài)
  19.          lcd_init();         //LCD初始化
  20.         write_1602com(yi);//日歷顯示固定符號(hào)從第一行第0個(gè)位置之后開(kāi)始顯示
  21.         init_rc522();
  22.         init_eeprom();
  23.         read_eeprom();
  24.         for(i=0;i<16;i++)
  25.         {
  26.                 write_1602dat(name[i]);//向液晶屏寫(xiě)日歷顯示的固定符號(hào)部分
  27.         }
  28.         write_1602com(er);//時(shí)間顯示固定符號(hào)寫(xiě)入位置,從第2個(gè)位置后開(kāi)始顯示
  29.         for(i=0;i<16;i++)
  30.         {
  31.                 write_1602dat(start_line[i]);//寫(xiě)顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
  32.         }
  33.         write_1602com(er+9);        //設(shè)置光標(biāo)位置
  34.         write_1602com(0x0f);        //設(shè)置光標(biāo)為閃爍
  35.          Delay5Ms(); //延時(shí)片刻(可不要)

  36.          N=0;                                                                                                                //初始化數(shù)據(jù)輸入位數(shù)
  37.          while(1)
  38.          {
  39.            
  40.                 ctrl();
  41.                 if(key_disable==1)
  42.                         Alam_KeyUnable();
  43.                 else
  44.                         ALAM=1;                                                                //關(guān)報(bào)警

  45.                 KEY=keynum();
  46.                 if(KEY!=0||IrOK==1)
  47.                 {        
  48.                         if(key_disable==1)
  49.                         {
  50.                                 second=0;
  51.                         }
  52.                         else
  53.                         {
  54.                                 NUM=coding(Im[2],KEY);
  55.                                 {
  56.                                         switch(NUM)
  57.                                         {
  58.                                                 case ('A'): if(chushihua==1)
  59.                                                             {
  60.                                                              current_id++;
  61.                                                             if(current_id>5)
  62.                                                                          current_id=0;
  63.                                                                          }                                        break;
  64.                                                 case ('B'):        if(chushihua==1)
  65.                                                              write_eeprom_jj(current_id)        ;                                             break;
  66.                                                 case ('C'): if(chushihua==1)
  67.                                                              write_eeprom_j(current_id)        ;                                         break;
  68.                                                 case ('D'): chushihua=0;ResetPassword();                break;      //重新設(shè)置密碼
  69.                                                 case ('*'): chushihua=0;Cancel();                                break;      //取消當(dāng)前輸入
  70.                                                 case ('#'): chushihua=0; Ensure();                                 break;           //確認(rèn)鍵,
  71.                                                 default:
  72.                                                 {        
  73.                                                     chushihua=0;
  74.                                                         //DisplayListChar(0,1,Input);
  75.                                                         write_1602com(er);
  76.                                                         for(i=0;i<16;i++)
  77.                                                         {
  78.                                                                 write_1602dat(Input[i]);
  79.                                                         }
  80.                                                     operation=0;
  81.                                                         if(N<6)                                                           //當(dāng)輸入的密碼少于6位時(shí),接受輸入并保存,大于6位時(shí)則無(wú)效。
  82.                                                         {  
  83.                                                                 OneAlam();                                                                //按鍵提示音                                                
  84.                                                                 //DisplayOneChar(6+N,1,'*');
  85.                                                                  for(j=0;j<=N;j++)
  86.                                                                 {
  87.                                                                         write_1602com(er+6+j);
  88.                                                                         write_1602dat('*');
  89.                                                                 }
  90.                                                                 InputData[N]=NUM;
  91.                                                                 N++;
  92.                                                         }
  93.                                                         else                                                                                //輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
  94.                                                         {
  95.                                                                 N=6;
  96.                                                                  break;
  97.                                                         }
  98.                                                 }
  99.                                         }
  100.                                 }
  101.                         }
  102.                  }
  103.         }
  104. }
復(fù)制代碼

作者: lzl12399    時(shí)間: 2021-5-28 14:09
wufa1986 發(fā)表于 2021-5-28 13:30
這很明顯是顯示數(shù)字沒(méi)有轉(zhuǎn)字符串

我覺(jué)得應(yīng)該不是,因?yàn)榈谝粡埧ǹ梢哉Wx取出來(lái),第二張卡就顯示兩個(gè)黑屏
作者: robinsonlin    時(shí)間: 2021-5-28 14:42
讀卡的后數(shù)據(jù)如何傳輸?shù)模?nbsp; 問(wèn)題肯定出在傳輸上,  把讀到的數(shù)據(jù),用串口發(fā)送出來(lái)看看就知道了。
作者: wdgao    時(shí)間: 2021-5-28 14:58
應(yīng)該是顯示數(shù)據(jù)和待顯示的位置沒(méi)對(duì)上,前一屏幕信息殘留疊加的結(jié)果。
作者: lzl12399    時(shí)間: 2021-5-28 15:19
感謝各位出謀劃策,我再找找原因,有答案會(huì)和大家一起分享的。小弟在這里一并謝過(guò)
作者: man1234567    時(shí)間: 2021-5-29 22:01
直接用常量在相對(duì)的位置顯示一個(gè)字條,如果還是這樣就是硬件壞。
不過(guò)一般都是你送的數(shù)據(jù)有問(wèn)題,1602直接壞2個(gè)顯示位并且全顯的概率小。
作者: rayin    時(shí)間: 2021-5-31 10:58
基本不認(rèn)為是1602的硬件問(wèn)題,99%是軟件寫(xiě)得有問(wèn)題才出現(xiàn)中間部位的顯示異常.
作者: lzl12399    時(shí)間: 2021-5-31 15:47
rayin 發(fā)表于 2021-5-31 10:58
基本不認(rèn)為是1602的硬件問(wèn)題,99%是軟件寫(xiě)得有問(wèn)題才出現(xiàn)中間部位的顯示異常.

你說(shuō)的對(duì),就是軟件問(wèn)題,但是我還沒(méi)調(diào)通
作者: lzl12399    時(shí)間: 2021-5-31 15:48
man1234567 發(fā)表于 2021-5-29 22:01
直接用常量在相對(duì)的位置顯示一個(gè)字條,如果還是這樣就是硬件壞。
不過(guò)一般都是你送的數(shù)據(jù)有問(wèn)題,1602直接 ...

排除硬件故障了,還在軟件調(diào)試中
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-6-19 08:42
LCD1602顯示℃ 這種自定義符號(hào) http://www.torrancerestoration.com/bbs/dpj-200685-1.html
LCD1602液晶最新資料 說(shuō)明了具體的時(shí)間要求 http://www.torrancerestoration.com/bbs/dpj-205768-1.html




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