亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
STM32源程序-固件庫-矩陣鍵盤
[打印本頁]
作者:
12233344421
時(shí)間:
2020-5-28 08:08
標(biāo)題:
STM32源程序-固件庫-矩陣鍵盤
STM32 矩陣鍵盤
簡介
1.硬件部分
2.軟件部分
硬件部分
矩陣鍵盤的工作方式
對(duì)鍵盤的響應(yīng)取決于鍵盤的工作方式,鍵盤的工作方式應(yīng)根據(jù)實(shí)際應(yīng)用系統(tǒng)中的CPU的工作狀況而定,其選取的原則是既要保證CPU能及時(shí)響應(yīng)按鍵操作,又不要過多占用CPU的工作時(shí)間。通常鍵盤的工作方式有三種,編程掃描、定時(shí)掃描和中斷掃描。
(1)編程掃描方式
編程掃描方式是利用CPU完成其它工作的空余時(shí)間,調(diào)用鍵盤掃描子程序來響應(yīng)鍵盤輸入的要求。在執(zhí)行鍵功能程序時(shí),CPU不再響應(yīng)鍵輸入要求,直到CPU重新掃描鍵盤為止。
(2)定時(shí)掃描方式
定時(shí)掃描方式就是每隔一段時(shí)間對(duì)鍵盤掃描一次,它利用單片機(jī)內(nèi)部的定時(shí)器產(chǎn)生一定時(shí)間(例如10ms)的定時(shí),當(dāng)定時(shí)時(shí)間到就產(chǎn)生定時(shí)器溢出中斷。CPU響應(yīng)中斷后對(duì)鍵盤進(jìn)行掃描,并在有按鍵按下時(shí)識(shí)別出該鍵,再執(zhí)行該鍵的功能程序。
(3)中斷掃描方式
上述兩種鍵盤掃描方式,無論是否按鍵,CPU都要定時(shí)掃描鍵盤,而單片機(jī)應(yīng)用系統(tǒng)工作時(shí),并非經(jīng)常需要鍵盤輸入,因此,CPU經(jīng)常處于空掃描狀態(tài)。
為提高CPU工作效率,可采用中斷掃描工作方式。其工作過程如下:當(dāng)無按鍵按下時(shí),CPU處理自己的工作,當(dāng)有按鍵按下時(shí),產(chǎn)生中斷請(qǐng)求,CPU轉(zhuǎn)去執(zhí)行鍵盤掃描子程序,并識(shí)別鍵號(hào)。
4x4矩陣鍵盤模塊原理圖
Snipaste_2020-05-28_08-05-32.png
(173.52 KB, 下載次數(shù): 37)
下載附件
2020-5-28 08:07 上傳
/*********************************************************************
* 文件名 :key4x4.c
* 描述 :按鍵應(yīng)用函數(shù)庫
* 硬件連接:-------------------------
* | PB8 - H4 |
* | PB9 - H3 |
* | PB10 - H2 |
* | PB11 - H1 |
* | PB12 - L4 |
* | PB13 - L3 |
* | PB14 - L2 |
* | PB15 - L1 |
* -------------------------
* 庫版本 :ST3.5.0
*********************************************************************/
#include "key4x4.h"
#include "delay.h"
/*
* 函數(shù)名:Key_GPIO_Config
* 描述 :配置按鍵用到的I/O口 GPIO端口可以自行定義
* 輸入 :無
* 輸出 :無
*/
void Key4x4_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟按鍵端口的時(shí)鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //GPIO端口引腳可以自行定義
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//配置引腳速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//配置引腳模式 GPIO_Mode_IPU 上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函數(shù)名:u8 Key_Scan
* 描述 :按鍵掃描函數(shù)
* 輸入 :無
* 輸出 :無
*/
u8 Key_Scan(void)
{
u16 temp;
u8 ucBackValue=0;
//====掃描第一列==========
GPIO_Write(GPIOB,0xfe00);
temp=GPIO_ReadInputData(GPIOB); //讀出整個(gè)口得到的值
temp=temp&0xf000; //屏蔽低4位
if (temp!=0xf000) //假如高4位不全是1
{
delay_ms(20); // 延時(shí)消抖再讀
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
if (temp!=0xf000) //消抖后如果再次高4位確定不是全1
{
temp=GPIO_ReadInputData(GPIOB)&0xff00; //讀出此次按鍵的值
switch(temp)
{
case 0xee00:
ucBackValue = 1;break;
case 0xde00:
ucBackValue = 5;break;
case 0xbe00:
ucBackValue = 9;break;
case 0x7e00:
ucBackValue = 13;break;
default:break;
}
while(temp!=0xf000) //等待按鍵放開,初始必然被執(zhí)行
{
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
}
}
}
//====第二列送0==========
GPIO_Write(GPIOB,0xfd00);
temp=GPIO_ReadInputData(GPIOB); //讀出整個(gè)口得到的值
temp=temp&0xf000; //屏蔽低4位
if (temp!=0xf000) //假如高4位不全是1
{
delay_ms(20); // 延時(shí)消抖再讀
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
if (temp!=0xf000) //消抖后如果再次高4位確定不是全1
{
temp=GPIO_ReadInputData(GPIOB)&0xff00; //讀出此次按鍵的值
switch(temp)
{
case 0xed00:
ucBackValue = 2; break;
case 0xdd00:
ucBackValue = 6; break;
case 0xbd00:
ucBackValue = 10; break;
case 0x7d00:
ucBackValue = 14; break;
default:break;
}
while(temp!=0xf000) //等待按鍵放開
{
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
}
}
}
//====第3列送0==========
GPIO_Write(GPIOB,0xfb00);
temp=GPIO_ReadInputData(GPIOB); //讀出整個(gè)口得到的值
temp=temp&0xf000; //屏蔽低4位
if (temp!=0xf000) //假如高4位不全是1
{
delay_ms(20); // 延時(shí)消抖再讀
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
if (temp!=0xf000) //消抖后如果再次高4位確定不是全1
{
temp=GPIO_ReadInputData(GPIOB)&0xff00; //讀出此次按鍵的值
switch(temp)
{
case 0xeb00:
ucBackValue = 3; break;
case 0xdb00:
ucBackValue = 7; break;
case 0xbb00:
ucBackValue = 11; break;
case 0x7b00:
ucBackValue = 15; break;
default:break;
}
while(temp!=0xf000) //等待按鍵放開
{
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
}
}
}
//====第4列送0==========
GPIO_Write(GPIOB,0xf700);
temp=GPIO_ReadInputData(GPIOB); //讀出整個(gè)口得到的值
temp=temp&0xf000; //屏蔽低4位
if (temp!=0xf000) //假如高4位不全是1
{
delay_ms(20); // 延時(shí)消抖再讀
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
if (temp!=0xf000) //消抖后如果再次高4位確定不是全1
{
temp=GPIO_ReadInputData(GPIOB)&0xff00;
switch(temp)
{
case 0xe700:
ucBackValue = 4; break;
case 0xd700:
ucBackValue = 8; break;
case 0xb700:
ucBackValue = 12; break;
case 0x7700:
ucBackValue = 16; break;
default:break;
}
while(temp!=0xf000) //等待按鍵放開
{
temp=GPIO_ReadInputData(GPIOB);
temp=temp&0xf000;
}
}
}
return ucBackValue;
}
復(fù)制代碼
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
void Key4x4_GPIO_Config(void);
u8 Key_Scan(void);
#endif /* __KEY_H */
復(fù)制代碼
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1