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

QQ登錄

只需一步,快速開(kāi)始

搜索

1602液晶顯示屏d0和d7接在了不同的端口上,不知道怎么解決此問(wèn)題!

查看數(shù): 3740 | 評(píng)論數(shù): 14 | 收藏 1
關(guān)燈 | 提示:支持鍵盤(pán)翻頁(yè)<-左 右->
    組圖打開(kāi)中,請(qǐng)稍候......
發(fā)布時(shí)間: 2020-12-16 09:10

正文摘要:

1602液晶顯示屏一直無(wú)法進(jìn)行初始化,經(jīng)過(guò)查看原理圖發(fā)現(xiàn):液晶屏的D0-D7引腳我有的接在了P0口,有的接在了P2口,在網(wǎng)上找的程序發(fā)現(xiàn):在寫(xiě)入時(shí),都是接在了一個(gè)口,這個(gè)問(wèn)題我應(yīng)該怎么解決,希望大佬們幫忙看看,十分 ...

回復(fù)

ID:155507 發(fā)表于 2022-5-1 07:50
單片機(jī)小白11111 發(fā)表于 2022-4-30 17:39
哥 能幫忙寫(xiě)個(gè)底層程序嗎 沒(méi)接在一個(gè)p口 寫(xiě)不出來(lái)
DB0 p3.2
DB1 p3.3

給你寫(xiě)一個(gè)異組端口驅(qū)動(dòng)LCD示例

  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

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

  7. sbit code0=P3^2;                       //定義LCD數(shù)據(jù)端口
  8. sbit code1=P3^3;
  9. sbit code2=P3^4;
  10. sbit code3=P3^5;
  11. sbit code4=P3^6;
  12. sbit code5=P3^7;
  13. sbit code6=P1^0;
  14. sbit code7=P1^1;      

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


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

  63.         write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  64.         write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
  65.         write_com(0x0c);//設(shè)置開(kāi)顯示,不顯光標(biāo)
  66.         write_com(0x06);//設(shè)置寫(xiě)一個(gè)字符后地址指針加1
  67.         write_com(0x80);//數(shù)據(jù)指針初始化,設(shè)置顯示初始位置
  68. }
  69. /**********************主程序*************************/
  70. void main()
  71. {
  72.         uchar i;                                        //定義循環(huán)變量
  73.         init();                                         //初始化程序
  74.         /******用for循環(huán)按字節(jié)逐個(gè)寫(xiě)********/
  75.         write_com(0x80);                  //數(shù)據(jù)指針第一行起始0x80位置
  76.         for(i=0;i<16;i++)                 //每循環(huán)一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
  77.         {
  78.                 write_date(table1[i]);        //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)               
  79.         }
  80.         write_com(0xc0);                  //數(shù)據(jù)指針第二行起始位置0x80+0x40=0xc0
  81.         for(i=0;i<16;i++)                 //每循環(huán)一次寫(xiě)一個(gè)字節(jié)數(shù)據(jù)
  82.         {
  83.                 write_date(table2[i]);        //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)               
  84.         }
  85.         while(1);
  86. }

復(fù)制代碼
ID:1022981 發(fā)表于 2022-4-30 17:39
小牢頭 發(fā)表于 2020-12-16 11:36
可以分2次進(jìn)行送入數(shù)據(jù)的,但你的接線高低位反轉(zhuǎn),建議P2.7接DB7,P0.0接DB0這樣高低對(duì)應(yīng)的接法,省去程序 ...

哥 能幫忙寫(xiě)個(gè)底層程序嗎 沒(méi)接在一個(gè)p口 寫(xiě)不出來(lái)
DB0 p3.2
DB1 p3.3
DB2 p3.4
DB3 p3.5
DB4 p3.6
DB5 p3.7
DB6 p1.0
DB7 p1.1
ID:748788 發(fā)表于 2020-12-17 16:16
gagaga123 發(fā)表于 2020-12-17 11:12
謝謝大家的回答,我又重新買(mǎi)了一個(gè)帶轉(zhuǎn)接板的1602液晶屏,我看這個(gè)需要iic接口,但是我單片機(jī)上沒(méi)有iic接口 ...

