导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→LCD显示,数据采集器,高手帮忙!(keil C51)

* 80928: LCD显示,数据采集器,高手帮忙!(keil C51)

   beyondmw1983 
beyondmw1983发表的帖子 

 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

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:兼职本公司因业务需要急需兼职非IT、通讯类电子工程人员,有意者请将简历发送到hr@usaimprov
[下一篇帖子]:从 ARM7 到 XSCALE ,只需要购买一次,就可满足后