LCD显示,数据采集器,高手帮忙!(keil C51)
希望那位高手帮忙修改下下面的程序,程序已经测试成功,环境Keil C51,最好能把下面的
程序简化下,比如模块话一下,等等,谢谢各位大虾
----------------------------------------------------------------------
#include <stdio.h>
#include <at89x51.h>
#include <absacc.h>
////////////////////////////////////////////////////////////////////////////////
//////////////////////
#define RS P2_3 //lcd命令数据状态口
#define RW P2_4 //lcd读写口
#define E P2_5 //lcd使能口
#define ADC_add XBYTE[0x7800]
//预定义ad0809的地址
#define uchar unsigned char
//////////////////////////////////////////////////////////////函数声明
void lcd_init();
void lcd_command(unsigned char); //lcd命令字写入
void lcd_data(unsigned char ); //lcd显示数据写入
void delay(unsigned char); //延时
unsigned char check_key(); //扫描按键
void calc(unsigned char); //采集数据处理转换
void time();
void timeToDisplay();
unsigned char time_index=0,adc0809_index=0,adc0809_value[8]={0},adcv[6]=
{0},sec1=0,sec2=0;
unsigned int tt=0x0000;
unsigned char sec100,sec,min,hour,flag;
void main(void)
{
unsigned char key_value=0,p;
// 0x80----第一行,第一列显?
//0xC0 0H设定显示地址为第二行?
lcd_init();
lcd_data(0x54);
lcd_data(0x69);
lcd_data(0x6d);
lcd_data(0x65);
lcd_data(0x20);
lcd_data(0x69);
lcd_data(0x73);
lcd_data(0x20);
EA=1;
EX1=1;
TMOD=0x00;
TH0=0x63;
TL0=0x18;
ET0=1;
TR0=1;
hour =0;// 小时的初始值
min = 0;// 分钟的初始值
sec = 0;// 秒的初始值
flag=0;
sec100=0;
lcd_command(0xc0);
lcd_data(0x31);
lcd_data(0x3a);
while(1)
{
if((p=check_key())!=0)
{
key_value=p;
lcd_command(0xc0);
lcd_data(0x30+key_value);
lcd_data(0x3a);
delay(100);
while(P1!=0xff);
}
if(sec1==1)
{
calc(adc0809_value[key_value-1]);
lcd_command(0xc3);
lcd_command(0xc3);
lcd_command(0xc3);
lcd_data(0x30+adcv[0]);
lcd_data(0x30+adcv[1]);
lcd_data(0x30+adcv[2]);
lcd_data(0x30+adcv[3]);
lcd_data(0x2e);
lcd_data(0x30+adcv[4]);
lcd_data(0x30+adcv[5]);
lcd_data(0x20);
lcd_data(0x20);
lcd_data(0x6d);
lcd_data(0x76);
lcd_data(0x20);
lcd_data(0x20);
sec1=0;
}
if(sec2==1)
{
timeToDisplay();
sec2=0;
}
}
}
unsigned char check_key()
{
unsigned char temp,k=1;
temp=P1;
while(P1!=0xff);
delay(20);
temp=255-temp;
if(temp==0)return 0;
while(temp!=1)
{
temp/=2;
k++;
}
return k;
}
void lcd_init()
{//LCD初始化设定
lcd_command(0x38); //function set
lcd_command(0x38); //function set
lcd_command(0x08); //display on/off
lcd_command(0x01); //清除LCD的显示内容
lcd_command(0x06); //entry mode set
lcd_command(0x0c); //entry mode set
}
void lcd_command(unsigned char l_data)
{
RS=0;
RW=0;
E=1;
P0=l_data;
E=0;
delay(80);
RW=1;
}
void lcd_data(unsigned char l_data)
{
RS=1;
RW=0;
E=1;
P0=l_data;
E=0;
delay(80);
RW=1;
}
void delay(unsigned char i)
{
while(i--);
}
void calc(unsigned char p)
{
float tt;
unsigned int cc;
tt=p*19.604;//[t];
adcv[0]=tt/1000;
adcv[1]=(tt-adcv[0]*1000)/100;
adcv[2]=(tt-adcv[0]*1000-adcv[1]*100)/10;
adcv[3]=(int)tt%10;
cc=adcv[0]*1000+adcv[1]*100+adcv[2]*10+adcv[3];
adcv[4]=(tt-cc)*10;
adcv[5]=((tt-cc)*10-adcv[4])*10;
}
void time0_int() interrupt 1 using 0 /////////////////定时器0中断
{
TH0=0x63;
TL0=0x18;
time();
time_index++;
if(time_index%5==0)
{
EX1=1;
*(&ADC_add+tt)=0x00;
}
if(time_index%31==0)
{
sec2=1;
}
if(time_index==50)
{
time_index=0;
sec1=1;
}
}
void ad0809_int1() interrupt 2 using 1 ////////////////////////外部中断1中
断
{
adc0809_value[adc0809_index]=*(&ADC_add+tt);
adc0809_index++;
tt=tt+0x0100;
if(adc0809_index==8)
{
adc0809_index=0;
tt=0x0000;
}
EX1=0;
}
void time ()
{
sec100++;
if (sec100 <=50)
flag=0;
else
flag=1;
if (sec100 > = 100)// 100 * 10 ms = 1 s
{
sec100 = 0;
sec++;
if (sec > = 60)
{
sec = 0;
min++;
if (min > = 60)
{
min = 0;
hour++;
}
}
}
}
void timeToDisplay()
{
lcd_command(0x88);
lcd_data(0x30+hour/10);
lcd_data(0x30+hour%10);
if (flag==0)
lcd_data(0x3A);
else
lcd_data(0x20);
lcd_data(0x30+min/10);
lcd_data(0x30+min%10);
if (flag==0)
lcd_data(0x3A);
else
lcd_data(0x20);
lcd_data(0x30+sec/10);
lcd_data(0x30+sec%10);
lcd_data(0x20);
lcd_data(0x20);
}
------------------
|time is 00:00:00 |
| 1.00000000 |
------------------
这块数据采集系统上还有八个按钮,代表通道数
发表时间:2005年7月7日2:03:27