4x4矩阵键盘工作原理及扫描程序_AVR单片机扫描4X4矩阵键盘并数码管显示程序

shu(uint8 c)

{

if(c<=2) {c++;} //1~3;

else if(c==3) {ge=10;shi=10; return 0;} //上;

else if(c==11){ge=c ; shi=c; return 0;} //下;

else if(c==7) {ge=12,shi=12; return 0;} //左;

else if(c==15) {ge=13,shi=13; return 0;} //右;

else if(c==13){return 0;} //enter 确认; ;

else if(c==14){ge=0; shi=0; return 0;} //清零;

else if((c>=8)&&(c<=10)){c-=1;} //7~9;

else if(c==12){ge=0;return 0;}

else { ;} //4~6;

ge=c; shi=0;

}

key()

{

uint8 i=0 ,y=0,temp=0x10 ,v=0,ke=0 ,en[]={0xfe,0xfd,0xfb,0xf7};

// temp用于检测每一行某个键是否按下; en数组是四列检测;

for(v=0;v<4;v++) //v每加一代表检测一列;

{

PORTD=en[v]; //检测四列;

temp=0x10;

for(y=0;y<4;y++) //y每加一,代表检测一列中的一个按键;

{

if((PIND&temp)==0) //如果有键被按下,进入;

{

for(i=0;i<250;i++){led();} //去抖延时并且扫描数码管;

if((PIND&temp)==0) //再次确认有键被按下;

{

buzz(1); //蜂鸣器开;

for(i=0;i<200;i++){led();} //鸣响延时;

for(i=0;i<200;i++){led();} //鸣响延时;

buzz(0); //蜂鸣器关;

//===============生成键值部分================

if(v==1)y+=3; //检测到第二行; //

else if(v==2)y+=6; //检测到第三行; //

else if(v==3)y+=9; //检测到第四行; //

else {;} //检测到第一行; //

ke=v+y; //生成键值; //

//===========================================

shu(ke); // 发送键值;

while((PIND&temp)==0)led(); //等待按键弹起;

for(i=0;i<250;i++){led();} //等待一下;

while((PIND&temp)==0)led(); //再次确认一下按键是否弹起;

return 0; //结束函数;

}

}

temp=temp<<1; //左移一下代表检测下一个按键;

}

}

}

void main(void)

{

mega16(); //初始化各个IO口;

buzz(1); //蜂鸣器开;

delay(15); //延时1.5万计数周期;

buzz(0); //蜂鸣器关;

PORTA=0xff; //载入全1;

bit(0); //把全1数据锁存在数码管共阴极(数码管灭);

delay(15); //延时1.5万计数周期;

while(1)

{

led(); //扫描数码管;

key(); //扫描键盘;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设矩阵键盘的行用引脚R1-R4表示,列用引脚C1-C4表示,数码管使用引脚A-G表示,其中A-G分别表示7个LED灯。 我们可以通过以下步骤实现1到16的显示: 1. 首先,将矩阵键盘的R1-R4引脚连接到单片机的GPIO口,将C1-C4引脚连接到单片机的另外的GPIO口。 2. 在程序中,我们可以通过扫描矩阵键盘的方式来获取用户输入的数字,假设我们得到的数字为num。 3. 对于每一个数字num,我们需要将其转换为数码管的显示。可以通过一个查表的方式来实现,例如: ```c const uint8_t digits[16][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1}, // 9 {1, 1, 1, 0, 1, 1, 1}, // 10 (A) {0, 0, 1, 1, 1, 1, 1}, // 11 (B) {1, 0, 0, 1, 1, 1, 0}, // 12 (C) {0, 1, 1, 1, 1, 0, 1}, // 13 (D) {1, 0, 0, 1, 1, 1, 1}, // 14 (E) {1, 0, 0, 0, 1, 1, 1}, // 15 (F) }; ``` 这个表中每一行都代表一个数字所需要点亮的LED灯。例如,第一行对应数字0,需要点亮A-G所有灯,所以该行的值为{1, 1, 1, 1, 1, 1, 0}。第二行对应数字1,需要点亮B和C两个灯,所以该行的值为{0, 1, 1, 0, 0, 0, 0}。 4. 接下来,我们需要将数字num的每一位分离出来,并将对应的LED灯点亮。假设num的值为10,表示数字A,那么我们可以从digits表中获取第10行的信息,然后将对应的LED灯点亮。具体实现方式如下: ```c uint8_t digit1 = num / 10; // 获取十位数字 uint8_t digit2 = num % 10; // 获取个位数字 // 获取数字对应的LED灯信息 const uint8_t* digit1_leds = digits[digit1]; const uint8_t* digit2_leds = digits[digit2]; // 将LED灯逐个点亮 for (uint8_t i = 0; i < 7; i++) { if (digit1_leds[i]) { // 将第i个灯点亮 // 例如,如果第i个灯对应引脚为PA0,则可以使用GPIO_SetBits(GPIOA, GPIO_Pin_0)函数来点亮该引脚 } } // 同理,将个位数字的LED灯逐个点亮 for (uint8_t i = 0; i < 7; i++) { if (digit2_leds[i]) { // 将第i个灯点亮 } } ``` 至此,我们就完成了1到16的显示。当用户按下矩阵键盘中的某个按键时,程序就会获取到对应的数字,然后将其转换为LED灯的状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值