| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2766 人关注过本帖
标题:用 keil 的时候出现这样的错误 求帮助!!!
只看楼主 加入收藏
霍大柏
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-4-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
用 keil 的时候出现这样的错误 求帮助!!!
出现这样的错误:
SHEJI.C(370): error C141: syntax error near 'data'

下面是程序 很简单 ,只是加了注释 ,看着比较多一点 ,程序本身不多,真心希望知道的大神帮助一下,,不甚感激!!!

#include <reg51.h>
#define uchar unsigned char  //宏的定义变量类型 uchar 代替 unsigned char
#define uint  unsigned int  //宏的定义变量类型 uint  代替 unsigned int
#define delay_time_max   50   //按键去抖动延时阀值
sbit    RS  = P2^0;
sbit    RW = P2^1;
sbit    SCLK = P2^2;
sbit    LCDRST = P2^3;
uchar  KEY_VALUE;
uchar  key_data;
uchar  dis_buf;            //显示缓存
uchar  temp;
uchar  key;                //键顺序码
uint f;
void delay(uchar x);      //x*0.14MS
// 此表为 LED 的字模              0   1  2  3    4  5  6  7  8  9   a    b    c d   e   f
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
unsigned char  ADC0809[],KONGBVAI[],DANJIA[];
/*********************************************************************************************************
** 函数名称:   delay  
** 功能描述:   延时函数  
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void  delay(uchar x)
{ uchar j;
    while((x--)!=0)  //CPU执行x*12次
    { for(j=0;j<125;j++)
         {;}
    }
}
/*********************************************************************************************************
** 函数名称:   SendByte  
** 功能描述:   串口给液晶发送数据  
                                                         
** 输 入:  Dbyte
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void SendByte(uchar Dbyte)
{
     uchar i;
     for(i=0;i<8;i++)
     {
           SCLK = 0;
           Dbyte=Dbyte<<1;      //左移一位
           RW = CY;            //移出的位给RW
           SCLK = 1;
           SCLK = 0;
     }
}
/*********************************************************************************************************
** 函数名称:   TransferCom  
** 功能描述:   串口给液晶发送命令  
                                                         
** 输 入:  data0
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void    TransferCom(uchar data0)  
{
   RS=1;
   SendByte(0xf8);            //11111ABC,RW(0),RS(1),0
   SendByte(0xf0&data0);      //高四位
   SendByte(0xf0&data0<<4);   //低四位(先执行<<)
   RS=0;            
}
/*********************************************************************************************************
** 函数名称:   lcd_mesg  
** 功能描述:   写数据,
                                                         
** 输 入:  data1
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void    TransferData(uchar data1)  
{
   RS=1;
   SendByte(0xfa);            //11111ABC,RW(0),RS(1),0
   SendByte(0xf0&data1);      //高四位
   SendByte(0xf0&data1<<4);   //低四位(先执行<<)
   RS=0;

}
/*********************************************************************************************************
** 函数名称:   initinal  (12864初始化程序)
** 功能描述:   12864初始化程序,为液晶屏的正常工作做准备
                                                         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void  initinal(void)           //LCD字库初始化程序
{
delay(40);             //大于40MS的延时程序
LCDRST=0;               //复位
delay(1);              //延时
LCDRST=1;                 //复位置高
delay(10);
TransferCom(0x30);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
delay(100);            //大于100uS的延时程序
TransferCom(0x0C);  //Display Control,D=1,显示开
delay(100);            //大于100uS的延时程序
TransferCom(0x01);  //Display Clear
delay(10);             //大于10mS的延时程序
TransferCom(0x06);  //Enry Mode Set,光标从右向左加1位移动
delay(100);            //大于100uS的延时程序
}
/*********************************************************************************************************
** 函数名称:   lcd_mesg  
** 功能描述:   汉字的显示,输入要显示汉字的地址,以及个数,已经要显示的字符的数组地址
                                                         
** 输 入: han,lie ,k ,*chn        
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void   lcd_mesg(uchar han,uchar lie,uchar k,uchar *chn)
{
uchar i;
      switch(han)
{
case 1:TransferCom(0x80+lie);break;
case 2:TransferCom(0x90+lie);break;
case 3:TransferCom(0x88+lie);break;
case 4:TransferCom(0x98+lie);break;
default:;
}
 
delay(100);
for(i=0;i<k;i++)
  {
     TransferData(chn);
  }
}
/*********************************************************************************************************
** 函数名称:   JZkeyscan  (这里采用的是线反转法)
** 功能描述:   矩阵式键扫描子程序  (4*4 的矩阵) P1.4 P1.5 P1.6 P1.7为行   
                                                P1.3 P1.2 P1.1 P1.0为列
     独立式按键扫描子程序(4个独立式按键) P2.4  P2.5 P2.6 P2.7         
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
uchar JZkeyscan(void)
{
   uchar sccode,recode,key_times,key_lock,JZ_FLAG;
   P1=0xf0;                                        //置所有列为低电平,列扫描,行线输入(此时)
   if((P1&0xf0) == 0xf0)                           
   {                                
   key_lock = 0;                                //如果在这个时候有个毛刺,在这个时候将标志位key_lock置为0
   key_times = 0;                              //将key_times置为0,这样可以有效的预防干扰,吴鉴鹰自己用过,效果很好
   JZ_FLAG = 0;                                 //取代纯延时的标志位,如果该标志位置为1,相当于原来的delay(0执行完成
   }                                          
   if((P1&0xf0)!=0xf0)&&(key_lock == 0))            //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111 0000),有往下执行
   {      
    if(key_times < delay_time_max)            //用这种方法代替过去的delay()延时去抖动
    {                                         //这样就不会在按键处理时影响干别的事情
             key_times++;                           //由于很多工业控制项目对时间的要求是很高的,是不允许   
    }                                         //纯延时的,所以吴鉴鹰采用这种方法解决这种问题
    else                                      //我也是工作后才意识到的,所以分享给大家
    {
       key_times = 0;                         //如果满足这个条件,表示相当于delay()延时完成了
    JZ_FLAG = 1;
    }
          if(((P1&0xf0)!=0xf0)&&(key_lock == 0)&&(JZ_FLAG == 1))    //再次判断列中是否是干扰信号,不是则向下执行
          {
              sccode=0xFE;                          //逐行扫描初值(即先扫描第1行)
              while((sccode&0x10) != 0)             //行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111停止while     
              {
                    P1=sccode;                      //输出行扫描码
                    if ((P1&0xf0) != 0xf0)          //本行有键按下(即P1(真实的状态)的高四位不全为1)
                    {
                           recode = (P1&0xf0)|0x0f; //输出列扫描码 按位或运算
                           JZ_FLAG = 0;             //将该变量置为1,防止反复进入
         key_lock = 1;            //将该变量置为1,防止反复进入
                           return(sccode&recode);   //返回行和列
                     }
                     else                           //所扫描的行没有键按下,则扫描下一行,直到4行都扫描,此时sccode值为1110 1111 退出while程序
                    {
                             sccode=(sccode<<1)|0x01;//行扫描码左移一位
                    }
               }
          }
           else
    {
               return 0;        //无键按下,返回0
          }
   }
}
/*********************************************************************************************************
** 函数名称:   DLkeyscan  (这里采用的是线反转法)
** 功能描述:   独立式按键扫描子程序(4个独立式按键) P2.4  P2.5 P2.6 P2.7
              
** 输 入:
**         
**         
** 输 出:
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
uchar  DLkeyscan()
{
    uchar DLkey_lock,DLkey_times,DL_FLAG,DL_VALUE;
    if((P2&0XF0) == 0XF0)
{
     DLkey_lock = 0;                                   //如果在这个时候有个毛刺,在这个时候将标志位key_lock置为0
        DLkey_times = 0;                               //将DLkey_times置为0,这样可以有效的预防干扰,吴鉴鹰自己用过,效果很好
        DL_FLAG = 0;                                //取代纯延时的标志位,如果该标志位置为1,相当于原来的delay(0执行完成
}
    if((P2&0Xf0 != 0xf0)&&(DLkey_lock == 0))
{
     if(DLkey_times < delay_time_max)                  //用这种方法代替过去的delay()延时去抖动
  {                                                 //这样就不会在按键处理时影响干别的事情
         DLkey_times++;
  }
  else
  {
      DLkey_times = 0;                             //如果满足这个条件,表示相当于delay()延时完成了
   DL_FLAG = 1;
  }
}
if(((P2&0Xf0) != 0xf0)&&(DL_FLAG == 1))               
{
    DL_VALUE = P2&0XF0;
    switch(DL_VALUE)
    {
        case 0x70: return  16;break;                   //通过检测P2口不同的值得到不同的按键值,进行不同的处理
     case 0xb0: return  17;break;
     case 0xd0; return  18;break;
     case 0xe0; return  19;break;
    }
    DL_FLAG = 0;                            //防止反复进入
}
}
/*********************************************************************************************************
** 函数名称:   Delay  
** 功能描述:   纯延时函数
              
** 输 入:   MS  需要延时的时间         
** 输 出: num
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void Delay(unsigned int MS)
{
         unsigned char us,usn;
         while(MS!=0)             //for 12M
         {
   usn = 2;
            while(usn!=0)
   {
    us=0xf5;
    while (us!=0){us--;};
    usn--;
            }
                MS--;
        }
}
/*********************************************************************************************************
** 函数名称:   KEY_SACN_VALUE  
** 功能描述:   将按键测试程序得到的值转化成相应的键值
              
** 输 入: key_data
**         
**         
** 输 出: num
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void  KEY_SACN_VALUE(key_data)
{
      switch(key_data)
   {
     case 0xee: KEY_VALUE=1;break;
     case 0xde: KEY_VALUE=2;break;
     case 0xbe: KEY_VALUE=3;break;
     case 0x7e: KEY_VALUE=4;break;
     case 0xed: KEY_VALUE=5;break;
     case 0xdd: KEY_VALUE=6;break;
     case 0xbd: KEY_VALUE=7;break;
     case 0x7d: KEY_VALUE=8;break;
     case 0xeb: KEY_VALUE=9;break;
     case 0xdb: KEY_VALUE=10;break;
     case 0xbb: KEY_VALUE=11;break;
     case 0x7b: KEY_VALUE=12;break;
     case 0xe7: KEY_VALUE=13;break;
     case 0xd7: KEY_VALUE=14;break;
     case 0xb7: KEY_VALUE=15;break;
     case 0x77: KEY_VALUE=16;break;
     default: break;
   }
   return num;
   key_data = 0;
}
/*********************************************************************************************************
** 函数名称:  show
** 功能描述:  显示函数,其中Fdata为状态为第一位,Sdata状态为第二位,Tdata为状态为第三位。
     Fdata为状态为第四位。degdata为显示的具体数值degdata 为4位  例如23.21(要求degdata输入格式)
** 输 入: Fdata  Sdata  Ddata  Hdata
**         
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void DATA_CHANGE(data)
{
    unsigned char AD_FLAG,i;
   if(data*10 > 100)
   {
    ADC0809[2] = (data*10)/100;
    ADC0809[1] = (data*10)%100/10;
    ADC0809[0] = (data*10)%10;
   }
   else  if(data*10 > 10)
   {
       ADC0809[2] = 0;
    ADC0809[1] = (data*10)/10;
    ADC0809[0] = (data*10)%10;
   }
   else
   {
       ADC0809[2] = 0;
    ADC0809[1] = 0;
    ADC0809[0] = (data*10)%10;
   }
}
/***************************************************************************
** 函数名称:  ADC0809
** 功能描述:  ADC0809转换函数
     
** 输 入:
**         
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
**
*******************************************************************************/
void ADC0809()
{
    ST=0;       //启动A/D转换
ST=1;       //启动A/D转换
ST=0;  //启动A/D转换
while(EOC==0);  //等待转换完成
OE=1;
if(f==1)
{
  delayms(1000);                   // 延时1s
  lcd_mesg(1,1,3,ADC0809);       //液晶显示数据
}
else
{                                     //这是鹰哥的风格,不管几句话都加上大括号,这样看起不会乱
     lcd_mesg(1,1,3,KONGBVAI);       //液晶显示数据   //如果初始化未成功则显示空白
}
//Display_Result(P3);
OE=0;
}  
/*************************************************************
*                                                            *
* 主程序                                                     *
*                                                            *
*************************************************************/
main()
{
    unsigned char i = 0,zongjia;
    P0=0xFF;                    //置P0口
    P1=0xFF;                    //置P1口  
TMOD=0x02;              //T1工作模式2
TH0=0x14;                 //定时器初始值高位
TL0=0x00;
IE=0x82;                 //IE.7位为1表示CPU开放中断,IE.1位也为1,表示允许定时器T0溢出中断
TR0=1;                     //使能定时器
P1=0x00;              //选择ADC0809的通道1(000)(P1.0~P1.2)
    delay(10);                  //延时
    initinal();                 //液晶的初始化函数
unsigned char danjia[]= {"单价:"};
unsigned char zongjia[] = {"总价:"}

    while(1)
    {
        key_data = JZkeyscan();
  if(keydata!=0)
  {
    KEY_SACN_VALUE(key_data);
  }
  KEY_VALUE = DLkeyscan();
   
       if( i < 5)
       {
         DANJIA = KEY_VALUE;
   i++;
       }   
    else
    {
      i = 0;
    }
  if(KEY_VALUE == 13)
  {
      zongjia = result*(DANJIA[4]*10000+DANJIA[3]*1000+DANJIA[2]*100+DANJIA[1]*10+DANJIA[0]);
     zongjia[7] = zongjia/10000000;
     zongjia[6] = zongjia%10000000/1000000;
     zongjia[5] = zongjia%1000000/100000;
     zongjia[4] = zongjia%100000/10000;
     zongjia[3] = zongjia%10000/1000;
     zongjia[2] = zongjia%1000/100;
     zongjia[1] = zongjia%100/10;
     zongjia[0] = zongjia%10;
     lcd_mesg(2,1,8,zongjia);   
  }
  ADC0809();
    }
  }   

