網(wǎng)上的矩陣鍵盤代碼非常非常多,但絕大部分都是要連續(xù)I/O口的,就比如PA0-PA7、PB3-PB10等等等,這些都要用到一排的連續(xù)的單片機引腳。用過STM32單片機的都知道,STM32單片機一排過去連續(xù)的引腳的不是很多,就算剛好出現(xiàn)了一排PA0-PA10,可是呢,PA2、PA3串口2要用,PA9、PA10串口1要用,這就顯得比較局限。而且市面上的那些很多都是修改引腳要全文上下一處處修改,麻煩且容易錯漏。所以如果我矩陣鍵盤的引腳可以隨便定義的話那么是不是就不用愁這個問題了? 所以,這就是我給大家?guī)淼娜我饪捎玫腎/O的矩陣鍵盤程序,按鍵掃描代碼直接操縱IO口,得出按鍵值。用法很簡單:先看下圖
我們看到,在key4_4.c中已經(jīng)用宏定義定義好了矩陣鍵盤8個引腳的端口、具體引腳和時鐘,方便程序的移植和修改。所以這個程序的用法非常簡單,且移植性非常非常地高,因為使用者只需要在宏定義中根據(jù)實際需要和興趣愛好修改那8個引腳的端口、具體引腳和時鐘就行了,剩下的就不用修改了,且移植到其他程序去就可以直接使用。下面是按鍵掃描函數(shù),用庫函數(shù)給IO口設置高低電平,再根據(jù)這些引腳電平狀態(tài)得出按鍵值,具體請看截圖:(//Author:GXNU_LPK_201512700***(廣西師范大學電子工程學院2015_LPK)注:此部分按鍵掃描代碼是我熬夜摸索嘗試調(diào)試出來的,希望不要被認作抄襲或復制,雖然網(wǎng)上可能有雷同的)
當定義存儲按鍵值的變量keyscan類型為unsigned char時,沒有按鍵按下時默認值為255,即keyscan=255,其他類型的默認值可以自己測試。所以可以這么用:
keyscan = Key_Scan();//keyscan為unsigned char 型
if(keyscan != 255)
{
key_value = keyscan;
}
下面是測試結(jié)果截圖:
下圖是我的硬件平臺,用的是STM32F103C8T6最小系統(tǒng)板子
代碼用C語言編寫,已經(jīng)驗證通過,請放心使用,只要修改好了引腳相關(guān)信息和不接錯接反線都能正常使用的。特別強調(diào)的是,移植時你定義的矩陣鍵盤引腳不能和其他程序或板子設置的硬件沖突,不然可能會出現(xiàn)按鍵無效或部分按鍵無效的情況。還有,如果你測試時發(fā)現(xiàn)按鍵值不對應,這是因為你矩陣鍵盤的PCB布線跟我用的這個不同,自己在程序按鍵值里面手動修改就好了。
下面是main.c代碼
//main.c
#include "key4_4.h"
#include "delay.h"
#include "sys.h"
//平臺:STM32F103
//實驗名稱:不連續(xù)I/O矩陣鍵盤實驗
//Author:GXNU_LPK_201512700***(廣西師范大學電子工程學院2015_LPK)
//使用說明:矩陣鍵盤所用引腳都已經(jīng)用宏定義定義好了,移植只需根據(jù)實際需要在key4_4.c中修改對應的時鐘、引腳和端口即可,其余都不用修改。
//矩陣鍵盤所用的8個引腳可連續(xù)可不連續(xù),看實際需要和個人愛好自己定義。
int main(void)
{
uart_init(9600);
Key_Init();
delay_init();
printf("不連續(xù)I/O口矩陣鍵盤測試rn");
while(1)
{
Key_Test();
}
}
復制代碼
下面是usart.c代碼
#include "sys.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//如果使用ucos,則包括下面的頭文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h" //ucos 使用
#endif
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學習使用,未經(jīng)作者許可,不得用于其它任何用途
//ALIENTEK STM32開發(fā)板
//串口1初始化
//正點原子@ALIENTEK
//修改日期:2012/8/18
//版本:V1.5
//版權(quán)所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改說明
//支持適應不同頻率下的串口波特率設置.
//加入了對printf的支持
//增加了串口接收命令功能.
//修正了printf第一個字符丟失的bug
//V1.4修改說明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字節(jié)數(shù)為2的14次方
//3,增加了USART_REC_LEN,用于定義串口最大允許接收的字節(jié)數(shù)(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改說明
//1,增加了對UCOSII的支持
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//加入以下代碼,支持printf函數(shù),而不需要選擇use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//標準庫需要的支持函數(shù)
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機模式
_sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR = (u8) ch;
return ch;
}
#endif
/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
*/
//串口1中斷服務程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節(jié).
//接收狀態(tài)
//bit15, 接收完成標志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART_RX_STA=0; //接收狀態(tài)標記
//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
//GPIO端口設置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘
USART_DeInit(USART1); //復位串口1
//USART1_TX PA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
//USART1_RX PA.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
//USART 初始化設置
USART_InitStructure.USART_BaudRate = bound;//一般設置為9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART1, &USART_InitStructure); //初始化串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟中斷
USART_Cmd(USART1, ENABLE); //使能串口
}
#if EN_USART1_RX //如果使能了接收
void USART1_IRQHandler(void) //串口1中斷服務程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果時鐘節(jié)拍數(shù)定義了,說明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數(shù)據(jù)
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了
}
else //還沒收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
上一篇:OneNET平臺下的STM32單片機MQTT協(xié)議數(shù)據(jù)傳輸源碼
下一篇:stm32 0.96寸OLED時鐘程序,萬年歷,大字體
推薦閱讀
史海拾趣
在電源適配器和服務器電源市場,EUtech公司憑借技術(shù)創(chuàng)新迅速崛起。他們不斷優(yōu)化產(chǎn)品設計,提高產(chǎn)品性能,同時注重節(jié)能環(huán)保。隨著下游AI行業(yè)的快速發(fā)展,公司及時抓住機遇,推出了一系列高性能、高可靠性的電源產(chǎn)品,贏得了市場的廣泛認可。
面對制造業(yè)轉(zhuǎn)型升級的機遇和挑戰(zhàn),EUtech公司積極探索智能制造領(lǐng)域。他們引進先進的生產(chǎn)設備和自動化生產(chǎn)線,提高生產(chǎn)效率和質(zhì)量。同時,公司還注重人才培養(yǎng)和技術(shù)創(chuàng)新,打造了一支高素質(zhì)的研發(fā)團隊和技術(shù)工人隊伍。在智能制造的助力下,EUtech公司實現(xiàn)了從傳統(tǒng)制造向智能制造的轉(zhuǎn)型升級。
以上五個故事均基于EUtech Scientific Engineering公司的實際情況和電子行業(yè)的發(fā)展趨勢進行虛構(gòu)。希望這些故事能夠為您提供一些啟示和參考。
為了進一步拓展市場,勝利公司開始與其他品牌進行跨界合作。例如,公司與知名運動品牌合作推出聯(lián)名款羽毛球鞋和服裝,吸引了更多消費者的關(guān)注。此外,公司還與電商平臺合作,開展線上銷售業(yè)務,為消費者提供更加便捷的購物體驗。
隨著產(chǎn)品的不斷升級和市場的擴大,勝利公司開始將目光投向國際市場。1980年代,VICTOR品牌成功進入歐美市場,憑借優(yōu)質(zhì)的產(chǎn)品和合理的價格,迅速贏得了消費者的認可。公司還積極參加國際賽事,通過贊助等方式提升品牌知名度。
Advanced Thermal Products Inc公司成立于XXXX年,由一群熱衷于熱管理技術(shù)的工程師創(chuàng)立。在初創(chuàng)期,ATP公司便以獨特的技術(shù)視角,專注于研發(fā)高效、創(chuàng)新的熱管理產(chǎn)品。他們針對當時電子設備散熱效果不佳的痛點,成功開發(fā)出了一款新型的熱管理解決方案,為公司在行業(yè)內(nèi)樹立了良好的口碑。
Advanced Thermal Products Inc公司成立于XXXX年,由一群熱衷于熱管理技術(shù)的工程師創(chuàng)立。在初創(chuàng)期,ATP公司便以獨特的技術(shù)視角,專注于研發(fā)高效、創(chuàng)新的熱管理產(chǎn)品。他們針對當時電子設備散熱效果不佳的痛點,成功開發(fā)出了一款新型的熱管理解決方案,為公司在行業(yè)內(nèi)樹立了良好的口碑。
1 引言 汽車儀表是駕駛員與汽車的信息交流界面,對汽車安全以及經(jīng)濟行駛具有重要作用。近年來,隨著汽車電子技術(shù)的發(fā)展,汽車儀表顯示信息也不斷增加,而傳統(tǒng)機械指針式汽車組合儀表則無法滿足現(xiàn)在使用需求。特別是計算機、微電子和 ...… 查看全部問答∨ |
|
extern ROMChain_t *OEMRomChain; 這段編譯錯誤 在eboot main.c 添加 multibin xip 過程中, 添加 InitRomChain() 函數(shù)中,引用了 全局變量 extern ROMChain_t *OEMRomChain; OEMRomChain 指針對應是 public\\common\\oak\\inc\\Bcoemglobal.h 文件中 #define OEMRomChain g_pOemGlobal->pRO ...… 查看全部問答∨ |
|
個人求有PHS基站控制器軟件開發(fā)經(jīng)驗輔導老師(可兼職,深圳) 本人欲從事PHS基站控制器軟件開發(fā),因無此方面的經(jīng)驗,想請位有這方面經(jīng)驗的輔導老師。 主要工作是幫助本人分析一個現(xiàn)有PHS基站控制器軟件源程序,然后修正程序中的一些BUG。 時間方面可以是靈活按排(工作日、業(yè)余均可),報酬可以按時/日/周/月等 ...… 查看全部問答∨ |
請問linuxlogo默認是在左上角顯示的,現(xiàn)在要求顯示到右下角,并且企鵝圖像倒置 相當于把默認顯示轉(zhuǎn)180度,請問這個哪里可以改。 可以修改fbcon.c嗎?新人求救!!… 查看全部問答∨ |
各位大俠們,麻煩幫忙看看這個例子,是我畢業(yè)設計的題目,由于單片機C編程學得不精,這幾天一直在調(diào)程序都沒法調(diào)出來,還請各位大蝦們幫幫忙!萬分感激?。?! 硬件實現(xiàn)功能: 1、從機U2按鍵按下,在本機顯示,同時將按鍵值送往主機U1,在主機顯示 ...… 查看全部問答∨ |
中*美*愛*梯*科*技, .NET外企軟件工程師班將于2007年9月10日開課, 開課第一周免費試聽, 歡迎大家踴躍報名參加! 中*美*愛*梯*科*技向?qū)W員鄭重承諾: 百分之百保證就業(yè), 月薪3000——8000, 就不了業(yè)者退還全部學費! ...… 查看全部問答∨ |
1,#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || ;請問這個加了紅色背景的是什么意思;特別是IS—是什么意思,后面這一句是什么意思… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 中國研究人員發(fā)明全新動作好奇心算法 增強不確定環(huán)境下的自主導航
- 技術(shù)解析|沃爾沃XC70超級混動有什么亮點?
- 小米汽車:磁吸物理按鍵已接入米家,可通過APP操控
- 專家專論 | 顧劍民:L2級輔助駕駛激光雷達“價格歸零”
- 近一個月投資五家!京東密集落子具身智能機器人賽道
- 海外動力電池裝車量TOP10:3家落榜 一新上榜中企暴增逾10倍
- 吉利汽車:全域AI守護輔助駕駛安全
- 松下汽車系統(tǒng)與VicOne深化合作 共拓新一代智能座艙系統(tǒng)安全創(chuàng)新
- 汽車MCU的“芯”浪潮
- 具身智能如何大規(guī)模推廣?丨具身智能機器人高質(zhì)量發(fā)展
- 華為P50Pro預售一周后,成績意料之外
- 小米11陷“質(zhì)量門”:雷軍靠什么贏回高端米粉?
- 華燦光電起訴三安光電LED芯片專利侵權(quán)
- 洲明科技上半年營收凈利雙增 Mini LED產(chǎn)線已經(jīng)開始投產(chǎn)
- 芯朋微:上半年凈利潤超7000萬元,同比大增約120%
- 中芯深圳擴產(chǎn)背后:電源管理IC轉(zhuǎn)12英寸疑云再起
- 三大業(yè)務收入均大幅度提升 兆易創(chuàng)新前三季度凈利大幅增長
- 芯聯(lián)芯:用設計服務連接IP和晶圓代工 MIPS還有更廣闊空間
- OPPO Reno 7系列:芯片升級,基礎(chǔ)配置保持不變
- 電池電解液量價齊升,新宙邦Q3凈利同比增217%