![]() |
發布時間: 2025-1-11 20:22
正文摘要:請教各位大佬,我使用51單片機做測距抽水的系統,當距離沒達到預設值時,顯示如圖1,當距離達到預設值水泵啟動,顯示屏變為圖2,距離正常時不會自動回到顯示距離的界面(像圖1),一直保持圖2狀態,請各位大佬指導一 ... |
eeworker 發表于 2025-1-19 15:06 你可以把完整的程序貼出來,我給你看看 |
llzfry 發表于 2025-1-19 11:00 您好,我用的是STC的,如果可以的話能不能%,我把出現的情況詳細說一下。 |
eeworker 發表于 2025-1-18 23:44 可以。請你確定你的單片機用的是STC還是AT的。還有一種可能就是寫完指令后的延時時間不夠,或者是你的程序在反復調用顯示,這樣是不合適的。 |
llzfry 發表于 2025-1-17 20:02 你好,可以和您交流一下嗎 |
WL0123 發表于 2025-1-17 13:45 好的好的,謝謝前輩,我學習一下 |
可以在重新返回圖1界面時,再次調用初始化,或者調用清屏,然后再調用顯示距離就不會有問題了。 |
eeworker 發表于 2025-1-17 09:49 前面已經說了問題不在LCD驅動代碼本身,而在于你主函數刷新LCD時是怎么調用驅動代碼的。給你一個示例,有詳細注釋,讀懂就不會解決不了目前的問題。 ![]() ![]() |
因為前幾天有點忙沒注意登錄,前輩幫我看一下驅動程序,我已經發上來了 |
void LcdWriteCmd(uchar cmd) { LcdRs_P = 0; LcdRw_P = 0; LcdEn_P = 0; P0=cmd; DelayMs(2); LcdEn_P = 1; DelayMs(2); LcdEn_P = 0; } void LcdWriteData(uchar dat) { LcdRs_P = 1; LcdRw_P = 0; LcdEn_P = 0; P0=dat; DelayMs(2); LcdEn_P = 1; DelayMs(2); LcdEn_P = 0; } void LcdGotoXY(uchar line,uchar column) { // 第一行 if(line==0) LcdWriteCmd(0x80+column); // 第二行 if(line==1) LcdWriteCmd(0x80+0x40+column); } void LcdPrintStr(uchar *str) { while(*str!='\0') LcdWriteData(*str++); } void LcdPrintNum(uint num) { LcdWriteData(num/100+0x30); // 百位 LcdWriteData(num%100/10+0x30); // 十位 LcdWriteData(num%10+0x30); // 個位 } void LcdInit() { LcdWriteCmd(0x38); // 16*2顯示,5*7點陣,8位數據口 LcdWriteCmd(0x0C); // 開顯示,不顯示光標 LcdWriteCmd(0x06); // 地址加1,當寫入數據后光標右移 LcdWriteCmd(0x01); // 清屏 } void LcdShowInit() { LcdGotoXY(0,0); // 定位到第0行第0列 LcdPrintStr("L: R: "); // 第0行顯示“ U ” LcdGotoXY(1,0); // 定位到第1行第0列 LcdPrintStr("D: "); // 第1行顯示“ L D R ” } |
eeworker 發表于 2025-1-12 21:47 程序發上來 |
WL0123 發表于 2025-1-12 07:19 可不可以麻煩前輩您幫我看一下程序 |
我認同樓上,如果初始正常,某一個動作以后不正常,首先應該判斷的就是這個動作是不是導致了一些問題。在此可以使用排除法:首先把底下的負載切除,只剩下單片機最小系統,然后連線短接使系統達到進入這個動作所需要的外部條件,查看系統反應,如果正常,那就大概率是外部干擾,如果不正常,那就繼續檢查程序。 |
圖1證明LCD驅動代碼基本沒有什么問題,刷新后成圖2,這是LCD初始化失敗的典型現象。這就要看你刷新LCD時是怎么調用的驅動代碼的。也有可能是受中斷干擾導致(雖然LCD對時序不是太敏感)。 |