OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6687|回复: 3

战舰开发板 STM32 定时器之4X4矩阵键盘扫描

[复制链接]

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
发表于 2014-12-14 17:40:01 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]
[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]


[/mw_shl_code]

酱油团队--
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-14 23:08:03 | 显示全部楼层
参考下论坛别人发的代码试试吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

32

主题

153

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2014-11-5
在线时间
0 小时
 楼主| 发表于 2014-12-15 00:30:34 | 显示全部楼层
回复【2楼】正点原子:
--------------------------------
原子哥,战舰开发板里按键程序里那个选择模式的功能 ,是不是只有加上拉电阻或者下拉电阻才能用?

用其他IO口实验不行呢。。
酱油团队--
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-15 19:41:30 | 显示全部楼层
回复【3楼】xiaolong12:
---------------------------------
不是啊,我们的按键就没有外加上下拉电阻的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 21:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表