久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7219|回復: 26
打印 上一主題 下一主題
收起左側

15w4k32s4單片機接上1602液晶屏,液晶屏只顯示白塊,燒寫后也是白塊

  [復制鏈接]
跳轉到指定樓層
樓主
ID:839796 發(fā)表于 2020-12-13 22:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1602顯示屏只顯示白塊,燒寫后同樣如此。在網上找的程序:
#include "stc15.h"
/********IO引腳定義***********************************************************/
sbit LCD_RS=P1^2;//定義引腳
sbit LCD_RW=P1^1;
sbit LCD_E=P1^0;

/********宏定義***********************************************************/
#define LCD_Data P0
#define Busy    0x80 //用于檢測LCD狀態(tài)字中的Busy標識

/********數據定義*************************************************************/
unsigned char code uctech[] = {"Happy every day"};
unsigned char code net[] = {"www.lydz8.com"};

/********函數聲明*************************************************************/
void WriteDataLCD(unsigned char WDLCD);                                        //寫數據
void WriteCommandLCD(unsigned char WCLCD,BuysC);                //寫命令
unsigned char ReadDataLCD(void);                                                //讀數據
unsigned char ReadStatusLCD(void);                                                //讀狀態(tài)
void LCDInit(void);                                                                                //初始化
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);                        //相應坐標顯示字節(jié)內容
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);        //相應坐標開始顯示一串內容
void Delay5Ms(void);                                                                        //延時
void Delay400Ms(void);                                                                        //延時


/***********主函數開始********************************************************/       
void main(void)
{
        Delay400Ms();         //啟動等待,等LCD講入工作狀態(tài)
        LCDInit();                 //初始化
        Delay5Ms();         //延時片刻(可不要)

        DisplayListChar(0, 0, uctech);
        DisplayListChar(1, 5, net);
        ReadDataLCD();        //測試用句無意義
        while(1);
}

/***********寫數據********************************************************/       
void WriteDataLCD(unsigned char WDLCD)
{
        ReadStatusLCD(); //檢測忙
        LCD_Data = WDLCD;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_E = 0;                 //若晶振速度太高可以在這后加小的延時
        LCD_E = 0;                 //延時
        LCD_E = 1;
}

/***********寫指令********************************************************/       
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測
{
        if (BuysC) ReadStatusLCD(); //根據需要檢測忙
        LCD_Data = WCLCD;
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
}

/***********讀數據********************************************************/       
unsigned char ReadDataLCD(void)
{
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
        return(LCD_Data);
}

/***********讀狀態(tài)*******************************************************/       
unsigned char ReadStatusLCD(void)
{
        LCD_Data = 0xFF;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_E = 0;
        LCD_E = 0;
        LCD_E = 1;
        while (LCD_Data & Busy); //檢測忙信號
        return(LCD_Data);
}

/***********初始化********************************************************/       
void LCDInit(void)
{
        LCD_Data = 0;
        WriteCommandLCD(0x38,0);         //三次模式設置,不檢測忙信號
        Delay5Ms();
        WriteCommandLCD(0x38,0);
        Delay5Ms();
        WriteCommandLCD(0x38,0);
        Delay5Ms();

        WriteCommandLCD(0x38,1);         //顯示模式設置,開始要求每次檢測忙信號
        WriteCommandLCD(0x08,1);         //關閉顯示
        WriteCommandLCD(0x01,1);         //顯示清屏
        WriteCommandLCD(0x06,1);         //顯示光標移動設置
        WriteCommandLCD(0x0C,1);         //顯示開及光標設置
}

/***********按指定位置顯示一個字符*******************************************/       
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
        Y &= 0x1;
        X &= 0xF;                                 //限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40;                 //當要顯示第二行時地址碼+0x40;
        X |= 0x80;                         //算出指令碼
        WriteCommandLCD(X, 0); //這里不檢測忙信號,發(fā)送地址碼
        WriteDataLCD(DData);
}

