单片机按键控制LED和数码管显示 - 优化中断实现多按键操作
#include<reg51.h>
#define LED P0 #define KEY P1 #define SEG P2 unsigned char code lit2[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; unsigned char code num[]={0xf9,0xa4,0xb0,0x99,0x92};
void delay(unsigned int i) { while(i--); }
unsigned char readKey() { unsigned char keyVal = 0; KEY = 0xff; if(KEY != 0xff) //有按键按下 { delay(1000); //去抖 if(KEY != 0xff) // { switch(KEY) //根据行的值确定按下的键 { case 0xfe: keyVal = 1; break; case 0xfd: keyVal = 2; break; case 0xfb: keyVal = 3; break; case 0xf7: keyVal = 4; break; case 0xef: keyVal = 5; break; } } } return keyVal; }
void main() { unsigned char keyNum = 0; unsigned char ledVal = 0; unsigned char i = 0;
while(1)
{
keyNum = readKey(); //读取按键
switch(keyNum) //根据键号执行相应的操作
{
case 1:
SEG = num[0];
LED = 0xff;
break;
case 2:
SEG = num[1];
ledVal = 0xfe;
for(i = 0; i < 9; i++)
{
LED = ledVal;
delay(50000);
ledVal <<= 1;
ledVal=ledVal|0x01;
if(readKey()!=0) //检测到按键就退出循环
break;
}
break;
case 3:
ledVal = 0xfe;
SEG = num[2];
for(i = 0; i < 8; i++)
{
LED = ledVal;
delay(50000);
ledVal <<= 1;
if(readKey()!=0) //检测到按键就退出循环
break;
}
break;
case 4:
SEG = num[3];
LED = 0x55;
delay(50000);
LED = 0xaa;
delay(50000);
break;
case 5:
SEG = num[4];
LED = 0xff;
delay(50000);
LED = 0x00;
delay(50000);
break;
default:
break;
}
}
}
原文地址: https://www.cveoy.top/t/topic/oXQe 著作权归作者所有。请勿转载和采集!