在以往的32博客中,见过了数码管和矩阵键盘,今天就将他们结合起来,如何用矩阵键盘去控制数码管。
我们都知道数码管可以显示从0-9十位数字,也可以显示从A-F的字母,将数码管和2*2矩阵键盘结合起来也就是使用四个按键分别控制加,减,置0和全部点亮。
加减的功能不用多说也就是从0加到F,如果继续增加的话又从0开始,减也是一样,置0也就是将数据恢复为初始状态,全部点亮是为了检验数码管是否可以正常工作。
话不多说,咱们来看一下代码实现
key.c:设置按键
#include "key.h"
#include "delay.h"
#include "usart.h"
//PB5~7设置成数入
//PB8~10设置成输出
void KEY_Init1(void)
{
RCC->APB2ENR|=1<<3;
JTAG_Set(SWD_ENABLE);
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00800000;
// GPIOB->ODR|=1<<5;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X08000000;
//GPIOB->ODR|=1<<6;
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X80000000;
//GPIOB->ODR|=1<<7;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000003;
GPIOB->ODR|=1<<8;
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000030;
GPIOB->ODR|=1<<9;
GPIOB->CRH&=0XFFFFF0FF;
GPIOB->CRH|=0X00000300;
GPIOB->ODR|=1<<10;
key9_Out=1;key8_Out=1;
}
void KEY_Init2(void)
{
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;
GPIOB->ODR|=1<<5;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X03000000;
GPIOB->ODR|=1<<6;
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X30000000;
GPIOB->ODR|=1<<7;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000008;
//GPIOB->ODR|=1<<8;
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000080;
//GPIOB->ODR|=1<<9;
GPIOB->CRH&=0XFFFFF0FF;
GPIOB->CRH|=0X00000800;
//GPIOB->ODR|=1<<10;
key6_Out=1;key5_Out=1;
}
u8 KEY_Scan1()
{
u8 H=0;
GPIOB->ODR&=~(1<<5);
GPIOB->ODR&=~(1<<6);
KEY_Init1();
if(key5_In==1||key6_In==1)
{
delay_ms(10);
if(key5_In==1)
H=1;
if(key6_In==1)
H=2;
return H*10;
}
else
return 0;
}
u8 KEY_Scan2()
{
u8 L=0;
GPIOB->ODR&=~(1<<8);
GPIOB->ODR&=~(1<<9);
KEY_Init2();
if(key8_In==1||key9_In==1)
{
delay_ms(10);
if(key8_In==1)
L=1;
else if(key9_In==1)
L=2;
return L;
}
else return 0;
}
u8 KEY_Out(void)
{
u8 t=0,p=1;
while((KEY_Scan1()==0||KEY_Scan2()==0))
{
t=KEY_Scan1()+KEY_Scan2();
if(t!=0)
{
if(t==11)
return KEY1H_PRES;
else if(t==12)
return KEY2H_PRES;
}
}
}
SMG.h
#ifndef __SMG_H
#define __SMG_H
#include "sys.h"
#include "delay.h"
u8 SMG_Init(void);
#endif
key.h:控制按键
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY1H_PRES 1
#define KEY2H_PRES 2
#define KEY1L_PRES 1
#define KEY2L_PRES 2
#define key5_In PBin(5) //PB5
#define key6_In PBin(6) //PB6
//PB7
#define key5_Out PBout(5)
#define key6_Out PBout(6)
#define key8_In PBin(8)
#define key9_In PBin(9)
#define key8_Out PBout(8) //PB8
#define key9_Out PBout(9) //PB9
void KEY_Init1(void);
void KEY_Init2(void);
u8 KEY_Scan1();
u8 KEY_Scan2();
u8 KEY_Out(void);
#endif
light.c:主函数
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "smg.h"
int main(void)
{
static u8 k=0;
u8 r;
delay_init(72);
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
while(1)
{
r=KEY_Out();
if(r==KEY2H_PRES)
{
if(k==0)
k=9;
else
k--;
}
else if(r==KEY1H_PRES)
{
if(k==9)
k=0;
else
k++;
}
else
break;
switch(k)
{
case 0:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF3F;
break;
}
case 1:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF06;
break;
}
case 2:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF5B;
break;
}
case 3:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF4F;
break;
}
case 4:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF66;
break;
}
case 5:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF6D;
break;
}
case 6:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF7D;
break;
}
case 7:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF07;
break;
}
case 8:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFFFF;
break;
}
case 9:
{
GPIOA->ODR&=0x0000;
GPIOA->ODR|=0xFF6F;
break;
}
}
}
}