#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;
    }
}

}

单片机按键控制LED和数码管显示 - 优化中断实现多按键操作

原文地址: https://www.cveoy.top/t/topic/oXQe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录