(学习)用STC15实现矩阵按键控制数码管

实现按下16个不同按键后数码管显示不同数字或字母

使用矩阵按键时,跳线帽跳到左边

#include <STC15F2K60S2.H>

#define u8 unsigned char 
#define u16 unsigned int 

void delay(int ms);
void Key_scan();
u8 num;

u8 tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XC6,0xA1,0x86,0x8E,0x89,0xC7};//数码管码值

void main()
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//关闭蜂鸣器
	P2=0XC0;P0=0X04;P2=0XFF;P0=0XFF;//开启数码管
	while(1)
	{
		Key_scan();
		P0=tab[num];
	}
}

void delay(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);
}

void Key_scan()
{
	u8 temp;
	//第一列
	P44=0;P42=1;P3=0X7F;//0111 1111 第一位为低位
	temp=P3;//0111 1110
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		delay(5);
		temp=P3;
		temp=temp&0X0F;//0111 1110& 0000 1111 == 0000 1111高位全部归为0   
		if(temp!=0X0F) 
		{
			temp=P3;//不进行与操作
			switch(temp)
			{
				case 0X7E: num=1;break; //1110
				case 0X7D: num=2;break; //1101
				case 0X7B: num=3;break; //1011
				case 0X77: num=4;break; //0111
			}
			while(temp!=0X0F) //松手检测
			{
				temp=P3;
				temp=temp&0x0f;
			}
		}
	}
	//第二列
	P44=1;P42=0;P3=0XBF;//1011 1111 第二位为低位
	temp=P3;//0111 1110
	temp=temp&0XBF;
	if(temp!=0XBF)
	{
		delay(5);
		temp=P3;
		temp=temp&0XBF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0   
		if(temp!=0XBF) 
		{
			temp=P3;//不进行与操作
			switch(temp)
			{
				case 0XBE: num=5;break; //1110
				case 0XBD: num=6;break; //1101
				case 0XBB: num=7;break; //1011
				case 0XB7: num=8;break; //0111
			}
			while(temp!=0XBF) //松手检测
			{
				temp=P3;
				temp=temp&0xBF;
			}
		}
	}
	//第三列
	P44=1;P42=0;P3=0XDF;//1011 1111 第三位为低位
	temp=P3;//0111 1110
	temp=temp&0XDF;
	if(temp!=0XDF)
	{
		delay(5);
		temp=P3;
		temp=temp&0XDF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0   
		if(temp!=0XDF) 
		{
			temp=P3;//不进行与操作
			switch(temp)
			{
				case 0XDE: num=9;break; //1110
				case 0XDD: num=10;break; //1101
				case 0XDB: num=11;break; //1011
				case 0XD7: num=12;break; //0111
			}
			while(temp!=0XDF) //松手检测
			{
				temp=P3;
				temp=temp&0xDF;
			}
		}
	}
	//第四列
	P44=1;P42=0;P3=0XEF;//1011 1111 第四位为低位
	temp=P3;//0111 1110
	temp=temp&0XEF;
	if(temp!=0XEF)
	{
		delay(5);
		temp=P3;
		temp=temp&0XEF;//0111 1110& 0000 1111 == 0000 1111高位全部归为0   
		if(temp!=0XEF) 
		{
			temp=P3;//不进行与操作
			switch(temp)
			{
				case 0XEE: num=1;break; //1110
				case 0XED: num=2;break; //1101
				case 0XEB: num=3;break; //1011
				case 0XE7: num=4;break; //0111
			}
			while(temp!=0XEF) //松手检测
			{
				temp=P3;
				temp=temp&0xEF;
			}
		}
	}
}

 P42,P44对应CT107D上的P36、P37

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值