/***********按指定位置顯示一串字符*****************************************/       
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
        unsigned char ListLength;

        ListLength = 0;
        Y &= 0x1;
        X &= 0xF;                                 //限制X不能大于15,Y不能大于1
        while (DData[ListLength]>=0x20){ //若到達字串尾則退出
                   if (X <= 0xF){                 //X坐標應小于0xF
                     DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
                     ListLength++;
                     X++;
            }
          }
}

/***********短延時********************************************************/       
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}

/***********長延時********************************************************/       
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--){
                  TempCycB=7269;
                  while(TempCycB--);
        }
}


51hei圖片20201213210431.jpg (35.08 KB, 下載次數: 98)

51hei圖片20201213210431.jpg

51hei圖片20201213210753.png (58.26 KB, 下載次數: 111)

51hei圖片20201213210753.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2020-12-13 22:59 | 只看該作者
51hei搜索"1602 方塊"看看大家是怎么解決的這個問題:
http://www.zg4o1577.cn/bbs/dpj-168078-1.html
http://www.zg4o1577.cn/bbs/dpj-168643-1.html
回復

使用道具 舉報

板凳
ID:839796 發(fā)表于 2020-12-13 23:37 | 只看該作者
也找了個這樣的代碼,燒寫后一樣都是白塊
#include<stc15.h>         
#include<intrins.h>


    #define uchar unsigned char
#define uint unsigned int
sbit RS = P1^2;          //定義端口
sbit RW = P1^1;
sbit EN = P1^0;
sbit beep=P3^4;
sbit k2=P3^2;
sbit k3=P3^3;
sbit Led=P3^5;

#define RS_CLR RS=0            //選擇命令
#define RS_SET RS=1                   //選擇數據

#define RW_CLR RW=0            //寫
#define RW_SET RW=1            //讀

#define EN_CLR EN=0                   //使能位
#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
//void DelayUs2x(unsigned char t)
//{   
// while(--t);
//}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
//void DelayMs(unsigned char t)
//{
//     
// while(t--)
// {
//     //大致延時1mS
//     DelayUs2x(245);
//         DelayUs2x(245);
// }
//}

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}

/*------------------------------------------------
              判忙函數
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
RS_CLR;
RW_SET;
EN_CLR;
_nop_();    //延時一個指令周期,一個指令周期為12MHZ
EN_SET;
return (bit)(DataPort & 0x80);//返回值強制轉換成位的形式,dataport與0x80得出的結果1ture,0false
}                                                           //讀LCD數據口,只要最高位bit7,為1忙,為0不忙
/*------------------------------------------------
              寫入命令函數
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待,忙返回1,那么while(1)一直循環(huán)下去
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫入數據函數
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待 (判忙)
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函數
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
Delay1ms()   ;
}
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);   //通過指針形式,依次寫入字符串
s ++;     
        }
}
/*------------------------------------------------
              寫入字符函數
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)                      //設置坐標,若y!=0則第一行寫滿
        {     
        LCD_Write_Com(0x80 + x); //第一排以0x80起始,以寫命令的方式寫入,寫之前判忙  
        }   
else
        {     
        LCD_Write_Com(0xC0 + x); //第二排以0xc0起始,以寫命令的方式寫入,寫之前判忙   
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函數
------------------------------------------------*/
void LCD_Init(void)
{
beep=0;
        Led=1;
   LCD_Write_Com(0x38);    /*顯示模式設置*/
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標移動設置*/
   Delay1ms();
   LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
   }



/*------------------------------------------------
                    主函數
------------------------------------------------*/
void main(void)
{
LCD_Init(); //對光標設置,以及屏幕清屏
LCD_Clear();//清屏
while (1)
{  
  LCD_Write_Char(3,3,'o');
  LCD_Write_Char(2,2,'k');
  LCD_Write_String(4,1,"hello world");
  
  while(1);//
}
}
回復

