按键消抖控制按键矩阵显示数码管数字(4)

一、主要功能

按键消抖控制按键矩阵显示数码管数字

二、代码实现

#include <reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit KEY1OUT=P2^7;
sbit KEY2OUT=P2^6;
sbit KEY3OUT=P2^5;
sbit KEY4OUT=P2^4;
sbit KEY1IN=P2^3;
sbit KEY2IN=P2^2;
sbit KEY3IN=P2^1;
sbit KEY4IN=P2^0;

unsigned char code LEDchar[]={
	0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,
	0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
unsigned char KEYSTATE[4][4]={
	{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
void main()
{
	unsigned char i,j;
	unsigned char backup[4][4]={
	{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};
	TMOD=0X01;
	ET0=1;
	TR0=1;
	EA=1;
	ENLED=0;
	ADDR0=0;
	ADDR1=1;
	ADDR2=1;
	ADDR3=1;
	P2=0XF7;
	TH0=0X01;
	TL0=0XFC;
	P0=LEDchar[0];
	
	while(1)
	{
		for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
	   	if (backup[i][j] !=KEYSTATE[i][j])
		{
			if(backup[i][j]==0)
			{
				P0=LEDchar[i*4+j];
			}
			backup[i][j] =KEYSTATE[i][j];
		}
  }
}
}
}
void interupttime0()interrupt 1
{
	
	static unsigned char keyout=0;
	unsigned char i;
	static unsigned char KEYbuff[4][4]={{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};
	
	TH0=0XFC;
	TL0=0X67;
	
	KEYbuff[keyout][0]=(KEYbuff[keyout][0]<<1) | KEY1IN;
	KEYbuff[keyout][1]=(KEYbuff[keyout][1]<<1) | KEY2IN;
	KEYbuff[keyout][2]=(KEYbuff[keyout][2]<<1) | KEY3IN;
	KEYbuff[keyout][3]=(KEYbuff[keyout][3]<<1) | KEY4IN;
	
	for(i=0;i<4;i++)
	{
	  if((KEYbuff[keyout][i] & 0X0F==0x00))
	 {
		KEYSTATE[keyout][i]=0;
	 }
	  else if((KEYbuff[keyout][i] & 0X0F==0xFF))
	 {
		KEYSTATE[keyout][i]=1;
	 }
	}
	
	keyout++;
	keyout=keyout&0x03;
	
	switch(keyout)
	{
		case 0:KEY4OUT=1;KEY1OUT=0;break;
		case 1:KEY1OUT=1;KEY2OUT=0;break;
		case 2:KEY2OUT=1;KEY3OUT=0;break;
		case 3:KEY3OUT=1;KEY4OUT=0;break;
		default:break;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gcc future.c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值