找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[求助]1602无法读取xdata中的字符

[复制链接]
跳转到指定楼层
楼主
ID:3003 发表于 2009-11-3 22:06 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
 

我写了一个1602显示温度,时间测量水深的89S52系统

由于涉及很多的变量,data区大小有限,所以需要把所有用于缓存或储存数据的数组放在xdata中,但是1602无法显示所需要的字符,经过调试,我发现尽管我的BUFFER[16]数组是放在data区,但是1602无法读取从xdata中取出的数据,而由于data又不够用,必须将数据储存在xdata中,这样我的1602就无法显示了。

但是如果将message数组放在data或code中能正常显示,可是code无法写入……

小弟在此想请各位给点意见,帮忙解决一下这个问题,谢谢!


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


程序如下:

#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);

}

[此贴子已经被作者于2009-11-3 22:08:22编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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