使用道具 舉報

地板
ID:213173 發(fā)表于 2020-12-14 08:08 | 只看該作者
gagaga123 發(fā)表于 2020-12-13 23:37
也找了個這樣的代碼,燒寫后一樣都是白塊
#include         
#include

軟件都是基于硬件條件編寫的,直接使用別人的程序不考慮其硬件差異往往不能成功。液晶屏只顯示白塊說明LCD初始化失敗。問題多數出在LCD驅動碼時序不正確。
回復

使用道具 舉報

5#
ID:277550 發(fā)表于 2020-12-14 09:56 | 只看該作者
除了程序,還有 細心調節(jié)屏的對比度

~~~~~~~
回復

使用道具 舉報

6#
ID:748788 發(fā)表于 2020-12-14 10:17 | 只看該作者
先做個仿真看看能否正常顯示。
回復

使用道具 舉報

7#
ID:429356 發(fā)表于 2020-12-14 11:50 | 只看該作者
調一下亮度定位器,把亮度調低一點。
回復

使用道具 舉報

8#
ID:343102 發(fā)表于 2020-12-14 20:16 | 只看該作者
stc單片機運行速度快,需要增加延時。stc官網上有1602的顯示程序。
回復

使用道具 舉報

9#
ID:517951 發(fā)表于 2020-12-14 21:01 | 只看該作者
上電之后屏未初始化成功,1602就是這種顯示狀態(tài)。
1)首先要確定一下顯示屏是不是好的,
2)第二再量下屏的Rs,RW,E,D0-D7連接是否可靠。
3)寫指令,數據時序的時間是否足夠,1602的讀寫速度較慢,運行速度快單片機需要有足夠的延時、尤其E信號
回復

使用道具 舉報

10#
ID:155507 發(fā)表于 2020-12-14 22:30 | 只看該作者
寫指令,數據時序






回復

使用道具 舉報

11#
ID:839796 發(fā)表于 2020-12-15 23:24 | 只看該作者

我發(fā)現 網上的1602液晶屏寫入程序的時候用到了P0或P1這種單一接口  ,但是我單片機連接用到了P0和P2接口,這應該怎么半
回復

使用道具 舉報

12#
ID:839796 發(fā)表于 2020-12-15 23:52 | 只看該作者
我剛剛發(fā)現了一個問題,請大佬們幫忙看看是不是這個問題造成的只顯示白塊
http://www.zg4o1577.cn/bbs/dpj-199847-1.html
(出處: http://www.zg4o1577.cn/bbs/)
回復

使用道具 舉報

13#
ID:639102 發(fā)表于 2020-12-16 00:26 | 只看該作者
51hei團團 發(fā)表于 2020-12-13 22:59
51hei搜索"1602 方塊"看看大家是怎么解決的這個問題:
http://www.zg4o1577.cn/bbs/dpj-168078-1.html
http: ...


也找了個這樣的代碼,燒寫后一樣都是白塊
#include<stc15.h>         
#include<intrins.h>


    #define uchar unsigned char
#define uint unsigned int
sbit RS = P1^2;          //定義端口
sbit RW = P1^1;
sbit EN = P1^0;
sbit beep=P3^4;
sbit k2=P3^2;
sbit k3=P3^3;
sbit Led=P3^5;

#define RS_CLR RS=0            //選擇命令
#define RS_SET RS=1                   //選擇數據

#define RW_CLR RW=0            //寫
#define RW_SET RW=1            //讀

#define EN_CLR EN=0                   //使能位
#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
//void DelayUs2x(unsigned char t)
//{   
// while(--t);
//}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
//void DelayMs(unsigned char t)
//{
//     
// while(t--)
// {
//     //大致延時1mS
//     DelayUs2x(245);
//         DelayUs2x(245);
// }
//}

void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}

