日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月08日(星期五)

2020年08月08日 | 基于STM32F103的任意I/O口矩陣鍵盤驅(qū)動程序

發(fā)布者:CrystalSparkle 來源: 51hei關(guān)鍵字:STM32F103  任意I  O口  矩陣鍵盤  驅(qū)動程序 手機看文章 掃描二維碼
隨時隨地手機看文章

網(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,其他類型的默認值可以自己測試。所以可以這么用:


  1. keyscan = Key_Scan();//keyscan為unsigned char 型

  2. if(keyscan != 255)

  3. {

  4.      key_value = keyscan;

  5. }


下面是測試結(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++;

[1] [2]
關(guān)鍵字:STM32F103  任意I  O口  矩陣鍵盤  驅(qū)動程序 引用地址:基于STM32F103的任意I/O口矩陣鍵盤驅(qū)動程序

上一篇:OneNET平臺下的STM32單片機MQTT協(xié)議數(shù)據(jù)傳輸源碼
下一篇:stm32 0.96寸OLED時鐘程序,萬年歷,大字體

推薦閱讀

? ?知名配件廠商羅技(Logi)剛剛推出了一款有源無線充電座新品,其專為蘋果iPhone X而設計、售價69.99美元、預計上市時間為本月下旬。外媒TheVerge在試用后表示,整個襯墊由堅固耐用的塑料制成,能夠保持手機的緊固 —— 即便設備在振動,也不會導致意外的滑動。此外,它的支架角度非常友好,不僅能夠水平/垂直放置,還可以在充電時輕松使用Face I...
據(jù)外媒報道,夏季來臨,汽車方向盤變得滾燙下不去手,但是新型熱電材料卻可解決該問題。由于缺乏能夠在室溫下保持高效,同時價格便宜的材料,可以直接將電能轉(zhuǎn)化成熱能,以實現(xiàn)冷卻和加熱功能的熱電設備的普及受到了阻礙。(圖片來源:休斯敦大學官網(wǎng))但是,現(xiàn)在,美國休斯敦大學(the University of Houston)和麻省理工學院(the Massachusetts In...
為了能以歌單的方式來選擇歌曲播放,可通過OLED屏來完成此任務。因該顯示屏采用I2C接口,故可以有效地節(jié)省IO口資源。此外,該顯示屏較通常的OLED要寬,也易于來顯示歌曲名稱。5.OLED屏顯示及菜單選擇1)完成3個常亮的定義宏2)添加相關(guān)顯示函數(shù)3)按圖23所示完成程序流程修改,然后再重新生成代碼。受編譯器的限制,至此就完成了以易碼魔盒進行開發(fā)的過程...
集微網(wǎng)消息,從去年開始,“缺貨”和“漲價”成了圍繞半導體行業(yè)的實時關(guān)鍵詞。隨一波接一波缺貨而來的,是一浪高過一浪的報價。芯片尤是,MOSFET也不例外。漲聲不斷 MOSFET出貨告急受限于原材料緊缺和8英寸晶圓廠產(chǎn)能緊張,MOSFET價格從去年開始上漲。今年以來,東南亞地區(qū)疫情仍不見好轉(zhuǎn),英飛凌(Infineon),意法半導體(ST)、安森美(ON)等國際IDM...

史海拾趣

問答坊 | AI 解惑

嵌入式汽車數(shù)字儀表設計

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 ...…

查看全部問答∨

開機

我的電腦密碼記不得,如何解開電腦的密碼,在哪里進行操作,登陸密碼,各種操作系統(tǒng)的解發(fā),請大家?guī)椭? 急急................................…

查看全部問答∨

個人求有PHS基站控制器軟件開發(fā)經(jīng)驗輔導老師(可兼職,深圳)

本人欲從事PHS基站控制器軟件開發(fā),因無此方面的經(jīng)驗,想請位有這方面經(jīng)驗的輔導老師。 主要工作是幫助本人分析一個現(xiàn)有PHS基站控制器軟件源程序,然后修正程序中的一些BUG。 時間方面可以是靈活按排(工作日、業(yè)余均可),報酬可以按時/日/周/月等 ...…

查看全部問答∨

Linuxlogo顯示

請問linuxlogo默認是在左上角顯示的,現(xiàn)在要求顯示到右下角,并且企鵝圖像倒置 相當于把默認顯示轉(zhuǎn)180度,請問這個哪里可以改。 可以修改fbcon.c嗎?新人求救!!…

查看全部問答∨

(++急)有償請求解決單片機串口多機通信程序問題

各位大俠們,麻煩幫忙看看這個例子,是我畢業(yè)設計的題目,由于單片機C編程學得不精,這幾天一直在調(diào)程序都沒法調(diào)出來,還請各位大蝦們幫幫忙!萬分感激?。?! 硬件實現(xiàn)功能: 1、從機U2按鍵按下,在本機顯示,同時將按鍵值送往主機U1,在主機顯示 ...…

查看全部問答∨

中*美*愛*梯*科*技, 9月10日新班開課, 免費試聽!

中*美*愛*梯*科*技, .NET外企軟件工程師班將于2007年9月10日開課, 開課第一周免費試聽, 歡迎大家踴躍報名參加!   中*美*愛*梯*科*技向?qū)W員鄭重承諾: 百分之百保證就業(yè), 月薪3000——8000, 就不了業(yè)者退還全部學費!    ...…

查看全部問答∨

有熟悉STM32編程的進來幫個忙

1,#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || ;請問這個加了紅色背景的是什么意思;特別是IS—是什么意思,后面這一句是什么意思…

查看全部問答∨

642圖像縮放問題

各位高手:642采集的圖像好像是720*480的大小吧,如果用jpeg編碼,出來的圖像也是720*480,現(xiàn)在我想請問的是我采集720*480大小的圖像,用jpeg編碼,并縮小成320*240(注:不是在原圖上截取,而是大小縮放),請問該如何做,或者采集的時候就重新取樣 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved