问题描述
- 为什么老显示key_value 未定义 ,data数组也有问题??
-
/***************************************************
本程序是要用单片机做一个计算器
*************************************************/#include
#include
#define GPIO_key P2
#define GPIO_zu P0//位选
#define GPIO_led P1//段选unsigned char zu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char LED_data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
unsigned char LED_num[9];
unsigned char flag;void display_num();//用来显示每次按键之后的key_value
void dispay_r(unsigned int r);//用来显示结果
void delayms(unsigned int i);//延时函数
char keypress();//扫描矩阵键盘
int jisuan();unsigned char data[17];//全局存储数组 存储键值 //MAIN.C(23): error C141: syntax error near '[' unsigned char p;//用于 计算函数 和 出栈显示 的下标 //uchar p_stack;//用于显示数字的下标
void main()
{
int i;
int res;
p=-1;unsigned char key_value; //MAIN.C(32): error C141: syntax error near 'unsigned' for(i=0;i<10;i++) { LED_num[i]=LED_data[i]; } flag=0;//标记是否有键值 while(1) { loop: key_value=keypress();//修改flag,输出键值 //MAIN.C(32): error C202: 'key_value': undefined identifier if(flag==1)//当flag=1时,表示有键值输入 { if (p<=17)//入队操作 { p++; data[p]=key_value; } if (key_value>-1&&key_value<10) { display_num();// display each num; } else if (key_value=='=') { res=jisuan(); dispay_r(res); } else goto loop; //判断key_value } flag=0; }
}
int jisuan()
{
unsigned int num[2]={0,0};
unsigned char fuhao;
int i=0;
for (;p>-1;p--)
{
if (data[p]>-1&&data[p]<10)
//MAIN.C(71): error C141: syntax error near 'data'
{
num[i]=data[p]+num[i]*10;} else { i++; fuhao=data[p]; } } switch(fuhao) { case '+':num[1]=num[0]+num[1];break; case '-':num[1]=num[0]-num[1];break; case '*':num[1]=num[0]*num[1];break; case '/':num[1]=num[0]/num[1];break; } return num[1];
}
char keypress()
{ unsigned char temp,key;
GPIO_key=0xfe;
temp=temp&0xf0;
if (temp!=0xf0)
{
delayms(10);
temp=GPIO_key;
if (temp!=0xf0)
{
flag=1;
temp=GPIO_key;
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;} while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xfd; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xfb; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key='+';break; case 0x7b:key='-';break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xf7; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xe7:key='*';break; case 0xd7:key='/';break; case 0xb7:key='=';break; case 0x77:key='.';break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } return key;
}
void display_num()
{
int zhi=p;
int j=0;
while(j>-1)
{
if (data[zhi]>-1&&data[zhi]
{
GPIO_zu=zu[j];
GPIO_led=LED_num[data[zhi]];
zhi--;
j++;
}
}
}
void dispay_r(unsigned int r)
{
unsigned char temp_r[8];
int i;
for(i=0;i
{
temp_r[i]=(int)r%(int)pow(10,i+1);
}
for (i=0;i
{
GPIO_zu=zu[i];
GPIO_led=LED_num[temp_r[i]];
}
}
void delayms(unsigned int i)
{
unsigned char c;
for(;i>0;i--)
{
for(c=110;c>0;c--);
}
}
解决方案
int i;
int res;
p=-1;
unsigned char key_value;
p = -1;已经是语句了 后面又有 key_value 的定义 编译器 貌似会忽略,把语句顺序调成
int i;
int res;
unsigned char key_value;
p = -1;
在编译 就没事了
data 是关键字 换掉
解决方案二:
看不出错来。不知道你有没有把data换个名字看?我没有用过你这个C,就算用过也未必记得。但是data是否可能时关键字?既然普通的肉眼演不出来的话,我第一怀疑的就是关键字问题,其次是全角/半角问题,甚至有时候把这行删了重新打一遍等等,都是可能解决问题的办法之一