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

QQ登錄

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

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

12864顯示多出亂碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:77398 發(fā)表于 2017-2-27 21:31 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在用12864顯示溫度距離數(shù)據(jù)的時(shí)候,不進(jìn)入while(1)循環(huán),顯示正常,進(jìn)入之后,改變數(shù)組bb和cc的值,再次顯示就出現(xiàn)了亂碼,可能是哪些原因呢?有沒(méi)有碰到過(guò)類(lèi)似的問(wèn)題的?#include <REGX52.H>
#include <stdio.h>
#include "LCD.H"
#include "18B20.H"
#include "delay.h"

sbit k1=P1^0;//功能鍵
sbit k2=P1^1;//調(diào)整鍵
sbit csb=P2^7;//Trig
sbit csbint=P3^2;//Echo
sbit bg=P2^6;
sbit fmq=P3^3;//蜂鳴器

unsigned char aa[]={'D','i','s','t','a','n','c','e',':'};           //Distance

unsigned char bb[]={' ',' ',' ',' ','.',' ',' ',' '};//用于顯示溫度值       
unsigned char cc[]={'A','.','A','A','m'};
unsigned char zf,a1,a2,a3,xs,e,n,m,z;         //zf 溫度正負(fù)標(biāo)志位;a1,a2,a3,按鍵設(shè)定程序中定值的米、分米、厘米臨時(shí)存儲(chǔ)變量
                                             //xs,e 用于按鍵程序中設(shè)定位閃動(dòng)顯示的變量;flag,未用,n,m,z是背光控制標(biāo)志位變量,改變報(bào)警值時(shí)控制閃爍循環(huán);
unsigned int dz,k,s,j,bgz,k;//dz為報(bào)警值
int temp;
float temperature,csbc,wdz;
bit wh;

