为了避免这种情况,我发现它可以使用,relay_flag, buzz_flag,1点打开标志,0点关闭标志。
void KeyAction(uchar keycode) { if(keycode == '1') { buzz_flag = 1; } else if(keycode == '2') { buzz_flag = 0; } else if(keycode == '3') { relay_flag = 1; } else if(keycode == '4') { relay_flag = 0; } }
void SetFucker() { if(buzz_flag) { if(relay_flag) { P2 = (P2&0x1f)|0xa0; buzz = 1; relay = 1; P2 = P2&0x1f; } else { P2 = (P2&0x1f)|0xa0; buzz = 1; relay = 0; P2 = P2&0x1f; } } else if(buzz_flag == 0) { if(relay_flag) { P2 = (P2&0x1f)|0xa0; buzz = 0; relay = 1; P2 = P2&0x1f; } else { P2 = (P2&0x1f)|0xa0; buzz = 0; relay = 0; P2 = P2&0x1f; } } }
代码
main.c
****************************************************************************** * 文件名称:按键控制继电器蜂鸣器 * 描 述: * 作 思考与猫 * 日 期: 19/3/8 * 备 注:S4开蜂鸣器,S5关蜂鸣器,S6开继电器,S7关继电器 ******************************************************************************* #include<stc15f2k60s2.h> #define uchar unsigned char #define uint unsigned int sbit key_in1 = P3^3; sbit key_in2 = P3^2; sbit key_in3 = P3^1; sbit key_in4 = P3^0; sbit relay = P0^4; sbit buzz = P0^6; uchar KeySat[4]={1, 1, 1, 1}; uchar KeyMap[4]={'1', '2', '3', '4'}; bit relay_flag = 0, buzz_flag = 0; void CloseFucker(); void Timer0Init(); void KeyScan(); void KeyDriver(); void KeyAction(uchar keycode); void SetFucker(); void main() { CloseFucker(); Timer0Init(); while(1) { KeyDriver(); SetFucker(); } } void KeyDriver() { char i; static uchar keyback[4] = {1, 1, 1, 1}; for(i=0; i<4; i ) { if(KeySat[i] != keyback[i]) { if(KeySat[i] != 0) { KeyAction(KeyMap[i]); } keyback[i] = KeySat[i]; } } } void SetFucker() { if(buzz_flag) { if(relay_flag) { P2 = (P2&0x1f)|0xa0; buzz = 1; relay = 1; P2 = P2&0x1f; } else { P2 = (P2&0x1f)|0xa0; buzz = 1; relay = 0; P2 = P2&0x1f; } } else if(buzz_flag == 0) { if(relay_flag) { P2 = (P2&0x1f)|0xa0; buzz = 0; relay = 1; P2 = P2&0x1f; } else { P2 = (P2&0x1f)|0xa0; buzz = 0; relay = 0; P2 = P2&0x1f; } } } void KeyAction(uchar keycode) { if(keycode == '1') { buzz_flag = 1; } else if(keycode == '2') { buzz_flag = 0; } else if(keycode == '3') { relay_flag = 1; } else if(keycode == '4') { relay_flag = 0; } } void KeyScan() { char i; static uchar keybuf[4] = {0xff, 0xff, 0xff, 0xff}; keybuf[0] = keybuf[0]<<1|key_in1; keybuf[1] = keybuf[1]<<1|key_in2; keybuf[2] = keybuf[2]<<1|key_in3; keybuf[3] = keybuf[3]<<1|key_in4; for(i=0; i<4; i ) { if(keybuf[i] == 0xff) { KeySat[i] = 1; } else if(keybuf[i] == 0x00) { KeySat[i] = 0; } } } void T0_time() interrupt 1 { TL0 = 0x40; TH0 = 0xA2; KeyScan(); } void Timer0Init() { AUXR |= 0x80; TMOD &= 0xF0; TL0 = 0x40; TH0 = 0xA2; TF0 = 0; TR0 = 1; ET0 = 1; EA = 1; } void CloseFucker() { P2 = (P2&0x1f)|0xa0; P0 = 0xaf; P2 = P2&0x1f; }