/*------------------------------------------------
              判忙函數
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
RS_CLR;
RW_SET;
EN_CLR;
_nop_();    //延時一個指令周期,一個指令周期為12MHZ
EN_SET;
return (bit)(DataPort & 0x80);//返回值強制轉換成位的形式,dataport與0x80得出的結果1ture,0false
}                                                           //讀LCD數據口,只要最高位bit7,為1忙,為0不忙
/*------------------------------------------------
              寫入命令函數
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待,忙返回1,那么while(1)一直循環(huán)下去
RS_CLR;
RW_CLR;
EN_SET;
DataPort= com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫入數據函數
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待 (判忙)
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函數
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
Delay1ms()   ;
}
/*------------------------------------------------
              寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);   //通過指針形式,依次寫入字符串
s ++;     
        }
}
/*------------------------------------------------
              寫入字符函數
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)                      //設置坐標,若y!=0則第一行寫滿
        {     
        LCD_Write_Com(0x80 + x); //第一排以0x80起始,以寫命令的方式寫入,寫之前判忙  
        }   
else
        {     
        LCD_Write_Com(0xC0 + x); //第二排以0xc0起始,以寫命令的方式寫入,寫之前判忙   
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函數
------------------------------------------------*/
void LCD_Init(void)
{
beep=0;
        Led=1;
   LCD_Write_Com(0x38);    /*顯示模式設置*/
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);
   Delay1ms();
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標移動設置*/
   Delay1ms();
   LCD_Write_Com(0x0C);    /*顯示開及光標設置*/
   }



/*------------------------------------------------
                    主函數
------------------------------------------------*/
void main(void)
{
LCD_Init(); //對光標設置,以及屏幕清屏
LCD_Clear();//清屏
while (1)
{  
  LCD_Write_Char(3,3,'o');
  LCD_Write_Char(2,2,'k');
  LCD_Write_String(4,1,"hello world");
  
  while(1);//
}
}
回復

使用道具 舉報

14#
ID:839796 發(fā)表于 2020-12-16 01:15 來自手機 | 只看該作者
rayin 發(fā)表于 2020-12-14 21:01
上電之后屏未初始化成功,1602就是這種顯示狀態(tài)。
1)首先要確定一下顯示屏是不是好的,
2)第二再量下屏 ...

我的1602液晶屏D0-D7接了兩個接口,例如D0-D3接的P0, D4-D7接的P3應該怎么辦
回復

使用道具 舉報

15#
ID:155507 發(fā)表于 2020-12-16 06:31 | 只看該作者
gagaga123 發(fā)表于 2020-12-16 01:15
我的1602液晶屏D0-D7接了兩個接口,例如D0-D3接的P0, D4-D7接的P3應該怎么辦

