久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2268|回復: 0
收起左側

怎么改這個STM32矩陣按鍵程序的IO口

[復制鏈接]
ID:405123 發表于 2019-12-12 09:03 | 顯示全部樓層 |閱讀模式
1黑幣
程序實在論壇下的 不過發現只會用 改了IO口就用不了了  有沒有大佬能幫幫我怎么改  最好能寫下備注 讓我學習下怎么修改 附件放上。。。

/*************************************************本程序特點**********************************************************/
/* 1.連按與非連按:定義靜態變量使得連按標志僅在本程序內有效。工作原理:初次進入鍵盤
掃描函數,將連按標志置一,即初次按下;當有鍵按下的時候,會進入掃描函數,在掃描函數內
將標志位掛起,即按鍵已按下;當程序執行完此次掃描,下次進入的時候,首先判斷連按標志位
與鍵盤是否按下,如果按下了,但連按標志位是掛起的,那不進入此函數。接下來判斷鍵盤是否
處于釋放狀態,如果鍵盤是釋放的,則將標志位放下。否則,仍將標志位掛起。
2.端口的初始化,端口首先需要兩種端口,一種是推完輸出,另一種是上拉輸入(沒有信號時電平
為高),首先將輸出置低,如果有鍵按下,會得到相應的列的位置,近而分別置低相應的行,從
而得到按下的按鍵所在的行。
3.本程序略顯麻煩,但經過驗證,完全可用。在寫此程序時,網上有另一種方法,即不斷改變端口
的模式,判斷列時如此程序,接下來將兩種端口的模式換過來,將相應的列置低作為輸出,判斷
相應行的位置,由是得到位置坐標,通過公式換算即可,如對程序實時性要求較高,可嘗試此方
法。
*/

/*************************************************心得體會**************************************************************/
/* 1.使用if語句時一定要注意語句間的聯系,如同本程序,鍵盤掃描需要依次將各個行線置低,并不
是分別將行線置低。
2.熟悉輸入輸出方式,對不必要的端口置位復位進行取消,省略,以簡化程序。
3.switch 語句在使用時,一定要注意break的使用,所以在寫程序時,尤其像此類程序,可以套用
復制粘貼的,首先確保最初的程序一定要沒有基本錯誤。
4.有空的時候將變量標準化,利用define使代碼簡化易讀易改
*/

