数字时钟的程序运行出现错误

2019-07-15 21:30发布

运行的时候keil2提示..EX9_1.C(237): error C187: not an lvalue
..EX9_1.C(242): error C187: not an lvalue
..EX9_1.C(264): error C187: not an lvalue
..EX9_1.C(269): error C187: not an lvalue
..EX9_1.C(274): error C187: not an lvalue,请问大家如何解决,详细的程序
//***************************数字钟程序********************************//
//程序:ex9_1.c
//功能:数字钟程序
//****************************编译预处理语句****************************//
#pragma  SMALL
#include  "REG51.H"
#include  "absacc.h"
//******************************函数声明*******************************//
void display(unsigned char *p);                //6位LED扫描函数,指针p为显示数据区首地址
unsigned char keytest();                       //测试键盘有无键按下
unsigned char search();                       //键盘扫描程序
void  alARM();                          //闹钟程序
void  ftion0();                          //时钟修改程序
void  ftion1();                          //闹钟修改程序
void  cum();                                   //增1程序
//********************************端口定义******************************//
sbit  P2_7=P2^7;                            //定义蜂鸣器控制端口
//*******************************全局变量定义***************************//                          
unsigned char  clockbuf[3]={0,0,0};         // 存放时分秒的十进制数
unsigned char  bellbuf[3]={0,0,0};          // 存放闹钟时分秒的十进制数
unsigned char  msec1;                      // 10毫秒中断次数
unsigned char  msec2;                      // 1秒循环次数
unsigned char  timdata,rtimdata;            // 时钟和闹钟修改位置标志
unsigned char  count;                     // 闹钟启动后10秒计时单元
unsigned char  *dis_p;                    // 显示缓冲区指针
bit  armbit;                                //闹钟标志,armbit=0,闹钟没有设定,armbit=1,闹钟已设定
bit  rtimbit;                                   //闹钟是否启动标志,rtimbit=1,闹钟已启动
bit  rhourbit;                              //闹钟小时修改标志,rhourbit=1,正在修改闹钟小时
bit  rminbit;                               //闹钟分修改标志,rminbit=1,正在修改闹钟分钟
bit  hourbit;                               //时钟小时修改标志,hourbit=1,正在修改时钟小时
bit  minbit;                                   //时钟分修改标志,minbit=1,正在修改时钟分钟
bit  secbit;                                   //时钟秒修改标志
//*********************************主函数********************************//
void main()
{
   unsigned char a;
   armbit=0;                    //清零闹钟标识位
   msec1=0;                         //设置10毫秒中断次数初值
   msec2=0;                         //设置1秒中断次数初值
   timdata=0;                       //时钟内容修改位置记忆单元清零
   rtimdata=0;                      //闹钟内容修改位置记忆单元清零
   count=0;                          //闹钟启动后保持10秒计时单元清零
   TMOD=0x02;                     //初始化定时器,定时器T0方式2
   TL0=0x06;                        //定时250μs初始值
   TH0=0x06;
   EA=1;                        //中断允许控制断
   ET0=1;                        //定时器1开中断
   TR0=1;                          //启动定时器0                     
   dis_p=clockbuf;                   //将时钟值所在地址送入显示指针
   while(1)
   {   
      a=keytest();                   //调用判别键入测试程序
      if(a==0x0f)
      {
         display(dis_p);        //无键输入调用显示程序
               if(armbit==1)alarm();  //判别闹钟设定否,若设定了,则调闹钟程序
      }                                                                                                                  
      else
      {
         display(dis_p);        //调用显示程序作为延时去抖动
         a=keytest();                  
         if(a!=0x0f)                      // 没有抖动,则表示有键按下
         {
             a=search();        // 调用键号测试程序
             switch (a) {
                 case  0x00:ftion0();break;    //是时钟参数修改功能键,调用时钟修改
                 case  0x01:ftion1();break;    //是闹钟参数修改功能键,调用闹钟设定
                 case  0x02:cum();break;       //是加1功能键,则调用加1修改程序
                 default:break;   }
         }
      }
   }
}
//****************************6位LED扫描函数**************************/
//函数名:display
//函数功能:6位LED扫描函数
//形式参数:指向时、分、秒计时单元数据首地址的指针
//返回值:无
void display(unsigned char *p)
{
  unsigned char  buffer[]={0,0,0,0,0,0};
  unsigned char  k,i,j,m,temp;
  unsigned char  led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         // 0-9的显示码
  buffer[0]=p[0]/10;                        // 将缓冲区中的数的十位和个位分开
  buffer[1]=p[0]%10;
  buffer[2]=p[1]/10;
  buffer[3]=p[1]%10;
  buffer[4]=p[2]/10;
  buffer[5]=p[2]%10;
  for(k=0;k<3;k++)
  {
     temp=0x01;
     for(i=0;i<6;i++)
     {
        P1=0xff;                               //关显示
        j=buffer[i];
          P1=led[j];                             //P1送段码
          P0&=~temp;                             //P0对应端口低电平选位
        temp<<=1;
        for(m=0;m<100;m++);                  //每一位显示延时
     }
  }
}
//*****************************键盘测试函数*************************//
//函数名:keytest
//函数功能:6位LED扫描函数
//形式参数:读出行输入按键状态码,用于测试是否有按键按下
//返回值:键盘行输入按键状态码,unsigned char类型
unsigned char keytest()
{
   unsigned char c;
   P0=0xf0;
   c=P2;
   c=c&0x07;                                //按键行输入为P2.0~P2.2,屏蔽无关位
   return(c);
}
//****************************扫描键盘得到键值函数*********************//
//函数名:search
//函数功能:键盘扫描函数
//形式参数:无
//返回值:行列式按键的键码,unsigned char类型
unsigned char search()
{
   unsigned char a,b,c,d,e;
   c=0xfe;                                             //首列扫描字送变量c
   a=0;                                                //首列号送a
   while(1)
   {
       P0=c;                                     //列扫描字送P0口
       d=P2;                                            //读入P2口的行状态
       if(d&0x01==0){  b=0;break;}              //第0行有键按下,第0行行首号送b
          else if(d&0x02==0){ b=4;break;}          //第1行有键按下,第1行行首号送b
             else if(d&0x04==0){ b=8;break;}         //第2行有键按下,第1行行首号送b
       a++;                                           //扫描列号加1
       c<<=1;
       c++;                                           //修改列扫描字,扫描下一列
   }
   c=a+b;                                              //将行首号与列号相加,求键号
   do {
        display(dis_p);
      } while((d=keytest())!=0x07);                   //等待释放按键
   return(c);
}
//*******************************闹钟函数******************************//
//函数名:alarm
//函数功能:启动闹钟10秒
//形式参数:无
//返回值:无
void alarm()
{
   if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))
   {
      P2_7=0;
      rtimbit=1;                                //设置闹钟计时标志,时钟将进行10秒计时志
   }
   else
   {
      if(count==10)                                 //判断闹钟保持10秒时间到否
      {
         count=0;                                    //清除闹钟保持10秒计时
         P2_7=1;                                     //清除闹钟
         armbit=0;                                   //清闹钟标识,否则闹钟设置将继续保持有效
         rtimbit=0;
      }
   }
}
//*******************时钟修改函数*****************//
//函数名:ftion0
//函数功能:时钟修改,根据按键次数,修改时、分、秒修改标志全局变量
//形式参数:无
//返回值:无
void ftion0()
{
   TR0=0;                                         // 关定时器
   rhourbit=0;                                      // 禁止闹钟时间参数修改,清闹钟修改标识
   rminbit=0;     
   dis_p=clockbuf;                                  // 将时钟缓冲区首地址送显示指针
   rtimdata=0;                                      // 清闹钟修改位置标识记录
   timdata++;                                       // 将时钟修改记录值加1
   switch (timdata) {
       case 0x01:secbit=1;break;                    //记录值为1,则将时钟秒修改标识置1
       case 0x02:secbit=0;minbit=1;break;           //记录值为2,则将时钟分修改标识置1
       case 0x03:minbit=0;hourbit=1;break;        //记录值为3,则将时钟时修改标识置1
       case 0x04:timdata=0;hourbit=0;TR0=1;break; //按4次则清时钟单元修改位置记录,定时器重新启动
       default:break;
                    }
}
//*******************************闹钟修改函数*************************//
//函数名:ftion1
//函数功能:闹钟修改,根据按键次数,修改时、分修改标志全局变量
//形式参数:无
//返回值:无
void ftion1()
{
  secbit=0;                                           //禁止时钟时间修改
  minbit=0;
  hourbit=0;
  dis_p=bellbuf;                                    //设置闹钟显示标志
  timdata=0;                                           //清时钟修改位置标识记录
  rtimdata++;                                          //将闹钟修改记录值加1
  switch (rtimdata)
  {
     case 0x01:rminbit=1;break;                        //若记录值为1,则将闹钟分修改标识置1
     case 0x02:rminbit=0;rhourbit=1;break;        //记录值为2,则将时钟分修改标识置1
     case 0x03:rtimdata=0;rhourbit=0;                 // 若按3次则清闹钟单元修改位置记录
               armbit=1;                              // 设置闹钟已设定标志位
               dis_p=clockbuf;                        // 恢复时钟显示标志
               break;   
     default:break;
  }
}
//************************************增1函数***************************//
//函数名:cum
//函数功能:根据标志位对相应时、分、秒单元增1
//形式参数:无
//返回值:无
void cum()
{
   if(secbit==1)                                // 若时钟秒修改标识为1则秒单元内容加1
   {
      if(clockbuf[2]==59) clockbuf[2]=0;
      else  clock buf[2]++;         
   }
   else  if(minbit==1)                                // 若时钟分修改标识为1则分单元内容加1
   {
       if(clockbuf[1]==59)clockbuf[1]=0;
          else clockbuf[1]++;
   }
   else  if(hourbit==1)                                // 若时钟小时修改标识为1则小时单元内容加1
   {
       if(clockbuf[0]==23)clockbuf[0]=0;
          else clockbuf[0]++;
   }
   else  if(rminbit==1)                                // 若闹钟分修改标识为1则分单元内容加1
   {
       if(bellbuf[1]==59)bellbuf[1]=0;
          else bellbuf[1]++;
   }
   else  if(rhourbit==1)
   {                                    // 闹钟小时修改标识为1则小时单元内容加1
       if(bellbuf[0]==23)bellbuf[0]=0;
          else bellbuf[0]++;
   }            
}
//***************************定时器0中断函数****************************/   
//函数名:clock
//函数功能:定时器T0定时中断,interrupt 1
//形式参数:无
//返回值:无
void clock()  interrupt 1
{  
   EA=0;                                  //关中断
   if(msec1!=0x28)
       msec1++;                         //到10毫秒否,不到则msec1加1
   else
   {
        msec1=0;
        if(msec2!=100)msec2++;            //到1秒否,不到则msec2加1
        else
        {
           if(rtimbit==1)count++;
                  msec2=0;
           if(clockbuf[2]!=59)
               clockbuf[2]++;               //到1分否,不到则clockbuf[2]加1
           else
           {
              clockbuf[2]=0;
              if(clockbuf[1]!=59)
                   clockbuf[1]++;           // 到1小时否,不到则clockbuf[1]加1
              else
              {
                  clockbuf[1]=0;
                  if(clockbuf[0]!=23)
                       clockbuf[0]++;   // 到24时否,不到则clockbuf[0]加1
                  else clockbuf[0]=0;
              }
           }
        }
    }
    EA=1;                               //开中断
}


ex9_1.rar 下载积分: 积分 -1 分
3.08 KB, 下载次数: 6, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。