久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
stm32不連續(xù)IO口矩陣鍵盤的源碼
[打印本頁(yè)]
作者:
zlkj
時(shí)間:
2018-5-29 22:14
標(biāo)題:
stm32不連續(xù)IO口矩陣鍵盤的源碼
不連續(xù)IO口矩陣鍵盤
單片機(jī)源程序如下:
#include "pkey.h"
#include "delay.h"
#include "sys.h"
void HardwareInit(void);
int main(void)
{
HardwareInit();
while(1)
{
GetKeyVal();
}
}
void HardwareInit(void)
{
uart_init(9600); //串口,便于觀察
Key_Config(); //按鍵初始化
delay_init(); //延時(shí)函數(shù)
}
復(fù)制代碼
#include "pkey.h"
#include "delay.h"
#include "sys.h"
/**
** PB5-PB8,列,輸出。 PB10-PB14,行,輸入
**/
void Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
/********4行輸出*********/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/********4列輸入*********/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int KeyScan(void)
{
uchar KeyVal;
GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1C00)); //不管其余12位0xf0ff,先讓PC10到PC12全部輸出高。
GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000)); //不管其余12位0xf0ff,先讓PA15輸出高。
if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000) //如果PB12到PB15全為零則沒有按鍵按下
return -1;
else
{
delay_ms(5); //延時(shí)5ms去抖動(dòng)
if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000)
return -1;
}
GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0000)); //不管其余12位0xf0ff,先讓PC10到PC12全部輸出高。
GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000)); //不管其余12位0xf0ff,先讓PA15輸出高。
switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)) //第一行,由低到高,同理,不贅述
{
case 0x0004: KeyVal=13; break;
case 0x0008: KeyVal=12; break;
case 0x0010: KeyVal=11; break;
case 0x0020: KeyVal=10; break;
}
while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0); //等待按鍵釋放
GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0400)); //不管其余12位0xf0ff,先讓PC10到PC12全部輸出高。
GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先讓PA15輸出高。
switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
{
case 0x0004: KeyVal=14; break;
case 0x0008: KeyVal=9; break;
case 0x0010: KeyVal=6; break;
case 0x0020: KeyVal=3; break;
}
while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0800)); //不管其余12位0xf0ff,先讓PC10到PC12全部輸出高。
GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先讓PA15輸出高。
switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
{
case 0x0004: KeyVal=0; break;
case 0x0008: KeyVal=8; break;
case 0x0010: KeyVal=5; break;
case 0x0020: KeyVal=2; break;
}
while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1000)); //不管其余12位0xf0ff,先讓PC10到PC12全部輸出高。
GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000)); //不管其余12位0xf0ff,先讓PA15輸出高。
switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))
{
case 0x0004: KeyVal=15; break;
case 0x0008: KeyVal=7; break;
case 0x0010: KeyVal=4; break;
case 0x0020: KeyVal=1; break;
}
// printf("%#x\n ",(GPIOB->IDR & 0x0038));
// printf("%#x\n ",(GPIOD->IDR & 0x0004));
// //printf("%#x\n ",(GPIOD->IDR & 0x0004)|(GPIOB->IDR & 0x0038));
while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004) > 0);
return KeyVal;
}
/************************************
按鍵表盤為: 0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
************************************/
void GetKeyVal(void)
{
int num;
num = KeyScan();
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 10: printf("10\n"); break;
case 11: printf("11\n"); break;
case 12: printf("12\n"); break;
case 13: printf("13\n"); break;
case 14: printf("14\n"); break;
case 15: printf("15\n"); break;
}
}
復(fù)制代碼
所有資料51hei提供下載:
不連續(xù)IO口矩陣鍵盤.rar
(281.38 KB, 下載次數(shù): 26)
2018-5-29 23:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩久久一区
|
成年人视频在线播放
|
在线观看日韩视频
|
毛片一级片
|
国产日韩综合
|
av片在线观看
|
黄色大片av
|
夜夜夜夜操
|
日本天堂在线
|
午夜国产一区
|
成人黄色一级片
|
91视频在线
|
成人在线视频播放
|
亚洲精品久久久久
|
欧美综合在线视频
|
国产欧美综合一区二区三区
|
天天干天天插
|
国产精品一区二区三区不卡
|
黑人精品一区二区
|
五月天一区二区三区
|
福利小视频
|
在线观看中文字幕码
|
瑟瑟视频在线观看
|
国产在线不卡视频
|
日韩欧美在线观看视频
|
中文字幕伊人
|
免费看的毛片
|
日本视频在线免费观看
|
黄色小视频免费观看
|
激情小说五月天
|
男人影院在线观看
|
成人性色生活片
|
性爱视频日本
|
av片在线看
|
欧美8888
|
91午夜精品亚洲一区二区三区
|
97精品在线
|
免费成人深夜夜行网站
|
婷婷导航
|
手机在线免费看av
|
欧美一级淫片免费视频魅影视频
|