找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3933|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)程序,我想輸入一個任意數(shù)字,然后顯示在lcd上,但是不行,希望求解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:885542 發(fā)表于 2021-2-27 20:23 來自手機(jī) | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
#include"reg52.h"
#include "lcd.h"
typedef unsigned int u16;
typedef unsigned char u8;

void UsartInit()      //初始串口
{
  TMOD=0x20;
  TH1=0xF3;      //設(shè)置比特率
  TL1=0xF3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;
  ES=1;
  EA=1;
}

void Usart() interrupt 4
{
  u8 receiveData;
  receiveData=SBUF;
  receiveDat=receiveData+0x30;   
  LcdWriteData(receiveData);   //寫入函數(shù),寫入函數(shù)
                                                    在另一個文檔有過設(shè)置
  RI =0;
  SBUF=receiveData;
  while(!TI);
  TI=0;
}

void main()
{
  LcdInit();        //初始化函數(shù),另一個.c文檔有說明
  UsartInit();
  while(1);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:885542 發(fā)表于 2021-2-27 20:39 來自手機(jī) | 只看該作者
同時,命令函數(shù)也是有的,lcdwritecom,大佬解答時方便直接用這個
回復(fù)

使用道具 舉報

板凳
ID:390416 發(fā)表于 2021-2-27 21:18 | 只看該作者
你真是人才,在串口中斷里面 居然去調(diào)用LCD顯示函數(shù)。把LCD顯示獨(dú)立 把串口收發(fā)獨(dú)立 ,這樣處理串口的時候,不會被迫增加時間。
還有 串口發(fā)送使用whiel 死等是很浪費(fèi)CPU的?梢杂弥袛嘀苯犹幚砭托辛。
這是LCD http://www.torrancerestoration.com/bbs/dpj-200685-1.html
這是串口http://www.torrancerestoration.com/bbs/dpj-200927-1.html
這是串口打印 http://www.torrancerestoration.com/bbs/dpj-201660-1.html
回復(fù)

使用道具 舉報

地板
ID:213173 發(fā)表于 2021-2-27 21:45 | 只看該作者
void Usart() interrupt 4
{
        u8 receiveData;
        RI =0;
        receiveData=SBUF;
//        receiveDat=receiveData+0x30;   
        lcdwritecom(0x80);                                        //數(shù)據(jù)指針設(shè)置顯示位置  
        LcdWriteData(receiveData+0x30);                //寫入函數(shù),數(shù)據(jù)轉(zhuǎn)換成ASCII字符碼
        SBUF=receiveData;                                        //將收到的數(shù)據(jù)返回上位機(jī)
        while(!TI);
        TI=0;
}
回復(fù)

使用道具 舉報

5#
ID:885542 發(fā)表于 2021-2-27 22:01 來自手機(jī) | 只看該作者
wulin 發(fā)表于 2021-2-27 21:45
void Usart() interrupt 4
{
        u8 receiveData;

不行呀,好兄弟,我用串口發(fā)一個1,lcd上出現(xiàn)亂碼呢。。。。
回復(fù)

使用道具 舉報

6#
ID:213173 發(fā)表于 2021-2-28 06:47 | 只看該作者
刮痧小能手 發(fā)表于 2021-2-27 22:01
不行呀,好兄弟,我用串口發(fā)一個1,lcd上出現(xiàn)亂碼呢。。。。

出現(xiàn)亂碼要在串口助手里看看返回的數(shù)字是否正確以區(qū)分是串口程序問題還是LCD驅(qū)動程序問題
回復(fù)

使用道具 舉報

7#
ID:885542 發(fā)表于 2021-2-28 09:09 來自手機(jī) | 只看該作者
wulin 發(fā)表于 2021-2-28 06:47
出現(xiàn)亂碼要在串口助手里看看返回的數(shù)字是否正確以區(qū)分是串口程序問題還是LCD驅(qū)動程序問題

串口上也不會顯示我所輸入的數(shù)字,那咋么辦,我沒有一點(diǎn)頭緒呀,應(yīng)該改哪里
回復(fù)

使用道具 舉報

8#
ID:882829 發(fā)表于 2021-2-28 10:42 | 只看該作者
很簡單,網(wǎng)上大把例子
回復(fù)

使用道具 舉報

9#
ID:748788 發(fā)表于 2021-2-28 10:45 | 只看該作者
懷疑你是一接觸單片機(jī)就直接上手串口和顯示屏,若果真這樣就沒有不蒙的,還是循序漸進(jìn)吧
回復(fù)

使用道具 舉報

10#
ID:885542 發(fā)表于 2021-2-28 12:21 來自手機(jī) | 只看該作者
wwh2382 發(fā)表于 2021-2-28 10:45
懷疑你是一接觸單片機(jī)就直接上手串口和顯示屏,若果真這樣就沒有不蒙的,還是循序漸進(jìn)吧

不不不,我學(xué)了一點(diǎn)了,20天了,我已經(jīng)想了很久了,好幾天了都沒有結(jié)果。
回復(fù)

使用道具 舉報

11#
ID:885542 發(fā)表于 2021-2-28 15:37 | 只看該作者
天意如是 發(fā)表于 2021-2-28 10:42
很簡單,網(wǎng)上大把例子

沒有的啦,我也找了,反正沒找到對的,如果有,還請你不嫌麻煩給一個
回復(fù)

使用道具 舉報

12#
ID:885542 發(fā)表于 2021-2-28 15:52 | 只看該作者
人人學(xué)會單片機(jī) 發(fā)表于 2021-2-27 21:18
你真是人才,在串口中斷里面 居然去調(diào)用LCD顯示函數(shù)。把LCD顯示獨(dú)立 把串口收發(fā)獨(dú)立 ,這樣處理串口的時候 ...

您所說的獨(dú)立出來是否如此,我試過這樣還是不行,如果哪里不對還望指正,感謝!

#include"reg52.h"
#include "lcd.h"
typedef unsigned int u16;
typedef unsigned char u8;

void UsartInit()
{
  TMOD=0x20;
  TH1=0xF3;
  TL1=0xF3;
  PCON=0x80;
  TR1=1;
  SCON=0x50;
  ES=1;
  EA=1;
}
  

u8 receiveData;
void lcdscreen()                                                                          //lcd顯示獨(dú)立出來
{
        LcdInit();
    LcdWriteCom(0x80);                                                           //設(shè)置指針在第一格
    LcdWriteData(receiveData+0x30);                                        //寫入函數(shù),數(shù)據(jù)轉(zhuǎn)換成ASCII字符碼
                      
}




void Usart() interrupt 4
{
        u8 receiveData;
        RI=0;
        receiveData=SBUF;
                lcdscreen();                                                //lcd顯示
        SBUF=receiveData;                                        //將收到的數(shù)據(jù)返回上位機(jī)
        while(!TI);
        TI=0;
}

void main()
{
  LcdInit();                                                                        //初始化lcd
  UsartInit();                                                                        //初始化串口
   
  while(1);
  
}
回復(fù)

使用道具 舉報

13#
ID:885542 發(fā)表于 2021-2-28 19:21 來自手機(jī) | 只看該作者
難道真的就沒有人能寫出來吧,不會吧
回復(fù)

使用道具 舉報

14#
ID:286819 發(fā)表于 2021-2-28 22:55 | 只看該作者
看這個程序貌似沒有錯誤,把寫入函數(shù)上傳一下,分析分析
回復(fù)

使用道具 舉報

15#
ID:885542 發(fā)表于 2021-3-1 08:42 來自手機(jī) | 只看該作者
houchg 發(fā)表于 2021-2-28 22:55
看這個程序貌似沒有錯誤,把寫入函數(shù)上傳一下,分析分析

寫入函數(shù)就不傳了吧,我是看視頻學(xué)的教程,都是一點(diǎn)點(diǎn)抄過去的,而且別的程序也用過,沒有問題的,肯定
回復(fù)

使用道具 舉報

16#
ID:691185 發(fā)表于 2021-3-1 09:02 | 只看該作者
你是在單片機(jī)上面實(shí)現(xiàn)嗎還是仿真,如果是實(shí)物的話,你看單片機(jī)的晶振頻率是不是對的。
回復(fù)

使用道具 舉報

17#
ID:885542 發(fā)表于 2021-3-1 10:29 | 只看該作者
青街古城 發(fā)表于 2021-3-1 09:02
你是在單片機(jī)上面實(shí)現(xiàn)嗎還是仿真,如果是實(shí)物的話,你看單片機(jī)的晶振頻率是不是對的。

單片機(jī)上實(shí)現(xiàn),波特率是對的,所以大哥我代碼都出來了,還有可以修改的地方嗎,我這邊單片機(jī)上lcd還是沒有顯示哎
回復(fù)

使用道具 舉報

18#
ID:213173 發(fā)表于 2021-3-1 11:50 | 只看該作者
刮痧小能手 發(fā)表于 2021-3-1 10:29
單片機(jī)上實(shí)現(xiàn),波特率是對的,所以大哥我代碼都出來了,還有可以修改的地方嗎,我這邊單片機(jī)上lcd還是沒 ...

樓主的波特率肯定不對,以下兩種任選。修改完整代碼如下,但不宜在中斷中調(diào)用LCD顯示函數(shù)。
  1. #include"reg52.h"
  2. //#include "lcd.h"
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;

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

  8. u8 receiveData;
  9. /*
  10. void UsartInit()
  11. {
  12.         TMOD=0x20;
  13.         TH1=0xF4;
  14.         TL1=0xF4;
  15. //        PCON=0x80;//不加倍
  16.         TR1=1;
  17.         SCON=0x50;
  18.         ES=1;
  19.         EA=1;
  20. }
  21. */
  22. void UsartInit()
  23. {
  24.         TMOD=0x20;
  25.         TH1=0xE8;
  26.         TL1=0xE8;
  27.         PCON=0x80;//加倍
  28.         TR1=1;
  29.         SCON=0x50;
  30.         ES=1;
  31.         EA=1;
  32. }
  33.   
  34. /*******100us延時程序********/
  35. void delay(u16 x)
  36. {
  37.         u16 a,b;
  38.         for(a=x;a>0;a--)
  39.                 for(b=10;b>0;b--);
  40. }

  41. /*******液晶寫指令程序********/
  42. void LcdWriteCom(u8 com)
  43. {
  44.         LCD_EN=0;        //初始設(shè)置LCD_EN低電平
  45.         LCD_RS=0;        //允許寫指令
  46.         P0=com;                //傳遞指令
  47.         delay(10);        //延時1ms
  48.         LCD_EN=1;        //使能寫入
  49.         delay(10);        //延時1ms
  50.         LCD_EN=0;        //低跳變執(zhí)行
  51.        
  52. }
  53. /*******液晶寫數(shù)據(jù)程序********/
  54. void LcdWriteData(u8 date)
  55. {
  56. //        LCD_EN=0;        //初始設(shè)置LCD_EN低電平
  57.         LCD_RS=1;        //允許寫數(shù)據(jù)
  58.         P0 =date;        //傳遞數(shù)據(jù)
  59.         delay(10);        //延時1ms
  60.         LCD_EN=1;        //使能寫入
  61.         delay(10);        //延時1ms
  62.         LCD_EN=0;        //低跳變執(zhí)行
  63.        
  64. }
  65. /*******液晶初始化程序********/
  66. void LcdInit()                //設(shè)置顯示模式、
  67. {
  68.         LCD_RW=0;                        //初始設(shè)置LCD_RW低電平
  69.         LcdWriteCom(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  70.         LcdWriteCom(0x01);//顯示清零,數(shù)據(jù)指針清零
  71.         LcdWriteCom(0x0c);//設(shè)置開顯示,不顯光標(biāo)
  72.         LcdWriteCom(0x06);//設(shè)置寫一個字符后地址指針加1
  73. }
  74. void lcdscreen(u8 t)    //lcd顯示獨(dú)立出來
  75. {
  76. //        LcdInit();
  77.         LcdWriteCom(0x80);   //設(shè)置指針在第一格
  78.         LcdWriteData(t+0x30);//寫入函數(shù),數(shù)據(jù)轉(zhuǎn)換成ASCII字符碼
  79. }

  80. void Usart() interrupt 4
  81. {
  82.         u8 receiveData;
  83.         RI=0;
  84.         receiveData=SBUF;
  85.         lcdscreen(receiveData);        //lcd顯示
  86.         SBUF=receiveData;   //將收到的數(shù)據(jù)返回上位機(jī)
  87.         while(!TI);
  88.         TI=0;
  89. }

  90. void main()
  91. {
  92.         LcdInit();          //初始化lcd
  93.         UsartInit();        //初始化串口

  94.         while(1);
  95. }
復(fù)制代碼


回復(fù)

使用道具 舉報

19#
ID:798631 發(fā)表于 2021-3-1 12:37 | 只看該作者
先確定是哪里的問題   寫液晶呢直接先寫個常數(shù)    根據(jù)結(jié)果處理  這樣你就有方向了
回復(fù)

使用道具 舉報

20#
ID:885542 發(fā)表于 2021-3-1 18:11 來自手機(jī) | 只看該作者
wulin 發(fā)表于 2021-3-1 11:50
樓主的波特率肯定不對,以下兩種任選。修改完整代碼如下,但不宜在中斷中調(diào)用LCD顯示函數(shù)。

不管行不行,你寫了這么多,我一定要試一下的,這么久終于有個認(rèn)真回答的了,我愛死你了
回復(fù)

使用道具 舉報

21#
ID:885542 發(fā)表于 2021-3-1 19:03 | 只看該作者
wulin 發(fā)表于 2021-3-1 11:50
樓主的波特率肯定不對,以下兩種任選。修改完整代碼如下,但不宜在中斷中調(diào)用LCD顯示函數(shù)。

我這邊單片機(jī)和你肯定不一樣,幾個端口不一樣,所以初始化那幾個沒有復(fù)制,但是其他的復(fù)制了,我也檢查了幾遍還是沒有用。。。我再想想辦法吧,感謝你了
回復(fù)

使用道具 舉報

22#
ID:213173 發(fā)表于 2021-3-1 21:17 | 只看該作者
刮痧小能手 發(fā)表于 2021-3-1 19:03
我這邊單片機(jī)和你肯定不一樣,幾個端口不一樣,所以初始化那幾個沒有復(fù)制,但是其他的復(fù)制了,我也檢查了 ...

這個程序是經(jīng)過實(shí)物驗(yàn)證過的,只要你是用的51內(nèi)核單片機(jī),串口初始化定時器都一樣。你的核心錯誤就是串口初始化定時器錯誤導(dǎo)致波特率不對。LCD1602與MCU的接口是可以按實(shí)際硬件電路定義的。
回復(fù)

使用道具 舉報

23#
ID:748788 發(fā)表于 2021-3-2 17:41 | 只看該作者
應(yīng)該確認(rèn)你的單片機(jī)晶振是不是11.0592m的。串口程序的波特率都是按照這個數(shù)字計算的,否則即使別人的程序在你的單片機(jī)上調(diào)通,也無法與串口助手之類的工具正常通信
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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