用 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);
}