0
点赞
收藏
分享

微信扫一扫

puzhong 51矩阵键盘短按,长按数码管加减数


#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
//数码管段码表 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
u8 KeyCode; //给用户使用的键码, 1~16有效
u8 IO_KeyState, IO_KeyState1; //行列键盘变量
u16 IO_KeyHoldCnt;
u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
u8 LEDbuf[9];
bit longpressflag=0;
void IO_KeyScan(void); //50ms call
void IO_KeyDelay(void);

//延时子函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
unsigned char numtemp;
switch(Location) //位码输出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
// P0= numtemp;
P0=NixieTable[Number]; //段码输出
Delay(2); //显示一段时间
P0=0x00; //段码清0,消影

}

void main()
{
u16 valtemp=0;
// Nixie(3,6); //在数码管的第1位置显示1
Delay(20);
// Nixie(4,7); //在数码管的第2位置显示2
// Delay(20);
// LEDbuf[7] = NixieTable[7]; //显示键码
// LEDbuf[8] = NixieTable[8]; //显示键码

while(1)
{
// Nixie(3,6); //在数码管的第1位置显示1
// Nixie(4,7); //在数码管的第2位置显示2
Nixie(6, LEDbuf[6]);
Nixie(7, LEDbuf[7]);



IO_KeyScan();


if(KeyCode > 0) //有键按下
{
if(KeyCode == 17 && longpressflag ==0) //hour +1
{
valtemp =valtemp+1;
if(valtemp>=99)valtemp=0;
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}
if(KeyCode == 18 && longpressflag ==0) //hour -1
{
valtemp =valtemp-1;
if(valtemp<=0)valtemp=99;
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}

if(KeyCode == 17 && longpressflag ==1) //hour +1
{
valtemp =valtemp+1;
if(valtemp>=99)valtemp=0;
longpressflag =0;
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}
if(KeyCode == 18 && longpressflag ==1) //hour -1
{
valtemp =valtemp-1;
if(valtemp<=0)valtemp=99;
longpressflag =0;
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}

if(KeyCode == 19) //hour +1
{
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}
if(KeyCode == 20) //hour -1
{
LEDbuf[6] = valtemp/10; //显示键码
LEDbuf[7] = valtemp%10; //显示键码
}
KeyCode = 0;
}



}
}

void IO_KeyDelay(void)
{
u8 i;
i = 200;
while(--i) ;
}

void IO_KeyScan(void) //50ms call
{
u8 j;

j = IO_KeyState1; //保存上一次状态

P1 = 0xf0; //X低,读Y
IO_KeyDelay();
IO_KeyState1 = P1 & 0xf0;

P1 = 0x0f; //Y低,读X
IO_KeyDelay();
IO_KeyState1 |= (P1 & 0x0f);
IO_KeyState1 ^= 0xff; //取反

if(j == IO_KeyState1) //连续两次读相等
{
j = IO_KeyState;
IO_KeyState = IO_KeyState1;
if(IO_KeyState != 0) //有键按下
{
F0 = 0;
if(j == 0) F0 = 1; //第一次按下
else if(j == IO_KeyState)
{
if(++IO_KeyHoldCnt >= 100) //1秒后重键
{
longpressflag = 1;
IO_KeyHoldCnt = 100;
F0 = 1;
}
}
if(F0)
{
j = T_KeyTable[IO_KeyState >> 4];
if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; //计算键码,17~32
}
}
else IO_KeyHoldCnt = 0;
}
P1 = 0xff;
}


举报

相关推荐

0 条评论