我寫了一個(gè)1602顯示溫度,時(shí)間測量水深的89S52系統(tǒng)
由于涉及很多的變量,data區(qū)大小有限,所以需要把所有用于緩存或儲存數(shù)據(jù)的數(shù)組放在xdata中,但是1602無法顯示所需要的字符,經(jīng)過調(diào)試,我發(fā)現(xiàn)盡管我的BUFFER[16]數(shù)組是放在data區(qū),但是1602無法讀取從xdata中取出的數(shù)據(jù),而由于data又不夠用,必須將數(shù)據(jù)儲存在xdata中,這樣我的1602就無法顯示了。
但是如果將message數(shù)組放在data或code中能正常顯示,可是code無法寫入……
小弟在此想請各位給點(diǎn)意見,幫忙解決一下這個(gè)問題,謝謝!
Ps;我本來想把Display也放到display.c當(dāng)中的,但是KEIL C讀取二維數(shù)組首行地址會顯示指針出錯(cuò),搞得我其他的程序都是傳遞二維數(shù)組行列地址給子程序,這個(gè)也是一個(gè)需要解決的問題。
程序如下:
#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"};
//二維數(shù)組,第一行結(jié)束會自動加/0,顯示結(jié)束!
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()//將要顯示數(shù)據(jù)存入緩存區(qū)
{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為偶數(shù),則是奇數(shù)行,奇數(shù)行且為最后一行
//(這里的4就是數(shù)組的最后一行)只顯示一行
{lcd_command(0x01); //清屏命令
showstring(0x80,Disp_buffer);
Delay1(4000);
}
} //
else
{k=0;showstring(0xc0,Disp_buffer);
}
if(j%2==1) Delay1(4000); //偶數(shù)行則顯示兩行
}
}
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) //發(fā)送數(shù)據(jù)//
{
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);
}
[此貼子已經(jīng)被作者于2009-11-3 22:08:22編輯過]
|