当前位置: 首页 > news >正文

库函数版独立按键用位运算方式实现(STC8)

位运算:更加简便,单片机的内存就小,占的内存空间小一点

在这里插入图片描述

案例:

#include    "GPIO.h"
#include	"Delay.h"
#include 	"UART.h"	// 串口配置 UART_Configuration
#include 	"NVIC.h"	// 中断初始化NVIC_UART1_Init
#include 	"Switch.h"  // 引脚切换 UART1_SW_P30_P31// 宏定义按键
#define     KEY1    P51
#define     KEY2    P52
#define     KEY3    P53
#define     KEY4    P54
// 按下抬起状态宏
#define     DOWN    0
#define     UP      1/*
位运算:节省内存      抬起是1  按下是0
u8 last_state = 0x0f;  // 0b0000 11110x0f b3   b2  b1  b0   第几位0b0000  1    1   1   1 k4   k3  k2  k1   标志第几个按键如何知道第1个按键是按下还是抬起,取出第0位
如果第0位是1,那么第1个按键是抬起
如果第0位是0,那么第1个按键是按下如何设置第1个按键为按下或抬起,给第0位置0或置1
设置第1个按键为抬起, 给第0位置1
设置第1个按键为按下, 给第0位置0
*/
// 位运算:节省内存      抬起是1  按下是0
u8 last_state = 0x0f;  // 0b0000 111// 宏定义的函数
#define     IS_KEY_UP(i)      ((last_state >> i & 1) == 1)
#define     IS_KEY_DOWN(i)    ((last_state >> i & 1) == 0)
#define     SET_KEY_UP(i)     (last_state |= (1 << i))
#define     SET_KEY_DOWN(i)   (last_state &= ~(1 << i))void GPIO_config() { GPIO_InitTypeDef info;// ===== UART1  P30  P31  准双向info.Mode = GPIO_PullUp; 				// 准双向info.Pin = GPIO_Pin_0 | GPIO_Pin_1;   	// 引脚GPIO_Inilize(GPIO_P3, &info);//准双向口	P51 P52 P53 P54P5_MODE_IO_PU(GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
}// 串口配置函数的定义
void UART_config(void) {// >>> 记得添加 NVIC.c, UART.c, UART_Isr.c <<<COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}void main() {EA = 1; // 使能中断总开关GPIO_config(); // GPIO配置UART_config(); // 串口配置while (1){// =================KEY1===============// 上一次和当前不同,才能进入条件if (IS_KEY_UP(0) && KEY1 == DOWN) { // 上一次是抬起,当前是按下,按下才有效SET_KEY_DOWN(0); // 上一次状态需要更新printf("key1按下\n");} else if (IS_KEY_DOWN(0) && KEY1 == UP) { // 上一次是按下,当前是抬起,抬起才有效SET_KEY_UP(0); // 上一次状态需要更新printf("key1抬起\n");}// =================KEY2===============// 上一次和当前不同,才能进入条件if (IS_KEY_UP(1) && KEY2 == DOWN) { // 上一次是抬起,当前是按下,按下才有效SET_KEY_DOWN(1); // 上一次状态需要更新printf("key2按下\n");} else if (IS_KEY_DOWN(1) && KEY2 == UP) { // 上一次是按下,当前是抬起,抬起才有效SET_KEY_UP(1); // 上一次状态需要更新printf("key2抬起\n");}// =================KEY3===============// 上一次和当前不同,才能进入条件if (IS_KEY_UP(2) && KEY3 == DOWN) { // 上一次是抬起,当前是按下,按下才有效SET_KEY_DOWN(2); // 上一次状态需要更新printf("key3按下\n");} else if (IS_KEY_DOWN(2) && KEY3 == UP) { // 上一次是按下,当前是抬起,抬起才有效SET_KEY_UP(2); // 上一次状态需要更新printf("key3抬起\n");}// =================KEY4===============// 上一次和当前不同,才能进入条件if (IS_KEY_UP(3) && KEY4 == DOWN) { // 上一次是抬起,当前是按下,按下才有效SET_KEY_DOWN(3); // 上一次状态需要更新printf("key4按下\n");} else if (IS_KEY_DOWN(3) && KEY4 == UP) { // 上一次是按下,当前是抬起,抬起才有效SET_KEY_UP(3); // 上一次状态需要更新printf("key4抬起\n");}delay_ms(50); // 适当的延时,很有必要的,作用1:去抖动}  
}
http://www.dtcms.com/a/321210.html

相关文章:

  • Array Description(Dynamic programming)
  • 【网络编程】IO多路转接——epoll
  • Java文件读写(IO、NIO)
  • 第39周——训练自己的数据集
  • 汇编语言和高级语言的差异
  • BGP综合实验练习作业
  • Fabarta个人专属智能体:三维搜索链+动态大纲重构教材开发范式
  • Omron(欧姆龙)SysmacStudio软件下载,定期更新(最新更新到1.63升级包)
  • npm run 常见脚本
  • BGP协议笔记
  • 【新启航】航空飞机起落架深孔型腔的内轮廓测量方法探究 - 激光频率梳 3D 轮廓检测
  • 2025华数杯数学建模A题【 多孔膜光反射性能的优化与控制】原创论文讲解(含完整python代码)
  • 避免“卡脖子”!如何减少内存I/O延迟对程序的影响?
  • 机器学习——支持向量机(SVM)实战案例
  • 操作系统-实验-进程
  • 机器学习之支持向量机(原理)
  • svm的一些应用
  • 怎么查看Linux I2C总线挂载了那些设备?
  • springboot整合rabbitMQ的示例
  • Elasticsearch:在向量搜索中使用 Direct IO
  • 解码华为云安全“铁三角”:用“分层防御”化解安全挑战
  • 微软披露Exchange Server漏洞:攻击者可静默获取混合部署环境云访问权限
  • 企业AI的双层技术栈架构:融合社区创新与企业级管控的设计蓝图
  • Git 使用场景笔记
  • DuoPlus支持导入文件批量配置云手机参数,还优化了批量操作和搜索功能!
  • 数据结构--哈希表
  • QAGenerationChain从知识库生成大模型应用测试的问题对
  • LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串
  • 【uni-app】解决在 h5 环境下会出现双标题问题
  • 内核的调试和优化