給你寫一個異組端口驅動LCD示例

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  5. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  6. sfr P0M1 = 0x93;
  7. sfr P0M0 = 0x94;
  8. sfr P2M1 = 0x95;
  9. sfr P2M0 = 0x96;
  10. sfr P3M1 = 0xB1;
  11. sfr P3M0 = 0xB2;

  12. sbit LCD_RW=P1^1;
  13. sbit LCD_RS=P1^2;      
  14. sbit LCD_EN=P1^0;      

  15. sbit code0=P0^3;                           //定義LCD數據端口
  16. sbit code1=P0^2;
  17. sbit code2=P0^1;
  18. sbit code3=P0^0;
  19. sbit code4=P2^7;
  20. sbit code5=P2^6;
  21. sbit code6=P2^5;
  22. sbit code7=P2^4;      

  23. uchar table1[]="0123456789ABCDEFG";        //第一行
  24. uchar table2[]="HIJKLMNOPQRSTUVWX";        //第二行


  25. void PX(uchar i)                           //寫入8位數據
  26. {   
  27.         code0=i&0x01;i>>=1;      
  28.         code1=i&0x01;i>>=1;
  29.         code2=i&0x01;i>>=1;
  30.         code3=i&0x01;i>>=1;
  31.         code4=i&0x01;i>>=1;
  32.         code5=i&0x01;i>>=1;
  33.         code6=i&0x01;i>>=1;
  34.         code7=i&0x01;
  35. }
  36. /*******100us延時程序********/
  37. void delay(uint x)
  38. {
  39.         uint a,b;
  40.         for(a=x;a>0;a--)
  41.         for(b=10;b>0;b--);
  42. }
  43. /*******液晶寫指令程序********/
  44. void write_com(uchar com)
  45. {
  46.         LCD_RW=0;
  47.         LCD_EN=0;        //初始設置LCD_EN低電平
  48.         LCD_RS=0;        //允許寫指令
  49.         PX(com);         //傳遞指令
  50.         delay(10);       //延時1ms
  51.         LCD_EN=1;        //使能寫入
  52.         delay(10);        //延時1ms
  53.         LCD_EN=0;        //低跳變執(zhí)行
  54.        
  55. }
  56. /*******液晶寫數據程序********/
  57. void write_date(uchar date)
  58. {
  59.         LCD_RW=0;
  60.         LCD_RS=1;        //允許寫數據
  61.         PX(date);        //傳遞數據
  62.         delay(10);        //延時1ms
  63.         LCD_EN=1;        //使能寫入
  64.         delay(10);        //延時1ms
  65.         LCD_EN=0;        //低跳變執(zhí)行
  66.        
  67. }
  68. /*******液晶初始化程序********/
  69. void init()                //設置顯示模式、
  70. {

  71.         write_com(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  72.         write_com(0x01);//顯示清零,數據指針清零
  73.         write_com(0x0c);//設置開顯示,不顯光標
  74.         write_com(0x06);//設置寫一個字符后地址指針加1
  75.         write_com(0x80);//數據指針初始化,設置顯示初始位置
  76. }
  77. /**********************主程序*************************/
  78. void main()
  79. {
  80.         uchar i;                                        //定義循環(huán)變量
  81.         P0M0 = 0x00;
  82.         P0M1 = 0x00;
  83.         P1M0 = 0x00;
  84.         P1M1 = 0x00;
  85.         P2M0 = 0x00;
  86.         P2M1 = 0x00;
  87.         P3M0 = 0x00;
  88.         P3M1 = 0x00;
  89.         init();                                                //初始化程序
  90.         /******用for循環(huán)按字節(jié)逐個寫********/
  91.         write_com(0x80);                        //數據指針第一行起始0x80位置
  92.         for(i=0;i<16;i++)                        //每循環(huán)一次寫一個字節(jié)數據
  93.         {
  94.                 write_date(table1[i]);        //寫一個字節(jié)數據               
  95.         }
  96.         write_com(0xc0);                        //數據指針第二行起始位置0x80+0x40=0xc0
  97.         for(i=0;i<16;i++)                        //每循環(huán)一次寫一個字節(jié)數據
  98.         {
  99.                 write_date(table2[i]);        //寫一個字節(jié)數據               
  100.         }
  101.         while(1);
  102. }


復制代碼
回復

使用道具 舉報

16#
ID:213173 發(fā)表于 2020-12-16 08:05 | 只看該作者
本帖最后由 wulin 于 2020-12-17 15:58 編輯
gagaga123 發(fā)表于 2020-12-16 01:15
我的1602液晶屏D0-D7接了兩個接口,例如D0-D3接的P0, D4-D7接的P3應該怎么辦

這是異組非順序端口矩陣鍵盤程序,其方法可以移植寫LCD驅動程序
  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define PD ((P2<<3&0x80)|(P2<<4&0x40)|(P3&0x3f))//P4.4/P4.2

  5. sbit dula=P2^6;                        //573段選
  6. sbit wela=P2^7;                        //573位選

  7. uchar code table[]={                //數組
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};
  12. uchar data dis_buf[2];
  13. uchar key=0;
  14. bit wei=0;

  15. void PX(uchar x)
  16. {
  17.         P3&=0xc0;                //低6位清0,P36、37不變
  18.         P3|=(x&0x3f);        //P3低6位賦值
  19.         P2&=0xeb;                //P44、42清0,其它位不變
  20.         P2|=((x>>3&0x10)|(x>>4&0x04));//P44、42賦值
  21. }
  22. void keyscan()                                        //按鍵掃描程序
  23. {
  24.         static bit sign=0;                        //按鍵自鎖標志
  25.         static uint count=0;                //消抖計數變量                        
  26.         uchar num=0;                                        //臨時變量
  27.         PX(0xf0);                                        //賦值PX 1111 0000
  28.         if(PD!=0xf0)                                //檢測有按鍵按下
  29.         {
  30.                 if((++count>=100)&&(sign==0))        //100~1000,根據主循環(huán)周期調整約10~20ms
  31.                 {                        
  32.                         sign=1;                                //按鍵自鎖標志置1
  33.                         num=PD;                                //保存PD值xxxx 0000,x為0或1
  34.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  35.                         PX(num);                                //賦值PX xxxx 1111
  36.                         num=PD;                                //保存PD xxxx xxxx
  37.                         switch(num)
  38.                         {
  39.                                 case 0xee: key= 1; break;
  40.                                 case 0xde: key= 2; break;
  41.                                 case 0xbe: key= 3; break;
  42.                                 case 0x7e: key= 4; break;
  43.                                 case 0xed: key= 5; break;
  44.                                 case 0xdd: key= 6; break;
  45.                                 case 0xbd: key= 7; break;
  46.                                 case 0x7d: key= 8; break;
  47.                                 case 0xeb: key= 9; break;
  48.                                 case 0xdb: key=10; break;
  49.                                 case 0xbb: key=11; break;
  50.                                 case 0x7b: key=12; break;
  51.                                 case 0xe7: key=13; break;
  52.                                 case 0xd7: key=14; break;
  53.                                 case 0xb7: key=15; break;
  54.                                 case 0x77: key=16; break;
  55.                         }
  56.                 }
  57.         }
  58.         else                                                //鍵抬起
  59.         {
  60.                 sign=0;                                //按鍵自鎖標志清0
  61.                 count=0;                                //消抖計數清0
  62.         }
  63. }

  64. int main()
  65. {
  66.         while(1)
  67.         {
  68.                 keyscan();
  69.                 dis_buf[0]=table[key/10];
  70.                 dis_buf[1]=table[key%10];
  71.                 P0=0x00;//消隱
  72.                 dula=1;
  73.                 dula=0;
  74.                 if(wei==0)
  75.                 {
  76.                         P0=0xfe;//送位碼
  77.                         wela=1;
  78.                         wela=0;
  79.                         P0=dis_buf[0];//送段碼
  80.                         dula=1;
  81.                         dula=0;
  82.                         wei=1;
  83.                 }
  84.                 else
  85.                 {
  86.                         P0=0xfd;
  87.                         wela=1;
  88.                         wela=0;
  89.                         P0=dis_buf[1];
  90.                         dula=1;
  91.                         dula=0;
  92.                         wei=0;
  93.                 }
  94.         }
  95. }
復制代碼






回復

使用道具 舉報

17#
ID:65956 發(fā)表于 2020-12-16 08:13 | 只看該作者
你可以試試這些代碼放到STC89C52上是否能正常顯示,如果能顯示而放到STC15系列上不能顯示,那就是延時時間的問題,如果也不顯示,那本身程序不適用你的液晶驅動
回復

使用道具 舉報

18#
ID:748788 發(fā)表于 2020-12-16 10:44 | 只看該作者
你的程序有這樣一句:#define DataPort P0。即定義了P0作為1602的數據端口,但是接線圖里的數據接口對應的卻分別是P0和P2的幾個端口。這就驢唇不對馬嘴了。
回復

使用道具 舉報

19#
ID:748788 發(fā)表于 2020-12-16 10:48 | 只看該作者
剛才復制錯了。應該是這一句:#define LCD_Data P0
回復

使用道具 舉報

20#
ID:839796 發(fā)表于 2020-12-17 10:58 | 只看該作者
angmall 發(fā)表于 2020-12-16 06:31
給你寫一個異組端口驅動LCD示例

謝謝,我可能是對比度的問題吧,顯示兩行白格了
回復

使用道具 舉報

21#
ID:839796 發(fā)表于 2020-12-20 17:53 | 只看該作者
大佬們,多謝了 我的可以顯示了,我把D0-D7從新弄了一下,然后代碼中沒有把P1和P2口設置為弱上拉,希望這個回答也可以幫助別的和我一樣問題的萌新。
回復

使用道具 舉報

22#
ID:420836 發(fā)表于 2020-12-20 23:54 | 只看該作者
看來問題出在對比度設置上,降低了對比度。
回復

使用道具 舉報

23#
ID:484674 發(fā)表于 2022-1-5 20:58 來自手機 | 只看該作者
1602出現左正常右邊白格什么原因
回復

使用道具 舉報

24#
ID:192215 發(fā)表于 2022-5-16 10:36 | 只看該作者
我也遇到了這個問題
回復

使用道具 舉報

25#
ID:1044173 發(fā)表于 2023-4-18 08:29 | 只看該作者
我之前用Proteus仿真1602也是白屏不顯示把延時改了一下,顯示出來了,但我做的超聲波測距,當超聲波模塊數值改變時1602上顯示的數據不變
回復

使用道具 舉報

26#
ID:1091100 發(fā)表于 2023-8-10 23:29 | 只看該作者
同志們,板子還是買良心商家的吧!
//引腳配置:
//sbit LCD_RS=P2^6;
//sbit LCD_RW=P2^5;
//sbit LCD_EN=P2^7;

sbit LCD_RS=P2^4;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^6;

原理圖上引腳定義標的都是錯的,你敢信?
拿表打出正確的引腳后就顯示正常了!
回復

使用道具 舉報

27#
ID:1085441 發(fā)表于 2023-8-11 00:11 | 只看該作者
看前面不少人說是對比度問題,我覺得不像,如果僅是對比度問題,字符還是能看出來的,應該是像9樓說的初始化不對,我們遇到這種情況是引腳沒焊好或是短路。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99日韩| 中文字幕亚洲精品 | 日韩午夜网站 | 人人爽人人爽人人片av | 免费看啪啪网站 | а天堂中文最新一区二区三区 | 在线看免费的a | 日本在线看片 | 蜜桃视频成人 | 精品中文视频 | 毛片入口 | 日韩av啪啪网站大全免费观看 | 天堂网av在线 | 国产精品久久久久久久久久免费看 | 天天干天天爽 | 国产 欧美 日韩 一区 | 免费观看av网站 | 人人人干| 日韩毛片播放 | 国产精品久久精品 | 国产成人精品一区二 | 成人做爰69片免费观看 | 国产中文一区二区三区 | 91久久久久久久久 | 亚洲精品在线视频 | www.亚洲.com | 国产精品毛片一区二区在线看 | 国产精品久久久久久久一区探花 | 国产成人精品一区二区三区四区 | 国产精品18毛片一区二区 | av一二三四 | 天堂久久av | 国产欧美精品一区二区色综合朱莉 | 国产精品视频在线播放 | 欧美乱操 | 婷婷综合| 亚洲精品白浆高清久久久久久 | 91原创视频在线观看 | 精品三级在线观看 | 欧美激情综合色综合啪啪五月 | 性一交一乱一伦视频免费观看 |