打印

1602显示温度

[复制链接]
599|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
langgq|  楼主 | 2021-2-6 13:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一个1602显示温度,时间测量水深的89S52系统
由于涉及很多的变量,data区大小有限,所以需要把所有用于缓存或储存数据的数组放在xdata中,但是1602无法显示所需要的字符,经过调试,我发现尽管我的BUFFER[16]数组是放在data区,但是1602无法读取从xdata中取出的数据,而由于data又不够用,必须将数据储存在xdata中,这样我的1602就无法显示了。
但是如果将message数组放在data或code中能正常显示,可是code无法写入……
小弟在此想请各位给点意见,帮忙解决一下这个问题,谢谢!

Ps;我本来想把Display也放到display.c当中的,但是KEIL C读取二维数组首行地址会显示指针出错,搞得我其他的程序都是传递二维数组行列地址给子程序,这个也是一个需要解决的问题。

使用特权

评论回复
沙发
hanwe| | 2021-2-6 13:21 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
langgq|  楼主 | 2021-2-6 13:24 | 只看该作者

程序如下:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code message[][16]={"It is the first",
"time i say hello","haha","I figure it out"};
//二维数组,第一行结束会自动加/0,显示结束!
uchar Disp_buffer[32];

void initialize_lcd();
void showstring(uchar,uchar*);
void lcd_command(uchar);
void Display();

void Delay1(uint x)                 
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}

void Display()//将要显示数据存入缓存区
{uchar i,j,*p,k=0;
for(j=0;j<4;j++)
    {p=message[j];                           
     for(i=0;i<16&&*p!='\0';i++)
     {Disp_buffer=*p;
      p++;}
     while(i<16)
   Disp_buffer[i++]=' ';

   if(k++<1)
  {showstring(0x80,Disp_buffer);
   if(j==4)                                       //j为偶数,则是奇数行,奇数行且为最后一行
                                                   //(这里的4就是数组的最后一行)只显示一行
      {lcd_command(0x01);                        //清屏命令
          showstring(0x80,Disp_buffer);
          Delay1(4000);
         }      
    }  //
    else
    {k=0;showstring(0xc0,Disp_buffer);
     }
    if(j%2==1) Delay1(4000); //偶数行则显示两行
    }   
}

void main()
{
initialize_lcd();
while(1) Display();
}

———————————————————————————————————————————————————————————————————

   //display.c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;

void Delay(uint x)                  
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}

uchar busy_check()       //检查是否忙//
{uchar lcd_status;
RS=0;
RW=1;
EN=1;
Delay(1);
lcd_status=P0;
EN=0;
return lcd_status;
}

void lcd_command(uchar cmd)             //写LCD命令//
{
while((busy_check()&0x80)==0x80);
RS=0;
RW=0;
EN=0;
P0=cmd; EN=1;Delay(1);EN=0;
}

void lcd_data(uchar dat)          //发送数据//
{
while((busy_check()&0x80)==0x80);
RS=1;
RW=0;
EN=0;
P0=dat;
EN=1;
Delay(1);EN=0;
}

void initialize_lcd()           //LCD初始化//
{lcd_command(0x01);
Delay(1);
lcd_command(0x38);
Delay(1);
lcd_command(0x06);
Delay(1);
lcd_command(0x0c);
Delay(1);
}

void showstring(uchar po,uchar str[])  //显示字符串//
{uchar i;                                 
lcd_command(po);
for(i=0;i<16;i++)
    {lcd_data(str);
     }
Delay(1);
}

使用特权

评论回复
地板
llia| | 2021-2-6 13:26 | 只看该作者
编程问题

使用特权

评论回复
5
langgq|  楼主 | 2021-2-6 13:28 | 只看该作者
不看程序也罢,前面那个问题估计是什么原因?

使用特权

评论回复
6
zhuww| | 2021-2-6 13:43 | 只看该作者

*p;
p=message[j];

估计这怪怪的

使用特权

评论回复
7
lium| | 2021-2-6 13:45 | 只看该作者
楼主, 是外挂RAM吗?

使用特权

评论回复
8
yufe| | 2021-2-6 13:47 | 只看该作者
先检测是否能正确读取外挂RAM.

使用特权

评论回复
9
langgq|  楼主 | 2021-2-6 13:49 | 只看该作者
多谢大家讨论这么多哈,呵呵

使用特权

评论回复
10
weifeng90| | 2021-2-8 08:57 | 只看该作者
这年头还有用1602的啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

932

主题

8762

帖子

1

粉丝