[mw_shl_code=c,true]#include "delay.h"
#include "led.h"
#include "ILI93xx.h"
#include "sys.h"
/**************************************************************
CPU:STM32ZET6
基于战舰开发板
功能:4x4矩阵键盘之定时器7扫描
硬件连接:PC0-PC7
***************************************************************/
#define key1 PCin(0)
#define key2 PCin(1)
#define key3 PCin(2)
#define key4 PCin(3)
#define key5 PCin(4)
#define key6 PCin(5)
#define key7 PCin(6)
#define key8 PCin(7)
#define pp PBout(8)
#define kk PAout(5)
u8 can;
struct str
{
u8 key_1;
u8 key_2;
u8 key_3;
u8 key_4;
}STR;
void KEY_PIN(void); //PC0-P3下拉输入
void KEY_OUT(void); //PC4-PC7下拉输入
u8 keyScan(void); //矩阵按键扫描
void TIM7_Int_Init(u16 arr,u16 psc); //定时器7初始化
int main(void)
{
Stm32_Clock_Init(9); //系统时钟初始化
delay_init(72); //延时初始化
led_init(); //led初始化
LCD_Init(); //lcd初始化
KEY_PIN(); //PC0-P3下拉输入
TIM7_Int_Init(1000,720); //重装值-分频 10ms溢出一次
while(1)
{
GPIOB->ODR^=1<<5;
kk=0;
LCD_ShowxNum(120,120,can,2,16,0);
delay_ms(100);
kk=1;
delay_ms(100);
}
}
void KEY_OUT(void)
{
//矩阵键盘检测IO初始化
//PC0-PC3推挽输出0
//PC4-PC7捕获0
GPIOC->CRL&=0XFFFF0000; //推挽输出
GPIOC->CRL|=0X00003333;
GPIOC->ODR&=~(0XF<<0); //输出0
GPIOC->CRL&=0X0000FFFF; //输入
GPIOC->CRL|=0X88880000;
GPIOC->ODR|=0XF<<4;
}
void KEY_PIN(void)
{
//矩阵键盘检测IO初始化
//PC0-PC3捕获0
//PC4-PC7推挽输出0
GPIOC->CRL&=0X0000FFFF; //推挽输出
GPIOC->CRL|=0X33330000;
GPIOC->ODR&=~(0XF<<4);
GPIOC->CRL&=0XFFFF0000; //输入
GPIOC->CRL|=0X00008888;
GPIOC->ODR|=0XF<<0;
}
u8 keyScan(void) //矩阵按键扫描
{
KEY_PIN(); //捕获PC0-P3是否为0
if(key1==0||key2==0||key3==0||key4==0)
{
if(key1==0)STR.key_1=1;
else STR.key_1=0;
if(key2==0)STR.key_2=1;
else STR.key_2=0;
if(key3==0)STR.key_3=1;
else STR.key_3=0;
if(key4==0)STR.key_4=1;
else STR.key_4=0;
KEY_OUT(); //PC4-PC7输入-
if(key5==0||key6==0||key7==0||key8==0)
{
GPIOB->ODR^=1<<8;
if((key5==0)&&(STR.key_1==1))return 1;
else if((key5==0)&&(STR.key_2==1))return 2;
else if((key5==0)&&(STR.key_3==1))return 3;
else if((key5==0)&&(STR.key_4==1))return 4;
if((key6==0)&&(STR.key_1==1))return 5;
else if((key6==0)&&(STR.key_2==1))return 6;
else if((key6==0)&&(STR.key_3==1))return 7;
else if((key6==0)&&(STR.key_4==1))return 8;
if((key7==0)&&(STR.key_1==1))return 9;
else if((key7==0)&&(STR.key_2==1))return 10;
else if((key7==0)&&(STR.key_3==1))return 11;
else if((key7==0)&&(STR.key_4==1))return 12;
if((key8==0)&&(STR.key_1==1))return 13;
else if((key8==0)&&(STR.key_2==1))return 14;
else if((key8==0)&&(STR.key_3==1))return 15;
else if((key8==0)&&(STR.key_4==1))return 16;
}
}
return 0;
}
//定时器7中断服务程序
void TIM7_IRQHandler(void)
{
if(TIM7->SR&0X0001)//溢出中断 同TIM7->SR&=1<<0;效果一样
{
can=keyScan();
}
TIM7->SR&=~(1<<0);//清除中断标志位
}
/*****************************************************************
arr:自动重装值。
psc:时钟预分频数
这里使用的是定时器7!
******************************************************************/
void TIM7_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<5; //TIM7时钟使能 72M
TIM7->ARR=arr; //设定计数器自动重装值
TIM7->

SC=psc; //预分频器7200
TIM7->DIER|=1<<0; //允许更新中断
TIM7->CR1|=0x01; //使能定时器7 ---控制定时器什么时候开始计时
MY_NVIC_Init(0,1,TIM7_IRQChannel,2);//抢占1,子优先级3,组2
}
ok了
[/mw_shl_code]