#include <reg52.h>
#include<intrins.h>
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
sbit LED1 = P1^4; //LED端口声明
sbit LED2 = P1^5;
sbit LED3 = P1^6;
sbit LED4 = P1^7;
unsigned char KeySec=0;//键值变量
/**********************************
1ms延时程序
**********************************/
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
/**********************************
按键扫描程序
**********************************/
void key_scan()
{
static unsigned char count=0;//静态计数变量
static bit sign_key=0; //静态标志位
unsigned char time_key,time_LED;//临时变量
time_LED=P1&0xf0;//保存4个LED状态
P1M0=0xf0;//P1.4~7设置弱上拉
P1M1=0x00;//P1.4~7设置弱上拉
P1|=0xf0; //P1.4~7置高电平
if(P1&0xf0!=0xf0)//有键按下
{
if(++count>=10 && sign_key==0)//消抖
{
sign_key=1;//自锁
time_key=P1&0xf0;//保存P1.4~7状态
switch(time_key)
{
case 0xe0: KeySec=1; break;//输出键值
case 0xd0: KeySec=2; break;
case 0xb0: KeySec=3; break;
case 0x70: KeySec=4; break;
}
}
}
else //抬起
{
count=0;//计数变量清0
sign_key=0;//键态标志清0
}
P1&=0x0f; //P1.4~7清0
P1|=time_LED;//还原4个LED状态
P1M0=0x00; //还原P1.4~7推挽设置
P1M1=0xf0; //还原P1.4~7推挽设置
}
/*********************************
按键服务程序
*********************************/
void key_service()
{
switch(KeySec)
{
case 1: LED1=~LED1;KeySec=0;break;
case 2: LED2=~LED2;KeySec=0;break;
case 3: LED3=~LED3;KeySec=0;break;
case 4: LED4=~LED4;KeySec=0;break;
}
}
/********************************
主程序
********************************/
void main()
{
P1M0=0xf0;//P1.4~7设置推挽
P1M1=0x00;//P1.4~7设置推挽
while(1)
{
key_scan();
key_service();
Delay1ms();//控制主循环周期约1ms
}
}
大佬们,帮看下哪里的问题,我反复调试好久都不行,谢谢啦 |