iic只有2個(gè)數(shù)據(jù)口,單片機(jī)隨便找2個(gè)端口就行了。需要找賣家要驅(qū)動(dòng)和范例程序。
ID:403593 發(fā)表于 2020-12-17 12:22
買(mǎi)回來(lái)的轉(zhuǎn)接板,找賣家要驅(qū)動(dòng)程序,都有的。
ID:839796 發(fā)表于 2020-12-17 11:12
謝謝大家的回答,我又重新買(mǎi)了一個(gè)帶轉(zhuǎn)接板的1602液晶屏,我看這個(gè)需要iic接口,但是我單片機(jī)上沒(méi)有iic接口,是不是需要編寫(xiě)程序把普通接口轉(zhuǎn)為iic接口
ID:453198 發(fā)表于 2020-12-17 10:48
我記得1602是可以改用串行方式通訊的吧 你改成串口通訊 不要用并口
ID:584814 發(fā)表于 2020-12-17 10:27
1、調(diào)硬件接線,重新調(diào)回就可以看書(shū)按順序就可以;
2、調(diào)軟件寫(xiě)法,一個(gè)口一個(gè)口地寫(xiě)數(shù)據(jù)樓上有程例接線可隨意。
ID:403593 發(fā)表于 2020-12-16 12:11
從網(wǎng)上找,有4線驅(qū)動(dòng)的程序,拿來(lái)修改一下,或者TB干脆買(mǎi)一片IIC的1602驅(qū)動(dòng)板,才兩三塊錢(qián),只需要接VCC、GND、SCK、SDI四根線就行。
ID:226055 發(fā)表于 2020-12-16 12:00
    1、最徹底的辦法,從硬件上解決,重新布一版PCB,一勞永逸。(現(xiàn)在PCB打樣便宜到?jīng)]朋友)
    2、軟件上面肯定可以處理,你找的資源就很有參考意義。但需要注意:
    1)單片機(jī)的處理速度盡可能快一些,主頻配置的高一些,這樣刷屏應(yīng)該是看不出有什么區(qū)別的。
    2)51單片機(jī)Pn口正好8位,可以將1字節(jié)數(shù)據(jù)同時(shí)發(fā)送或接收,這樣的效率顯然高于不是同一個(gè)Pn口的處理,但如果單片機(jī)處理速度夠快(比如比較新的1T單片機(jī)),就不存在這個(gè)問(wèn)題了。
ID:861234 發(fā)表于 2020-12-16 11:36
可以分2次進(jìn)行送入數(shù)據(jù)的,但你的接線高低位反轉(zhuǎn),建議P2.7接DB7,P0.0接DB0這樣高低對(duì)應(yīng)的接法,省去程序上調(diào)整線序,例如送數(shù)0xa5:P2 = P2 & 0xaf, P0 = P0 & 0xf5
ID:748788 發(fā)表于 2020-12-16 11:11
你的另一個(gè)問(wèn)題里用了這樣一句:#define LCD_Data P0。這里有的是另一句:#define DataPort P0。不知道2者是不是一回事!看圖說(shuō)話:可以將P0改為P1,然后,sbit RS = P0^2;          //定義端口
sbit RW = P0^1;
sbit EN = P0^0;
ID:839796 發(fā)表于 2020-12-16 10:43
wwh2382 發(fā)表于 2020-12-16 10:33
1602的接口可以重新定義的。從你的圖來(lái)看,p1有8個(gè)口適合對(duì)應(yīng)1602的數(shù)據(jù)接口,然后修改程序與之對(duì)應(yīng)即可。1 ...

我在網(wǎng)上找的這個(gè)程序,但是不會(huì)改
#include<stc15.h>         
#include<intrins.h>

sbit RS = P1^2;          //定義端口
sbit RW = P1^1;
sbit EN = P1^0;

