0
点赞
收藏
分享

微信扫一扫

普中矩阵键盘,去掉P10P11两个,得到两列


#include <REGX52.H>
sbit P24=P2^4;
sbit P22=P2^2;

sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
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);
//0011 1111 0001 0000<<3 0000 0100
//#define get() (P3 & 0X3F) | ((P4 & 0X10) << 3) | ((P4 & 0X04) << 4)
//1111 1100
#define get0() (P1 & 0XFC )
#define get1() (P1 & 0XCF )
//延时子函数
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] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 18 && longpressflag ==0) //hour -1
{
valtemp =valtemp-1;
if(valtemp<=0)valtemp=99;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}

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

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


if(KeyCode == 21) //hour +1
{
valtemp=55;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 22) //hour -1
{
valtemp=66;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}

if(KeyCode == 23) //hour +1
{
valtemp=55;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 24) //hour -1
{
valtemp=66;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}


if(KeyCode == 25) //hour +1
{
valtemp=55;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 26) //hour -1
{
valtemp=66;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}

if(KeyCode == 27) //hour +1
{
valtemp=55;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 28) //hour -1
{
valtemp=66;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}


if(KeyCode == 31) //hour +1
{
valtemp=55;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%10; //显示键码
}
if(KeyCode == 32) //hour -1
{
valtemp=66;
LEDbuf[6] = KeyCode/10; //显示键码
LEDbuf[7] = KeyCode%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

P17=1; P16=1;
P15=1; P14=1;
P13=0;P12=0;

//P3 = 0XF0; P24 = 1; P22 = 1;
IO_KeyDelay();
// IO_KeyState1 = P1 & 0xf0;//(P1 & 0XFC )
IO_KeyState1 = get0();


// P1 = 0x0f; //Y低,读X


P17=0;P16=0; P15=0; P14=0;
P13=1; P12=1;

//P3 = 0X0F; P24 = 0; P22 = 0;
IO_KeyDelay();

// IO_KeyState1 |= (P1 & 0x0f);//(P1 & 0XFC )
IO_KeyState1 |= get1();
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;

P12=1; P13=1;
P14=1; P15=1;
P16=1; P17=1;

// P3 = 0XFF; P24 = 1; P22 = 1;
}


举报

相关推荐

0 条评论