久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
這是一個(gè)STM32 4*4矩陣鍵盤的程序
[打印本頁(yè)]
作者:
XLXUN
時(shí)間:
2021-9-7 23:06
標(biāo)題:
這是一個(gè)STM32 4*4矩陣鍵盤的程序
已經(jīng)調(diào)好,mini板,用即可
#include "key4_4.h"
#include "delay.h"
#include "sys.h"
//平臺(tái):STM32F103
//實(shí)驗(yàn)名稱:不連續(xù)I/O矩陣鍵盤實(shí)驗(yàn)
//使用說(shuō)明:矩陣鍵盤所用引腳都已經(jīng)用宏定義定義好了,移植只需根據(jù)實(shí)際需要在key4_4.c中修改對(duì)應(yīng)的時(shí)鐘、引腳和端口即可,其余都不用修改。
//矩陣鍵盤所用的8個(gè)引腳可連續(xù)可不連續(xù),看實(shí)際需要和個(gè)人愛(ài)好自己定義。
int main(void)
{
uart_init(9600);
Key_Init();
delay_init();
printf("不連續(xù)I/O口矩陣鍵盤測(cè)試\r\n");
while(1)
{
Key_Test();
}
}
復(fù)制代碼
/*****接口如下
C1---B9;C2-C4----B6 ;R1---B5;2----15;3---12;4---11
***/
#include "key4_4.h"
#include "delay.h"
#include "sys.h"
//8個(gè)引腳 4個(gè)為行 4個(gè)為列
//行輸出端口定義
#define X1_GPIO_PORT GPIOA
#define X2_GPIO_PORT GPIOA
#define X3_GPIO_PORT GPIOA
#define X4_GPIO_PORT GPIOB
//列輸入端口定義
#define Y1_GPIO_PORT GPIOB
#define Y2_GPIO_PORT GPIOB
#define Y3_GPIO_PORT GPIOB
#define Y4_GPIO_PORT GPIOB
//行輸出引腳定義
#define X1_GPIO_PIN GPIO_Pin_11
#define X2_GPIO_PIN GPIO_Pin_12
#define X3_GPIO_PIN GPIO_Pin_15
#define X4_GPIO_PIN GPIO_Pin_5
//列輸入引腳定義
#define Y1_GPIO_PIN GPIO_Pin_6
#define Y2_GPIO_PIN GPIO_Pin_7
#define Y3_GPIO_PIN GPIO_Pin_8
#define Y4_GPIO_PIN GPIO_Pin_9
//行輸出時(shí)鐘定義
#define X1_RCC RCC_APB2Periph_GPIOA
#define X2_RCC RCC_APB2Periph_GPIOA
#define X3_RCC RCC_APB2Periph_GPIOA
#define X4_RCC RCC_APB2Periph_GPIOB
//列輸入時(shí)鐘定義
#define Y1_RCC RCC_APB2Periph_GPIOB
#define Y2_RCC RCC_APB2Periph_GPIOB
#define Y3_RCC RCC_APB2Periph_GPIOB
#define Y4_RCC RCC_APB2Periph_GPIOB
//移植代碼只需要修改上面的端口和引腳和時(shí)鐘即可,下面的代碼不用修改。
//矩陣鍵盤所用的8個(gè)引腳可連續(xù)可不連續(xù),看實(shí)際需要和個(gè)人愛(ài)好自己定義。
unsigned char Y1,Y2,Y3,Y4;
void Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(X1_RCC|X2_RCC|X3_RCC|X4_RCC|Y1_RCC|Y2_RCC|Y3_RCC|Y4_RCC|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
////開(kāi)啟AFIO時(shí)鐘
//
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
////改變指定管腳的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP)
//
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
////改變指定管腳的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
/*****************************4行輸出*********************************************/
GPIO_InitStructure.GPIO_Pin = X1_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(X1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = X2_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(X2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = X3_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(X3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = X4_GPIO_PIN ;
GPIO_Init(X4_GPIO_PORT, &GPIO_InitStructure);
/**************************************4列輸入*************************************/
GPIO_InitStructure.GPIO_Pin = Y1_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Y1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Y2_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Y2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Y3_GPIO_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Y3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = Y4_GPIO_PIN;
GPIO_Init(Y4_GPIO_PORT, &GPIO_InitStructure);
}
int Key_Scan(void)
{
uchar KeyVal;
GPIO_SetBits(X1_GPIO_PORT,X1_GPIO_PIN); //先讓X1輸出高
GPIO_SetBits(X2_GPIO_PORT,X2_GPIO_PIN); //先讓X2輸出高
GPIO_SetBits(X3_GPIO_PORT,X3_GPIO_PIN); //先讓X3輸出高
GPIO_SetBits(X4_GPIO_PORT,X4_GPIO_PIN); //先讓X4輸出高
if((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN)|GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN)|GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN)|GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))==0x0000)
return -1; //如果X1到X4全為零則沒(méi)有按鍵按下
else
{
delay_ms(5); //延時(shí)5ms去抖動(dòng)
if((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN)|GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN)|GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN)|GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))==0x0000)
return -1;
}
GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
GPIO_SetBits(X4_GPIO_PORT,X4_GPIO_PIN);
Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
KeyVal='*';
if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
KeyVal=0;
if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
KeyVal='D';
if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
KeyVal='#';
while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
//等待按鍵釋放
GPIO_SetBits(X1_GPIO_PORT,X1_GPIO_PIN);
GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
KeyVal=1;
if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
KeyVal=2;
if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
KeyVal=3;
if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
KeyVal='A';
while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
GPIO_SetBits(X2_GPIO_PORT,X2_GPIO_PIN);
GPIO_ResetBits(X3_GPIO_PORT,X3_GPIO_PIN);
GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
KeyVal=4;
if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
KeyVal=5;
if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
KeyVal=6;
if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
KeyVal='B';
while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
GPIO_ResetBits(X1_GPIO_PORT,X1_GPIO_PIN);
GPIO_ResetBits(X2_GPIO_PORT,X2_GPIO_PIN);
GPIO_SetBits(X3_GPIO_PORT,X3_GPIO_PIN);
GPIO_ResetBits(X4_GPIO_PORT,X4_GPIO_PIN);
Y1=GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN);Y2=GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN);
Y3=GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN);Y4=GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN);
if(Y1==1&&Y2==0&&Y3==0&&Y4==0)
KeyVal=7;
if(Y1==0&&Y2==1&&Y3==0&&Y4==0)
KeyVal=8;
if(Y1==0&&Y2==0&&Y3==1&&Y4==0)
KeyVal=9;
if(Y1==0&&Y2==0&&Y3==0&&Y4==1)
KeyVal='C';
while(((GPIO_ReadInputDataBit(Y1_GPIO_PORT,Y1_GPIO_PIN))|(GPIO_ReadInputDataBit(Y2_GPIO_PORT,Y2_GPIO_PIN))|(GPIO_ReadInputDataBit(Y3_GPIO_PORT,Y3_GPIO_PIN))|(GPIO_ReadInputDataBit(Y4_GPIO_PORT,Y4_GPIO_PIN))) > 0);
return KeyVal;
}
/************************************
按鍵表盤為: 1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
************************************/
void Key_Test(void)
{
int num;
num = Key_Scan();
switch(num)
{
case 0: printf("0\n"); break;
case 1: printf("1\n"); break;
case 2: printf("2\n"); break;
case 3: printf("3\n"); break;
case 4: printf("4\n"); break;
case 5: printf("5\n"); break;
case 6: printf("6\n"); break;
case 7: printf("7\n"); break;
case 8: printf("8\n"); break;
case 9: printf("9\n"); break;
case 'A': printf("A\n"); break;
case 'B': printf("B\n"); break;
case 'C': printf("C\n"); break;
case 'D': printf("D\n"); break;
case '#': printf("#\n"); break;
case '*': printf("*\n"); break;
}
}
復(fù)制代碼
代碼下載:
代碼Keil.7z
(182.25 KB, 下載次數(shù): 21)
2021-9-7 23:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久综合激情
|
香蕉视频免费看
|
av网站免费在线观看
|
欧美性猛交xxxx免费看久久久
|
黄色福利
|
亚洲视频在线播放
|
欧洲av网站
|
中国特级毛片
|
精品欧美一区二区三区久久久
|
国产理论片
|
在线观看国产小视频
|
欧美视频在线观看一区
|
在线观看黄网站
|
欧美日韩精品一区二区三区
|
91看片在线
|
国产三级视频在线播放
|
国产无遮挡又黄又爽免费网站
|
九九热在线观看视频
|
99热1
|
日韩视频在线观看免费
|
久操av在线
|
日韩黄色免费视频
|
在线播放亚洲
|
国产精品一区三区
|
欧美日韩四区
|
日韩一区不卡
|
天天操天
|
日本在线不卡视频
|
一区二区三区国产精品
|
亚洲精品视频免费
|
国产精品免费av
|
欧美精品一区二区三区四区
|
永久免费av网站
|
欧美国产日韩一区二区
|
精品自拍视频
|
日韩在线视频免费
|
亚洲啊v
|
中文字幕av在线播放
|
国产成人99久久亚洲综合精品
|
国产在线视频一区
|
亚洲自拍偷拍视频
|