main()
{
        TH0=0;//T0用于計(jì)時(shí),計(jì)算超聲波返回脈沖的寬度  51單片機(jī)自加1計(jì)數(shù)
        TL0=0;
        TMOD=0X11;        //T1,T0為16位定時(shí)器  實(shí)際只使用了定時(shí)器0
        EA=0;
        bg=0;
        n=0;         
        m=0;
        z=0;
        init();//LCD初始化
        Init_DS18B20();//DS18B20初始化
    dz=80;//調(diào)值 設(shè)定報(bào)警值
        bb[6]=0xa1;//顯示攝氏度符號(hào)
        bb[7]=0xe6;
        e=4;
        cc[0]=dz/100+'0';
        cc[2]=dz/10%10+'0';
        cc[3]=dz%10+'0';
        LCD_Write_String(0,0,"  超聲波測(cè)距儀  ");
        LCD_Write_String(0,1,"距離:");
        LCD_Write_String(0,2,"溫度:");
        LCD_Write_String(0,3,"閾值:");
        LCD_Write_String(3,3,cc);          
        while(1)
        {         
                temp=ReadTemperature();
                fmq=1;
                DelayMs(100);
                if(temp<0)
                {
                           temp=-(temp-1);
                           zf=1;//zf 溫度正負(fù)標(biāo)志位  zf為1是溫度為負(fù)
                        bb[0]='-';
                }
                else
                {
                        zf=0;
                        bb[0]=' ';
                }
                  csb=0;                                             //啟動(dòng)一次模塊
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();

                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                 
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();

                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  _nop_();
                  csb=1;
                ET0=1;        //啟動(dòng)計(jì)數(shù)器T0,用以計(jì)時(shí)
                TR0=1;
                EA=1;
                j=80;        //延時(shí)                 
            while(j--)
                {
                }
                csbint=1;
        j=0;
                   while(csbint)                        //判斷接收回路是否收到超聲波的回波
                {
                        j++;
                        if(j>=2500)                        //如果達(dá)到一定時(shí)間沒(méi)有收到回波,則將csbint置零,退出接收回波處理程序
                        csbint=0;
                }
                TR0=0;
                s=TH0*256+TL0;                        //讀取時(shí)間數(shù)據(jù)
                TH0=0;
                TL0=0;
                wdz=0.00000607*temp;   //溫度補(bǔ)償計(jì)算
                if(zf==0)
                {                                                                                                                                                                                       
                          csbc=0.03315+wdz;
                }
                else csbc=0.03315-wdz;
                csbc=csbc/2;
                s=s*csbc-8;
                if(s<5) //測(cè)量值小于下限
                {
                        cc[0]='-';
                        cc[2]='-';
                        cc[3]='-';
                }
                else if(s>500)        //測(cè)量值大于上限
                {
                        cc[0]='C';
                        cc[2]='C';
                        cc[3]='C';
                }
                else
                {
                        cc[0]=s/100+'0';
                        cc[2]=s/10%10+'0';
                        cc[3]=s%10+'0';
                }
                if(s<dz)//調(diào)節(jié)報(bào)警聲音的頻率
                {
                        bgz=s*5;
                          for (k=0;k<bgz;k++)
                          {
                            DelayUs2x(150);
                            fmq=!fmq;       //BEEP取反
                          }
                }
                bb[1]=temp/1000+0x30;
                bb[2]=temp/100%10+0x30;//顯示十位
                bb[3]=temp%100/10+0x30;//顯示個(gè)位
                bb[5]=temp%10+0x30; //小數(shù)
        if(zf==0)
            {
                        if(temp<1000)
                        {
                                   bb[1]=' ';
                                   if(temp<100)
                                   {
                                      bb[2]=' ';
                                }
                        }
                }
                else
                {
                        if(temp<1000)
                        {
                                   bb[0]=' ';
                                   bb[1]='-';
                                   if(temp<100)
                                   {
                                        bb[0]=' ';
                                           bb[1]=' ';
                                      bb[2]='-';
                                }
                        }
                }
                LCD_Write_String(3,2,bb);//顯示測(cè)得的溫度
                LCD_Write_String(3,1,cc);//顯示測(cè)得的距離


                while(!k2)                   //液晶背面開(kāi)關(guān)
                {
                   n=1;
                }
                if(n==1)
                {
                   bg=~bg;                   //bg=0;時(shí)開(kāi)背光燈
                   n=0;
                }
                if(!k1)      //按鍵處理程序
                {
                    TR1=0;
                        TR0=0;
                          cc[0]='A';
                        cc[1]='.';
                        cc[2]='A';
                        cc[3]='A';
                        cc[4]='m';
                        LCD_Write_String(3,3,cc);
                        k=500;
                    while(k)
                        {
                                 k--;
                                DelayMs(2);
                        }
                          cc[0]=dz/100+'0';
                        cc[2]=dz/10%10+'0';
                        cc[3]=dz%10+'0';
                        LCD_Write_String(3,3,cc);
                        a1=dz/100;
                        a2=dz/10%10;
                        a3=dz%10;
                        n=1;
                          while(n)
                        {
                                if(!k2)
                                {
                                        while(!k2);//等待松手
                                        e=1;
                                        xs=3;
                                        a1+=1;
                                        if(a1>5)
                                        a1=0;
                                          cc[0]=a1+'0';
                                }

                                if (e==1)
                                {
                                        xs++;
                                          cc[0]=a1+'0';
                                          if(xs>6)
                                          {
                                    xs=0;
                                                e=0;
                                          }
                                }
                                else
                                {
                                        cc[0]=' ';
                                        xs++;
                                        if(xs>3)
                                        {
                                                xs=0;
                                                e=1;
                                        }
                                }
                                LCD_Write_String(3,3,cc);
                                if(!k1)
                                {
                                        while(!k1);
                                          cc[0]=a1+'0';
                                        m=1;
                                        while(m)
                                        {
                                                if(!k2)
                                                {
                                                        while(!k2);
                                                        e=1;
                                                        xs=3;
                                                        a2+=1;
                                                        if(a2>9)
                                                        a2=0;
                                                          cc[2]=a2+'0';
                                                        LCD_Write_String(3,3,cc);
                                                }

                                                if (e==1)
                                                {
                                                        xs++;
                                                          cc[2]=a2+'0';
                                                          if(xs>6)
                                                          {
                                                    xs=0;
                                                                e=0;
                                                          }
                                                }
                                                else
                                                {
                                                        cc[2]=' ';
                                                        xs++;
                                                        if(xs>3)
                                                        {
                                                                xs=0;
                                                                e=1;
                                                        }
                                                }
                                                LCD_Write_String(3,3,cc);
                                               
                                                if(!k1)
                                                {
                                                        while(!k1);
                                                        cc[2]=a2+'0';
                                                        z=1;
                                                        while(z)
                                                        {
                                                                if(!k2)//改變報(bào)警值
                                                                {
                                                                        while(!k2);
                                                                        e=1;
                                                                        xs=3;
                                                                        a3+=1;
                                                                        if(a3>9)
                                                        a3=0;
                                                                          cc[3]=a3+'0';
                                                                        LCD_Write_String(3,3,cc);
                                                                }

                                                                if (e==1)//控制閃爍
                                                                {
                                                                        xs++;
                                                                          cc[3]=a3+'0';
                                                                          if(xs>6)
                                                                          {
                                                                    xs=0;
                                                                                e=0;
                                                                          }
                                                                }
                                                                else
                                                                {
                                                                        cc[3]=' ';
                                                                        xs++;
                                                                        if(xs>3)
                                                                        {
                                                                                xs=0;
                                                                                e=1;
                                                                        }
                                                                }
                                                                LCD_Write_String(3,3,cc);

                                                                if(!k1)
                                                                {
                                                                        while(!k1);
                                                                        dz=a1*100+a2*10+a3;
                                                                        n=0;
                                                                        m=0;
                                                                        z=0;
                                                                }
                                                        }
                                                }
                                        }
                                }               
                        }
                }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:151348 發(fā)表于 2017-3-2 18:31 | 只看該作者
估計(jì)是時(shí)序的問(wèn)題
回復(fù)

使用道具 舉報(bào)

板凳
ID:164839 發(fā)表于 2017-3-2 20:28 | 只看該作者
  軟件其他地方有沒(méi)有對(duì)引腳進(jìn)行使用。。   中斷函數(shù)里面如果用到了屏幕的引腳就很有可能會(huì)亂碼
回復(fù)

使用道具 舉報(bào)

地板
ID:167750 發(fā)表于 2017-3-2 20:32 來(lái)自手機(jī) | 只看該作者
時(shí)序問(wèn)題
回復(fù)

使用道具 舉報(bào)

5#
ID:125378 發(fā)表于 2017-3-3 13:26 | 只看該作者
軟件其他地方有沒(méi)有對(duì)引腳進(jìn)行使用。。   中斷函數(shù)里面如果用到了屏幕的引腳就很有可能會(huì)亂碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:125378 發(fā)表于 2017-3-3 13:26 | 只看該作者
查看時(shí)序圖,檢查程序
回復(fù)

使用道具 舉報(bào)

7#
ID:54992 發(fā)表于 2017-3-11 10:59 | 只看該作者
I2C接口帶中英文字庫(kù)12864液晶屏,支持任意坐標(biāo)位置(橫向坐標(biāo),縱向坐標(biāo)都以像素點(diǎn)為單位),希望能幫你解決問(wèn)題。

1.png (493.73 KB, 下載次數(shù): 101)

1.png

2.png (4.8 MB, 下載次數(shù): 94)

2.png

Arduino I2C控制字庫(kù)12864液晶屏資料.rar

664.1 KB, 下載次數(shù): 29

回復(fù)

使用道具 舉報(bào)

8#
ID:2864 發(fā)表于 2017-3-17 08:22 | 只看該作者
學(xué)習(xí)了,不錯(cuò)的帖子
回復(fù)

使用道具 舉報(bào)

9#
ID:77398 發(fā)表于 2017-3-18 11:21 | 只看該作者
謝謝各位的解答,我已經(jīng)找到問(wèn)題了,統(tǒng)一回復(fù)一下:
在定義字符串?dāng)?shù)組時(shí),要多定義一個(gè)字節(jié),用來(lái)存放 '\0' ,字符數(shù)組的大小最好也給出確定值。
碰到類(lèi)似問(wèn)題的小伙伴,可以檢查下你們定義的字符串?dāng)?shù)組哦。!
回復(fù)

使用道具 舉報(bào)

10#
ID:59574 發(fā)表于 2017-3-18 11:50 | 只看該作者
時(shí)序有問(wèn)題可能
回復(fù)

使用道具 舉報(bào)

11#
ID:77398 發(fā)表于 2018-3-11 21:23 | 只看該作者
謝謝大家的關(guān)注和回復(fù)。。‘厴I(yè)的時(shí)候做的,記得好像是字符數(shù)組的大小要比要存的數(shù)據(jù)多一位,用于放結(jié)束標(biāo)志零(即字符  ‘\0’ )
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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