找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6184|回复: 10
打印 上一主题 下一主题
收起左侧

12864显示多出乱码

[复制链接]
跳转到指定楼层
楼主
在用12864显示温度距离数据的时候,不进入while(1)循环,显示正常,进入之后,改变数组bb和cc的值,再次显示就出现了乱码,可能是哪些原因呢?有没有碰到过类似的问题的?#include <REGX52.H>
#include <stdio.h>
#include "LCD.H"
#include "18B20.H"
#include "delay.h"

sbit k1=P1^0;//功能键
sbit k2=P1^1;//调整键
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 温度正负标志位;a1,a2,a3,按键设定程序中定值的米、分米、厘米临时存储变量
                                             //xs,e 用于按键程序中设定位闪动显示的变量;flag,未用,n,m,z是背光控制标志位变量,改变报警值时控制闪烁循环;
unsigned int dz,k,s,j,bgz,k;//dz为报警值
int temp;
float temperature,csbc,wdz;
bit wh;

main()
{
        TH0=0;//T0用于计时,计算超声波返回脉冲的宽度  51单片机自加1计数
        TL0=0;
        TMOD=0X11;        //T1,T0为16位定时器  实际只使用了定时器0
        EA=0;
        bg=0;
        n=0;         
        m=0;
        z=0;
        init();//LCD初始化
        Init_DS18B20();//DS18B20初始化
    dz=80;//调值 设定报警值
        bb[6]=0xa1;//显示摄氏度符号
        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,"  超声波测距仪  ");
        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 温度正负标志位  zf为1是温度为负
                        bb[0]='-';
                }
                else
                {
                        zf=0;
                        bb[0]=' ';
                }
                  csb=0;                                             //启动一次模块
                  _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;        //启动计数器T0,用以计时
                TR0=1;
                EA=1;
                j=80;        //延时                 
            while(j--)
                {
                }
                csbint=1;
        j=0;
                   while(csbint)                        //判断接收回路是否收到超声波的回波
                {
                        j++;
                        if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
                        csbint=0;
                }
                TR0=0;
                s=TH0*256+TL0;                        //读取时间数据
                TH0=0;
                TL0=0;
                wdz=0.00000607*temp;   //温度补偿计算
                if(zf==0)
                {                                                                                                                                                                                       
                          csbc=0.03315+wdz;
                }
                else csbc=0.03315-wdz;
                csbc=csbc/2;
                s=s*csbc-8;
                if(s<5) //测量值小于下限
                {
                        cc[0]='-';
                        cc[2]='-';
                        cc[3]='-';
                }
                else if(s>500)        //测量值大于上限
                {
                        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)//调节报警声音的频率
                {
                        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;//显示个位
                bb[5]=temp%10+0x30; //小数
        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);//显示测得的温度
                LCD_Write_String(3,1,cc);//显示测得的距离


                while(!k2)                   //液晶背面开关
                {
                   n=1;
                }
                if(n==1)
                {
                   bg=~bg;                   //bg=0;时开背光灯
                   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)//改变报警值
                                                                {
                                                                        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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:151348 发表于 2017-3-2 18:31 | 只看该作者
估计是时序的问题
回复

使用道具 举报

板凳
ID:164839 发表于 2017-3-2 20:28 | 只看该作者
  软件其他地方有没有对引脚进行使用。。   中断函数里面如果用到了屏幕的引脚就很有可能会乱码
回复

使用道具 举报

地板
ID:167750 发表于 2017-3-2 20:32 来自手机 | 只看该作者
时序问题
回复

使用道具 举报

5#
ID:125378 发表于 2017-3-3 13:26 | 只看该作者
软件其他地方有没有对引脚进行使用。。   中断函数里面如果用到了屏幕的引脚就很有可能会乱码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:125378 发表于 2017-3-3 13:26 | 只看该作者
查看时序图,检查程序
回复

使用道具 举报

7#
ID:54992 发表于 2017-3-11 10:59 | 只看该作者
I2C接口带中英文字库12864液晶屏,支持任意坐标位置(横向坐标,纵向坐标都以像素点为单位),希望能帮你解决问题。

1.png (493.73 KB, 下载次数: 100)

1.png

2.png (4.8 MB, 下载次数: 93)

2.png

Arduino I2C控制字库12864液晶屏资料.rar

664.1 KB, 下载次数: 29

回复

使用道具 举报

8#
ID:2864 发表于 2017-3-17 08:22 | 只看该作者
学习了,不错的帖子
回复

使用道具 举报

9#
ID:77398 发表于 2017-3-18 11:21 | 只看该作者
谢谢各位的解答,我已经找到问题了,统一回复一下:
在定义字符串数组时,要多定义一个字节,用来存放 '\0' ,字符数组的大小最好也给出确定值。
碰到类似问题的小伙伴,可以检查下你们定义的字符串数组哦!!!
回复

使用道具 举报

10#
ID:59574 发表于 2017-3-18 11:50 | 只看该作者
时序有问题可能
回复

使用道具 举报

11#
ID:77398 发表于 2018-3-11 21:23 | 只看该作者
谢谢大家的关注和回复!!!毕业的时候做的,记得好像是字符数组的大小要比要存的数据多一位,用于放结束标志零(即字符  ‘\0’ )
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表