#define RS_CLR RS=0            //選擇命令
#define RS_SET RS=1                   //選擇數(shù)據(jù)

#define RW_CLR RW=0            //寫(xiě)
#define RW_SET RW=1            //讀

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

#define DataPort P0

/*------------------------------------------------
uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
長(zhǎng)度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延時(shí)1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
              判忙函數(shù)
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
RS_CLR;
RW_SET;
EN_CLR;
_nop_();    //延時(shí)一個(gè)指令周期,一個(gè)指令周期為12MHZ
EN_SET;
return (bit)(DataPort & 0x80);//返回值強(qiáng)制轉(zhuǎn)換成位的形式,dataport與0x80得出的結(jié)果1ture,0false
}                                                           //讀LCD數(shù)據(jù)口,只要最高位bit7,為1忙,為0不忙
/*------------------------------------------------
              寫(xiě)入命令函數(shù)
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
while(LCD_Check_Busy()); //忙則等待,忙返回1,那么while(1)一直循環(huán)下去
RS_CLR;
RW_CLR;
EN_SET;
//P03= com&0x80;
//P02= com&0x40;
//P01= com&0x20;
//P00= com&0x10;
//P27= com&0x08;
//P26= com&0x04;
//P25= com&0x02;
//P24= com&0x01;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
              寫(xiě)入數(shù)據(jù)函數(shù)
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待 (判忙)
RS_SET;
RW_CLR;
EN_SET;
//P03= Data&0x80;
//P02= Data&0x40;
//P01= Data&0x20;
//P00= Data&0x10;
//P27= Data&0x08;
//P26= Data&0x04;
//P25= Data&0x02;
//P24= Data&0x01;
  DataPort=Data;
_nop_();
EN_CLR;
}

/*------------------------------------------------
                清屏函數(shù)
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              寫(xiě)入字符串函數(shù)
------------------------------------------------*/
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);   //通過(guò)指針形式,依次寫(xiě)入字符串
s ++;     
        }
}
/*------------------------------------------------
              寫(xiě)入字符函數(shù)
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)                      //設(shè)置坐標(biāo),若y!=0則第一行寫(xiě)滿
        {     
        LCD_Write_Com(0x80 + x); //第一排以0x80起始,以寫(xiě)命令的方式寫(xiě)入,寫(xiě)之前判忙  
        }   
else
        {     
        LCD_Write_Com(0xC0 + x); //第二排以0xc0起始,以寫(xiě)命令的方式寫(xiě)入,寫(xiě)之前判忙   
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函數(shù)
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
   LCD_Write_Com(0x01);    /*顯示清屏*/
   LCD_Write_Com(0x06);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*顯示開(kāi)及光標(biāo)設(shè)置*/
   }
   
/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
void main(void)
{
LCD_Init(); //對(duì)光標(biāo)設(shè)置,以及屏幕清屏
LCD_Clear();//清屏
while (1)
{  
  LCD_Write_Char(7,0,'o');
  LCD_Write_Char(8,0,'k');
  LCD_Write_String(1,1,"hello world");
  while(1);
}
}
ID:839796 發(fā)表于 2020-12-16 10:38
wwh2382 發(fā)表于 2020-12-16 10:33
1602的接口可以重新定義的。從你的圖來(lái)看,p1有8個(gè)口適合對(duì)應(yīng)1602的數(shù)據(jù)接口,然后修改程序與之對(duì)應(yīng)即可。1 ...

P1的8個(gè)口 需要進(jìn)行AD轉(zhuǎn)換  不過(guò)P2的8個(gè)口沒(méi)有用
ID:748788 發(fā)表于 2020-12-16 10:33
1602的接口可以重新定義的。從你的圖來(lái)看,p1有8個(gè)口適合對(duì)應(yīng)1602的數(shù)據(jù)接口,然后修改程序與之對(duì)應(yīng)即可。1602的其它幾個(gè)接口類似。沒(méi)看到你的程序,不好說(shuō)得太具體

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

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

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