/*********************************************************************************************************
** 函数名称:  counter1
** 功能描述:  当数据采集完毕,出发单片机的外部中断进行数据的存储显示以及报警
** 输 入:
**         
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
**
********************************************************************************************************/
void  counter1(void) interrupt 2 using 2
{
   EX1=0;
   result = P0;
   EX1=1;
   DATA_CHANGE(result);
}
搜索更多相关主题的帖子: include 
2014-04-28 22:28
霍大柏
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-4-28
收藏
得分:0 
难道是语法错误???
2014-04-28 22:33
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:7 
void DATA_CHANGE(data)这个函数,我没找是不是这里,但是基本上就这了。。data是单片机中的关键字,不能当变量用。
2014-04-29 09:23
hh373231690
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:138
注 册:2012-10-13
收藏
得分:7 
把变量data换个其他名字试试
2014-04-29 14:01
hh373231690
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:138
注 册:2012-10-13
收藏
得分:0 
把变量data换个其他名字试试
2014-04-29 14:01
lonely_21
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:108
专家分:395
注 册:2011-11-13
收藏
得分:7 
额~~~
2014-04-29 14:15
霍大柏
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-4-28
收藏
得分:0 
回复 6 楼 lonely_21
怎么了??
2014-05-12 21:39
霍大柏
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-4-28
收藏
得分:0 
回复 5 楼 hh373231690
换了之后还有错误  。。。
2014-05-12 21:39
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
看来这不纯是C语言问题了。
2014-05-13 00:08
Andrew_Lee
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:185
专家分:626
注 册:2014-3-21
收藏
得分:0 
用哪种单片机的
2014-05-13 10:50
快速回复:用 keil 的时候出现这样的错误 求帮助!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018774 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved