中级会员
- 积分
- 207
- 金钱
- 207
- 注册时间
- 2018-2-27
- 在线时间
- 43 小时
|
楼主 |
发表于 2018-6-4 10:52:08
|
显示全部楼层
[mw_shl_code=c,true]sbit SW_A = P4^0;
sbit SW_B = P4^1;
sbit LED_A = P4^2;
sbit LED_B = P4^3;
sbit LED_C = P4^4;
//char stop=0; //按键扫描标志位,1:停止扫描 0:开始扫描
uint8 idata STC_KeyBuf[16]; //按键存放
//按键扫描
void STC_ReadKey()
{
// static unsigned char Su8KeyLock[16]; //按键的自锁
static unsigned int Su16KeyCnt[16]; //按键的计时器
P2 = 0x01;
if(0==SW_A) //无按键按下
{
// Su8KeyLock[0] = 0; //按键解锁
Su16KeyCnt[0] = 0; // 按键去抖动延时计数器清零。
STC_KeyBuf[0] = 0; //无按键
}
// else if(0==Su8KeyLock[0])
else
{
Su16KeyCnt[0]++;
if(Su16KeyCnt[0]>=KEY_SHORT_TIME) //消抖
{
// Su8KeyLock[0] = 1;
STC_KeyBuf[0] ++; //读按键按下状态
}
}
if(0==SW_B) //无按键按下
{
// Su8KeyLock[1] = 0; //按键解锁
Su16KeyCnt[1] = 0; //按键去抖动延时计数器清零。
STC_KeyBuf[1] = 0; //无按键
}
// else if(0==Su8KeyLock[1])
else
{
Su16KeyCnt[1]++;
if(Su16KeyCnt[1]>=KEY_SHORT_TIME) //消抖
{
// Su8KeyLock[1] = 1;
STC_KeyBuf[1] ++; //读按键按下状态
}
}
delay(20); //20us
P2 =0x02;
if(0==SW_A) //无按键按下
{
// Su8KeyLock[2] = 0; //按键解锁
Su16KeyCnt[2] = 0; //
STC_KeyBuf[2] = 0; //无按键
}
// else if(0==Su8KeyLock[2])
else
{
Su16KeyCnt[2]++;
if(Su16KeyCnt[2]>=KEY_SHORT_TIME) //消抖
{
// Su8KeyLock[2] = 1;
STC_KeyBuf[2] ++; //读按键按下状态
}
}
if(0==SW_B) //无按键按下
{
// Su8KeyLock[3] = 0; //按键解锁
Su16KeyCnt[3] = 0; //按键去抖动延时计数器清零。
STC_KeyBuf[3] = 0; //无按键
}
// else if(0==Su8KeyLock[3])
else
{
Su16KeyCnt[3]++;
if(Su16KeyCnt[3]>=KEY_SHORT_TIME) //消抖
{
// Su8KeyLock[3] = 1;
STC_KeyBuf[3] ++; //读按键按下状态
}
}
}
//按键执行程序
void STC_KeyProcess1()
{
// uchar flag=0; //按键按下标志位
if(STC_KeyBuf[0]!=0) //按键按下
{
// stop=1;
// flag=1;
P2 = 0x01;
Display(8,3,1); //数码管显示程序
LED_A = 0; //拉低P4^2,亮灯
// return;
}
}[/mw_shl_code]
我只扫描了两个按键,按键处理只写了第一个按键,可我按下第一个按键,对应的灯只亮了一点点,而LEDA那一排的第二个灯亮了,如果我扫描了八个灯,那么亮的就是最后一个,因为扫描很快就过去了,这个怎么破?我想过按下的时候暂停扫描,可不知道在哪里又进入扫描,如果是松开就扫描,那结果又和现在一样了 |
|