51矩阵按键数码管小程序

电路参考
传送门

/*
*******************************************************************************
对矩阵按键进行扫描,
数码管对按键的键值进行显示
*******************************************************************************
*/

#include <reg52.h>   //包含特殊功能寄存器定义的头文件
//数码管相关
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
//按键相关
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit key4=P2^7;
unsigned char key[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char old[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char code ledchar[]={0XC0,0XF9,0XA4,0XB0,
0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
void main()
{
	unsigned char i,j;
	//打开数码管
	ADDR3=1;
	ENLED=0;
	ADDR0=0;
	ADDR1=0;
	ADDR2=0;
	//打开定时器 1ms
	TMOD=0X01;
	TH0=0XFC;
	TL0=0X67;		
	TR0=1;
	//打开中断
	EA=1;
	ET0=1;
	while(1)
	{
		for(i=0;i<4;i++)
			for (j=0;j<4;j++)
				if(key[i][j]!=old[i][j])//检测到按键被按下
				{
					if (old[i][j]==0)  //按键弹起,输出数码管
						P0=ledchar[i*4+j];
					old[i][j]=key[i][j];
				}
		}
}
void InterruptTimer0() interrupt 1	  //对按键进行扫描
{
	static unsigned char keyout=0;
	unsigned char z=0;
	static unsigned char keyy[4][4]={{0xff,0xff,0xff,0xff},
	{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
	//对一排按键进行扫描
	//重新定义定时器
	TH0=0XFC;
	TL0=0X67;
	keyy[keyout][0]=(keyy[keyout][0]<<1)|key1;
	keyy[keyout][1]=(keyy[keyout][1]<<1)|key2;
	keyy[keyout][2]=(keyy[keyout][2]<<1)|key3;
	keyy[keyout][3]=(keyy[keyout][3]<<1)|key4;
	//连续四次扫描判断按键状态
	for(;z<4;z++)
	{
	 	if(keyy[keyout][z]==0xff)
			key[keyout][z]=1;
		else if	(keyy[keyout][z]==0x00)
			key[keyout][z]=0;
		else ;
	}
	//改变排数
	keyout++;
	if(keyout>=4)keyout=0;
	switch (keyout)
	{
		case 0:P2=0XF7;break;
		case 1:P2=0XFB;break;
		case 2:P2=0XFD;break;
		case 3:P2=0XFE;break;
		default:break;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王蒟蒻

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

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

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

打赏作者

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

抵扣说明:

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

余额充值