平生的第一个单片机程序,通过两个微动开关控制8个LED灯亮灯的个数,为什么最后只能开一个灯呢?

#include<STC12C2052AD.H>
sbit Add_Key=P3^3;//增加亮灯数sbit Doc_Key=P3^7;//减少亮灯数sbit s=P1^0;
unsigned int k(unsigned char n){//返回值 return n;}
void delay (unsigned int a){ // 1ms延时程序 unsigned int i; while(--a!=0){ for(i=0; i<600; i++); }}void main(void){//主函数 Add_Key=1; Doc_Key=1; while(1){//循环程序部分 unsigned char n;//临时变量 if(Add_Key==0){ delay(20);//延时20ms去抖动 if(Add_Key==0&&s==1){ n++;//变量加1 if(n>=8){ n=8;}} while(Add_Key==0);} if(Doc_Key==0){ delay(20);// if(Doc_Key==0&&s==0){ n--; if(n==0){ n=0;}} while(Doc_Key==0);} switch (n){//判断n的值 case 1: P1=0xfe; break; case 2: P1=0xfc; break; case 3: P1=0xf8; break; case 4: P1=0xf0; break; case 5: P1=0xe0; break; case 6: P1=0xc0; break; case 7: P1=0x80; break; case 8: P1=0x00; break; default: break; } } }

第1个回答  2012-10-08
试试看修改后的程序
#include<STC12C2052AD.H>
sbit Add_Key=P3^3;//增加亮灯数
sbit Doc_Key=P3^7;//减少亮灯数
sbit s=P1^0;

unsigned int k(unsigned char n){//返回值
return n;
}

void delay (unsigned int a){ // 1ms延时程序
unsigned int i;
while(--a!=0){
for(i=0; i<600; i++);
}
}
void main(void){//主函数
unsigned char n;//临时变量
Add_Key=1;
Doc_Key=1;
while(1){//循环程序部分
if(Add_Key==0){
delay(20);//延时20ms去抖动
if(Add_Key==0){
n++;//变量加1
if(n>=8){
n=8;}}
while(Add_Key==0);
}
if(Doc_Key==0){
delay(20);//
if(Doc_Key==0){
n--;
if(n==0){
n=0;}}
while(Doc_Key==0);
}
switch (n){//判断n的值
case 1:
P1=0xfe;
break;
case 2:
P1=0xfc;
break;
case 3:
P1=0xf8;
break;
case 4:
P1=0xf0;
break;
case 5:
P1=0xe0;
break;
case 6:
P1=0xc0;
break;
case 7:
P1=0x80;
break;
case 8:
P1=0x00;
break;
default:
break;
}
}
}本回答被网友采纳
第2个回答  2012-10-08
问题出在按键的检测时延时是否是20ms。单片机延时与晶振频率有关,如果用C写程序延时,要看反汇编,确定延时时间;你也可以适当更改一下延时的长短再试试。
第3个回答  2012-10-07
把if(Add_Key==0&&s==1)和if(Doc_Key==0&&s==0)
这2句中的s==1去掉试试本回答被提问者采纳
相似回答