單片機源程序如下:
  1. #include "key4x4.h"
  2. #include "delay.h"

  3. //從高(H)1---低(L)4接的            
  4. //按鍵初始化函數
  5. //PA15和PC5 設置成輸入
  6. void KEY_Init(void)
  7. {
  8.         
  9.         GPIO_InitTypeDef GPIO_InitStructure;

  10.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時鐘
  11.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//PA 0 1 2 3  H
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置成推挽輸出
  13.          GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
  14.         
  15.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PA 4 5 6 7  L
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
  17.          GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
  18.         
  19. }
  20. //按鍵處理函數


  21. void BIXU(void)
  22. {
  23. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);        
  24. }


  25. int key_scan(void)
  26. {
  27.         static u8 key_up=1;
  28.         int key_num=0;
  29.         u8 temp=0;                                                                //判斷列的數據緩存區
  30.         u8 temp1=0;                                                                //判斷行的數據緩存區
  31.         GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);                        //拉低行線
  32.         delay_us(10);
  33.         temp=GPIO_ReadInputData(GPIOA)&0xff;                                //讀出A的數據寄存器的值   ***0xff表示選擇低8(0~7)位  寫的話用或。讀就要用與 獲取高8位則將&0xff改成&0xff00
  34.         delay_us(1);
  35.         if (key_up&&(temp != 0xf0))                                                        //判斷鍵是否按下與是否連按     ***0xf0表示獲得4~7位
  36.         {
  37.                 delay_ms(10);                                                //消抖
  38.                 key_up=0;                                                        //當有鍵按下時,將連按標志位掛起   屏蔽這一段為連按 太快把延時加長
  39.                 temp = GPIO_ReadInputData(GPIOA)&0xff;                        //消抖后重新得到A的值
  40.                 if(temp != 0xf0)
  41.                 {                        
  42.                         switch(temp)                                                                //進入鍵盤按下的相應行線
  43.                         {
  44.                                 case 0xe0:
  45.                                 {
  46.                                        
  47.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);                //依次從第一行拉低到第四行,讀出A的數據,從而判斷
  48.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                                                //是哪一行的鍵盤按下,從而給出相應的鍵值
  49.                                         delay_us(10);
  50.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  51.                                         if (temp1==0xee)
  52.                                                 key_num=13;
  53.                                         else
  54.                                         {
  55.                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  56.                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  57.                                                 delay_us(1);
  58.                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  59.                                        
  60.                                                 if (temp1==0xed)
  61.                                                         key_num=9;
  62.                                                 else
  63.                                                 {
  64.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  65.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  66.                                                         delay_us(1);
  67.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  68.                                                 
  69.                                                         if (temp1==0xeb)
  70.                                                                 key_num=5;
  71.                                                         else
  72.                                                                 key_num=1;
  73.                                                 }
  74.                                         }
  75.                                 }
  76.                                 break;
  77.                                 case 0xd0:
  78.                                 {
  79.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  80.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  81.                                         delay_us(1);
  82.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  83.                                         if (temp1==0xde)
  84.                                                 key_num=14;
  85.                                         else
  86.                                         {
  87.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  88.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  89.                                                         delay_us(1);
  90.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  91.                                                 
  92.                                                         if (temp1==0xdd)
  93.                                                                 key_num=10;
  94.                                                         else
  95.                                                         {
  96.                                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  97.                                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  98.                                                                 delay_us(1);
  99.                                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  100.                                                         
  101.                                                                 if (temp1==0xdb)
  102.                                                                         key_num=6;
  103.                                                                 else
  104.                                                                         key_num=2;
  105.                                                         }
  106.                                         }
  107.                                 }
  108.                                 break;
  109.                                 case 0xb0:
  110.                                 {
  111.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  112.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  113.                                         delay_us(1);
  114.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  115.                                         if (temp1==0xbe)
  116.                                                 key_num=15;
  117.                                         else
  118.                                         {
  119.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  120.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  121.                                                         delay_us(1);
  122.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  123.                                                 
  124.                                                         if (temp1==0xbd)
  125.                                                                 key_num=11;
  126.                                                         else
  127.                                                         {
  128.                                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  129.                                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  130.                                                                 delay_us(1);
  131.                                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  132.                                                         
  133.                                                                 if (temp1==0xbb)
  134.                                                                         key_num=7;
  135.                                                                 else
  136.                                                                         key_num=3;
  137.                                                         }
  138.                                         }
  139.                                 }
  140.                                 break;
  141.                                 case 0x70:
  142.                                 {
  143.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  144.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  145.                                         delay_us(1);
  146.                                         temp1=(GPIO_ReadInputData(GPIOA)&0xff);
  147.                                         if (temp1==0x7e)
  148.                                                 key_num=16;
  149.                                         else
  150.                                         {
  151.                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  152.                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  153.                                                 delay_us(1);
  154.                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  155.                                        
  156.                                                 if (temp1==0x7d)
  157.                                                         key_num=12;
  158.                                                 else
  159.                                                 {
  160.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  161.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  162.                                                         delay_us(1);
  163.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  164.                                                 
  165.                                                         if (temp1==0x7b)
  166.                                                                 key_num=8;
  167.                                                         else
  168.                                                                 key_num=4;
  169.                                                 }
  170.                                         }
  171.                                 }
  172.                                 break;
  173.                                 default :return 0;
  174.                         }               
  175.                 }
  176.         }
  177.         else if(temp == 0xf0)
  178.         {                                                                                                //當沒有鍵按下后,將連按標志復位
  179.                 key_up=1;
  180.         }
  181.         return key_num;        
  182. }

復制代碼

全部資料51hei下載地址:
完整.zip (2.48 KB, 下載次數: 8)

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青久草视频 | 亚洲高清三级 | 99re在线视频 | 午夜www | 久久久久网站 | 精品久久久久久 | www.日本国产 | 天天噜天天干 | 国产精品久久久久久久久久99 | av免费入口| 久久99成人 | 国产精品乱码一二三区的特点 | 精品国产18久久久久久二百 | 六月色婷 | 精品国产一区二区三区日日嗨 | 精品成人| 色综合99 | 精品亚洲一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 日韩电影中文字幕在线观看 | 在线国产视频 | 波多野吉衣久久 | 精品国产99| 久久综合狠狠综合久久 | 久久国产精品免费一区二区三区 | 99在线资源 | 青青久久| 中文字幕在线视频一区二区三区 | 日本精品一区二区三区视频 | 97精品超碰一区二区三区 | 一区二区三区在线播放 | 久久a久久 | 嫩草视频在线 | 久久久久黑人 | 久久精品欧美一区二区三区麻豆 | 日韩欧美在线观看 | 91精品国产综合久久久久久蜜臀 | 国产欧美一区二区三区在线看 | 久久人人国产 | 精精国产xxxx视频在线播放 | 中文字幕日韩一区二区 |