python 网站开发代码,天津建设工程信息网登录不了,网站建设内容模板,嘉兴网站模板建站这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑#xff08;1#xff09;主函数编辑#xff08;2#xff09;LED IO初始化函数(LED_Init())#xff08;3#xff09;开发板矩阵键盘IO初始化#xff08;ExpKeyBordInit()#xff09;… 这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑1主函数编辑2LED IO初始化函数(LED_Init())3开发板矩阵键盘IO初始化ExpKeyBordInit()3开发板矩阵按键LED控制ExpKeyBordInit()4键盘IOPE12-PE15设置为输入模式函数(KeyBordSetIn())5键盘IOPE8-PE11设置为输出模式函数(KeyBordSetOut())6矩阵键盘行列读写操作函数(GPIO_KEY_RW())7矩阵键盘键值扫描函数(KeyBoardScan()) 3、宏定义1源文件添加头文件2按键头文件编辑 4、知识链接1GPIO_SetBits()2GPIO_ResetBits()3GPIO_ReadOutputData()4GPIO_ReadInputData() 5、工程测试 STM32资料包 百度网盘下载链接链接https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码8888 一、任务描述 二、任务实施
观察电路图DK1-DK16按键有按下PE8 - PE11端口下拉输入PE12-PE15输出按键按下从而组合成16种控制led灯。 参考排列组合如同KE1按下时PE8为与PE12导通。
1、SingleKey工程文件夹创建
步骤1复制工程模板“1_Template”重命名为“4_KeyBoard” 步骤2修改项目工程名先删除projects文件夹内除了Template.uvprojx文件外的所有内容并修改为“KeyBoard.uvprojx”。并删除output/obj和output/lst中的所有文件。 步骤3运行“KeyBoard.uvprojx”打开目标选项“Options for Target”中的“Output”输出文件并修改可执行文件名称为“KeyBoard”点击“OK”保存设置。最后点击“Rebuild”编译该工程生成KeyBoard文件。 步骤4复制“2_LEDTest”中的1_LED文件复制到hardware中。 步骤5新建“2_KeyBoard”文件并在该文件夹下新建“KeyBoard.c”和“KeyBoard.h”两个文件。 步骤6工程组文件中添加“led.c”和“KeyBoard.c”文件。 步骤7目标选项添加添加头文件路径
2、函数编辑
1主函数编辑 步骤1端口初始化准备 //函数初始化端口准备delay_init(); //启动滴答定时器延时函数LED_Init(); //板载LED初始化ExpKeyBordInit(); //开发板按键初始化步骤2循环工作代码编辑读取按键并判断按键模式按下则点亮led灯否则LED灯熄灭 while(1){KeyValue ExpKeyScan(0);switch(KeyValue){case 1:LED_MODE1(KeyValue);break;case 2:LED_MODE1(KeyValue);break;case 3:LED_MODE1(KeyValue);break;case 4:LED_MODE1(KeyValue);break;case 5:LED_MODE1(KeyValue);break;case 6:LED_MODE1(KeyValue);break;case 7:LED_MODE1(KeyValue);break;case 8:LED_MODE1(KeyValue);break;case 9:LED_MODE1(KeyValue);break;case 10:LED_MODE1(KeyValue);break;case 11:LED_MODE1(KeyValue);break;case 12:LED_MODE1(KeyValue);break;case 13:LED_MODE1(KeyValue);break;case 14:LED_MODE1(KeyValue);break;case 15:LED_MODE1(KeyValue);break;case 16:LED_MODE1(KeyValue);break;}}2LED IO初始化函数(LED_Init())
/*********************************************************************Function : 开发板LED IO初始化Parameter : N/A Return : N/A
**********************************************************************/
void ExpLEDInit(void)
{GPIO_InitTypeDef GPIO_InitStructure; // 定义 GPIO 初始化结构体变量/* 时钟使能 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟/* 引脚配置 */ GPIO_InitStructure.GPIO_Pin LED_ALL; // D1-D8-PA0-PA7 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 设置引脚为推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚的输出速度为 50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 应用以上配置到 GPIOA 上GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭
}3开发板矩阵键盘IO初始化ExpKeyBordInit()
初始化PE8 - PE15端口并为推挽输出。
/*********************************************************************Function : 矩阵键盘IO初始化Parameter : None Return : None
**********************************************************************/
void ExpKeyBordInit(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);/*引脚配置*/GPIO_InitStructure.GPIO_Pin KEY_ALL; // 将开发板四个按键连接到PE8~PE15GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//设置 GPIO 输出速度为 50MHzGPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOE, GPIO_InitStructure); /*引脚初始电平设置*/GPIO_SetBits(GPIOE,KEY_ALL);
}3开发板矩阵按键LED控制ExpKeyBordInit()
初始化PE8 - PE15端口并为推挽输出。
/*********************************************************************Function : 开发板矩阵按键LED控制Parameter : KeyValue矩阵按键状态 每一位表示一个矩阵按键的状态每位按键对于相应led模式Return : N/A
**********************************************************************/
void LED_MODE1(uint32_t KeyValue)
{switch(KeyValue){case 1:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED1 0;delay_ms(1000);break;case 2:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED2 0;delay_ms(1000);break;case 3:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED3 0;delay_ms(1000);break;case 4:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED4 0;delay_ms(1000);break;case 5:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED5 0;delay_ms(1000);break;case 6:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED6 0;delay_ms(1000);break;case 7:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED7 0;delay_ms(1000);break;case 8:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED8 0;delay_ms(1000);break;case 9:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED1 0;LED2 0;delay_ms(1000);break;case 10:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED3 0;LED4 0;delay_ms(1000);break;case 11:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED5 0;LED6 0;delay_ms(1000);break;case 12:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭LED7 0;LED8 0;delay_ms(1000);break;case 13:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭delay_ms(1000);break;case 14:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭for(int i 0;i 8;i){PAout(i) 0;delay_ms(500);}for(int i 0;i 8;i){PAout(i) 1;delay_ms(500);}break;case 15:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平使得开发板 LED 灭break;}} 4键盘IOPE12-PE15设置为输入模式函数(KeyBordSetIn())
将指定的 GPIO 引脚设置为输入模式并启用下拉输入。
/*********************************************************************Function : 键盘IO设置为输入模式Parameter : KEYIO 要设置的IOReturn : N/A
**********************************************************************/
void KeyBordSetIn(uint16_t KEYIO)
{GPIO_InitTypeDef GPIO_InitStructure;/*时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);/*引脚配置*/GPIO_InitStructure.GPIO_Pin KEYIO; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPD; //下拉输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOE, GPIO_InitStructure);
}5键盘IOPE8-PE11设置为输出模式函数(KeyBordSetOut())
将指定的 GPIO 引脚设置为输入模式并启用下拉输入
/*********************************************************************Function : 键盘IO设置为输出模式Parameter : KEYIO 要设置为输出模式的GPIO引脚Return : N/A
**********************************************************************/
void KeyBordSetOut(uint16_t KEYIO)
{GPIO_InitTypeDef GPIO_InitStructure;/* 使能GPIOE时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);/* 配置引脚为输出模式 */GPIO_InitStructure.GPIO_Pin KEYIO; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOE, GPIO_InitStructure);
}6矩阵键盘行列读写操作函数(GPIO_KEY_RW())
从矩阵键盘中读取按键状态通过设置特定的 GPIO 引脚为输入或输出模式并根据参数设置写入行或列并且根据读取的输入和输出数据返回一个表示按键状态的字节值
/*********************************************************************Function : 矩阵键盘行列读写操作Parameter : ReadIo 读输入的IOWirteIo 写输出的IOReturn : 行列IO输出状态
**********************************************************************/
uint8_t GPIO_KEY_RW(uint16_t ReadIo,uint16_t WirteIo)
{uint16_t Wdata0,Rdata0; //写KeyBordSetOut(KEY_ALL); //设置IOif(WirteIo0x0f00)GPIO_SetBits(GPIOE,KEY_LINE); //写行 else GPIO_ResetBits(GPIOE,KEY_LIST); //写列 Wdata GPIO_ReadOutputData(GPIOE); //读输出 Wdata WirteIo; //取有效区域//读KeyBordSetIn(ReadIo); //设置IO Rdata GPIO_ReadInputData(GPIOE); //读输入Rdata ReadIo; //取有效区域//状态返回 Rdata | Wdata; //合并两次读取的数据return (uint8_t)(Rdata8); //移位返回
}7矩阵键盘键值扫描函数(KeyBoardScan())
扫描矩阵键盘的按键状态通过检测行列按键的组合来确定按下的具体按键并在按键按下后进行一定的延时消抖处理最终返回表示按键值的一个字节。
/*********************************************************************Function : 矩阵键盘键值扫描Parameter : N/AReturn : 键值
**********************************************************************/
uint8_t KeyBoardScan(void)
{uint8_t KeyValue0,Key0;uint8_t a 0;if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!0x0f) //读取按键是否按下{delay_ms(10);//延时10ms进行消抖if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!0x0f)//再次检测键盘是否按下{//测试列Key GPIO_KEY_RW(KEY_LIST,KEY_LINE);switch(Key){case(0x1F): KeyValue1;break;//1列case(0x2F): KeyValue2;break;//2列case(0x4F): KeyValue3;break;//3列case(0x8F): KeyValue4;break;//4列}//测试行Key GPIO_KEY_RW(KEY_LINE,KEY_LIST);switch(Key){case(0x0E): KeyValueKeyValue;break; //1行case(0x0D): KeyValueKeyValue4;break; //2行case(0x0B): KeyValueKeyValue8;break; //3行case(0x07): KeyValueKeyValue12;break;//4行}//松手检测 while((a50)(Key!0x00)) {delay_ms(5);Key GPIO_KEY_RW(KEY_LINE,KEY_LIST);a1;} }}return KeyValue;
} 3、宏定义
1源文件添加头文件
步骤1按键功能文件中添加相关头文件源文件报错消失部分
#include stm32f10x_gpio.h
#include stm32f10x_rcc.h
#include .\delay\delay.h
#include SingleKey.h步骤2主函数添加所需的led和KeyBoard头文件主源文件部分报错消失
/***********Hardweare***************/
#include led.h
#include KeyBoard.h2按键头文件编辑
点击编译显示报错 步骤1创建一个宏定义保护
#ifndef _SINGLEKEY_H
#define _SINGLEKEY_H#endif步骤2添加宏定义
/******************矩阵键盘IO预定义********************/
#define KEY_LINE GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 //行#define KEY_LIST GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 //列#define KEY_ALL GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | \GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 //行和列
//行列操作定义
#define RLine_WList 0 //读行写列
#define RList_WLine 1 //读列写行步骤3添加函数声明
void ExpKeyBordInit(void); //矩阵键盘IO初始化
uint8_t KeyBoardScan(void); // 矩阵键盘键值扫描步骤4添加数据类型和宏的头文件
#include stdint.h
//键值枚举
enum KeyBoard
{KEY_NO0,KEY_K1,KEY_K2,KEY_K3,KEY_K4,KEY_K5,KEY_K6,KEY_K7,KEY_K8,KEY_K9,KEY_K10,KEY_K11,KEY_K12,KEY_K13,KEY_K14,KEY_K15,KEY_K16
};4、知识链接
1GPIO_SetBits()
将指定的 GPIO 引脚设置为高电平或逻辑“1”状态
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);2GPIO_ResetBits()
将指定的 GPIO 引脚设置为低电平或逻辑“0”状态
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);3GPIO_ReadOutputData()
这个函数用于读取配置为输出的 GPIO通用输入/输出引脚的当前状态。换句话说它读取当前从配置为输出的 GPIO 引脚驱动出去的数据。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);GPIOx指定要读取输出数据的 GPIO 端口如 GPIOA、GPIOB 等
4GPIO_ReadInputData()
相反这个函数用于读取配置为输入的 GPIO 引脚的当前状态。它读取当前在配置为输入的 GPIO 引脚上检测到的数据。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);GPIOx指定要读取输出数据的 GPIO 端口如 GPIOA、GPIOB 等
5、工程测试