熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(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)該怎么解決,希望大佬們幫忙看看,十分 ... |
單片機(jī)小白11111 發(fā)表于 2022-4-30 17:39 給你寫(xiě)一個(gè)異組端口驅(qū)動(dòng)LCD示例
|
小牢頭 發(fā)表于 2020-12-16 11:36 哥 能幫忙寫(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 |
gagaga123 發(fā)表于 2020-12-17 11:12 iic只有2個(gè)數(shù)據(jù)口,單片機(jī)隨便找2個(gè)端口就行了。需要找賣家要驅(qū)動(dòng)和范例程序。 |
買(mǎi)回來(lái)的轉(zhuǎn)接板,找賣家要驅(qū)動(dòng)程序,都有的。 |
謝謝大家的回答,我又重新買(mǎi)了一個(gè)帶轉(zhuǎn)接板的1602液晶屏,我看這個(gè)需要iic接口,但是我單片機(jī)上沒(méi)有iic接口,是不是需要編寫(xiě)程序把普通接口轉(zhuǎn)為iic接口 |
我記得1602是可以改用串行方式通訊的吧 你改成串口通訊 不要用并口 |
1、調(diào)硬件接線,重新調(diào)回就可以看書(shū)按順序就可以; 2、調(diào)軟件寫(xiě)法,一個(gè)口一個(gè)口地寫(xiě)數(shù)據(jù)樓上有程例接線可隨意。 |
從網(wǎng)上找,有4線驅(qū)動(dòng)的程序,拿來(lái)修改一下,或者TB干脆買(mǎi)一片IIC的1602驅(qū)動(dòng)板,才兩三塊錢(qián),只需要接VCC、GND、SCK、SDI四根線就行。 |
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)題了。 |
可以分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 |
你的另一個(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; |
wwh2382 發(fā)表于 2020-12-16 10:33 我在網(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); } } |
wwh2382 發(fā)表于 2020-12-16 10:33 P1的8個(gè)口 需要進(jìn)行AD轉(zhuǎn)換 不過(guò)P2的8個(gè)口沒(méi)有用 |
1602的接口可以重新定義的。從你的圖來(lái)看,p1有8個(gè)口適合對(duì)應(yīng)1602的數(shù)據(jù)接口,然后修改程序與之對(duì)應(yīng)即可。1602的其它幾個(gè)接口類似。沒(méi)看到你的程序,不好說(shuō)得太具體 |
Powered by 單片機(jī)教程網(wǎng)