为什么九齐单片机中不能使用bit?

如果开发环境不支持bit 定义static unsigned char task_720ms_flag = 0;还可以用什么方式替代bit定义标志,使其占用内存空间小。

如果开发环境不支持位定义,可以使用 unsigned char 的多个状态位来替代。可以将多个标志合并到一个 unsigned char 中,每个标志使用一个特定位。例如:

static unsigned char task_flags = 0; // 使用一个字节来存储多个标志// 定义标志位
#define TASK_5MS_FLAG    (1 << 0)
#define TASK_10MS_FLAG   (1 << 1)
#define TASK_30MS_FLAG   (1 << 2)
#define TASK_50MS_FLAG   (1 << 3)
#define TASK_100MS_FLAG  (1 << 4)
#define TASK_720MS_FLAG  (1 << 5)// 设置标志
task_flags |= TASK_720MS_FLAG;// 清除标志
task_flags &= ~TASK_720MS_FLAG;// 检查标志
if (task_flags & TASK_720MS_FLAG) {// 标志已设置
}

这样可以在一个字节中存储多个标志,节省内存空间。

task_flags |= TASK_720MS_FLAG; 这个操作会将 TASK_720MS_FLAG 对应的位设置为1,而不改变其他位的值。因此,如果 task_flags 最开始是0,经过这条语句后,TASK_720MS_FLAG 所对应的位将变为1,其他位保持不变。

例如,如果 TASK_720MS_FLAG 定义为 0x20(即二进制的 0010 0000),那么:

  • 初始值 task_flags = 0x00(所有位为0)
  • 执行后 task_flags = 0x20(第6位变为1)

如果 task_flags 已经有其他位为1,|= 操作会将对应的位设置为1,而保留其他位的状态。


在这里插入图片描述

/* =========================================================================*  Project:       Timer Interrupt & WDT Interrupt*  File:          main.c*  Description:   Set Timer0、Timer1、WDT Interrupt*                 1. FINST = 4MHz/4T(I_HRC)*                 2. Timer0 overflow interrupt flag bit will be set every 2048us then toggle PB0 output state  (2048us = 1us*256*8)*                 3. Timer1 underflow interrupt flag bit will be set every 1024us then toggle PB1 output state  (1024us = 1us*256*4)*                 4. WDT timeout interrupt flag bit will be set every 3.5ms then toggle PB2 output state*                    4.1  Set project options : WDT Time Base = 3.5ms**  Author:        JasonLee*  Version:       V1.0*  Date:          2017/11/08=========================================================================*/#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)	__asm__("MOVR _" #x ",F")//PB0 -- 转灯
//PB1 -- 位置灯
//PB2 -- 转灯信号#define TURN_LIGHT_O PB0
#define POSIT_LIGHT_O PB1
#define TURN_SINGLE_I PB2static unsigned long  low_time = 0;  // 用于记录低电平持续时间
static unsigned char task_flags = 0;#define task_5ms_flag    (1 << 0)
#define task_10ms_flag   (1 << 1)
#define task_30ms_flag   (1 << 2)
#define task_50ms_flag   (1 << 3)
#define task_100ms_flag  (1 << 4)
#define task_720ms_flag  (1 << 5)
#define Left_Turn_Flag   (1 << 6)void Single_Scan(void) {//static unsigned long  low_time = 0;  // 用于记录低电平持续时间if (PORTBbits.PB2 == 0) {  // 检测到低电平if (low_time < 1000) {low_time++;  // 增加计时}// delay_ms(2);  // 2ms 延时if ((TURN_SINGLE_I == 0) && (low_time >= 500)) {  // 超过 1s 且 LED 关闭// Left_Turn_Flag = 0;task_flags &= ~Left_Turn_Flag;TURN_LIGHT_O = 0;POSIT_LIGHT_O = 1;}} else {  // 检测到高电平low_time = 0;  // 重置计时task_flags |= Left_Turn_Flag;// Left_Turn_Flag = 1;POSIT_LIGHT_O = 0;}
}//! interrupt service routine
void isr(void) __interrupt(0) {static unsigned char count_5ms = 0;static unsigned char count_10ms = 0;static unsigned char count_100ms = 0;static unsigned char count_720ms = 0;if(INTFbits.T1IF) {count_5ms++;if (count_5ms >= 5) {count_5ms = 0;// task_5ms_flag = 1;task_flags |= task_5ms_flag;}// 100ms任务count_100ms++;if (count_100ms >= 100) {count_720ms++;count_100ms = 0;// task_100ms_flag = 1;task_flags |= task_100ms_flag;if(count_720ms >= 144) {count_720ms = 0;// task_720ms_flag = 1;task_flags |= task_720ms_flag;}}// 50ms任务if (count_100ms % 50 == 0) {// task_50ms_flag = 1;task_flags |= task_50ms_flag;}// 30ms任务if (count_100ms % 30 == 0) {// task_30ms_flag = 1;task_flags |= task_30ms_flag;}// 10ms任务count_10ms++;if (count_10ms >= 10) {count_10ms = 0;// task_10ms_flag = 1;task_flags |= task_10ms_flag;}//PORTB ^= (1<<1);					// PB1 ToggleINTF= (unsigned char)~(C_INT_TMR1);	// Clear T1IF flag bit}if(INTFbits.T0IF) {Single_Scan();////PORTB ^= 1;							// PB0 ToggleINTF= (unsigned char)~(C_INT_TMR0);	// Clear T0IF flag bit}if(INTFbits.WDTIF) {//PORTB ^= (1<<2);					// PB2 ToggleINTF= (unsigned char)~(C_INT_WDT);	// Clear WDTIF flag bit}}void main(void) {unsigned char R_shift_regl = 0xFF;
//;Initial GPIOIOSTB =  C_PB2_Input;	// Set PB2 to input mode,others set to output mode//IOSTB =  C_PB5_Input | C_PB4_Input | C_PB3_Input;     // Set PB0 & PB1 to input mode,others set to output mode//PORTB = 0x07;                           // PB0、PB1 & PB2 are output HighPORTB = 0x00;                           // LOWDISI();
//;Initial Timer0PCON1 = C_TMR0_Dis;						// Disable Timer0TMR0 = 0;								// Load 0x00 to TMR0 (Initial Timer0 register)T0MD = C_PS0_TMR0 | C_PS0_Div8 ;		// Prescaler0 is assigned to Timer0, Prescaler0 dividing rate = 1:8,clock source is instruction clock//;--Initial WDT (if WDT needs prescaler0 dividing rate )--------------------------------------------------
//	T0MD = C_PS0_WDT						// Prescaler0 is assigned to WDT, Prescaler0 dividing rate = 1:2 (WDT select interrupt)
//;--------------------------------------------------------------------------------------------------------//;Initial Timer1TMR1 = 0xFF;							// Load 0xFF to TMR1 (Initial Timer1 register)T1CR1 = C_TMR1_Reload | C_TMR1_En;      // Enable Timer1, Initial value reloaded from TMR1, Non-stop modeT1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;	// Enable Prescaler1, Prescaler1 dividing rate = 1:4, Timer1 clock source is instruction clock//;Setting Interrupt Enable RegisterINTE = C_INT_WDT | C_INT_TMR1 | C_INT_TMR0;	// Enable Timer0、Timer1、WDT overflow interrupt//;Initial Power control registerPCON = C_WDT_En | C_LVR_En;				// Enable WDT ,  Enable LVR//;Enable Timer0 & Global interrupt bitPCON1 = C_TMR0_En;						// Enable Timer0ENI();									// Enable all unmasked interruptswhile(1) {if(task_flags & task_720ms_flag) {// task_720ms_flag = 0;task_flags &= ~task_720ms_flag;POSIT_LIGHT_O = 0;TURN_LIGHT_O = ~TURN_LIGHT_O;}if (task_flags & task_100ms_flag) {// task_100ms_flag = 0;task_flags &= ~task_100ms_flag;}if (task_flags & task_50ms_flag) {// task_50ms_flag = 0;task_flags &= ~task_50ms_flag;}if (task_flags & task_30ms_flag) {// task_30ms_flag = 0;task_flags &= ~task_30ms_flag;}if (task_flags & task_10ms_flag) {// task_10ms_flag = 0;task_flags &= ~task_10ms_flag;}if (task_flags & task_5ms_flag) {// task_5ms_flag = 0;task_flags &= ~task_5ms_flag;}}
}

在这里插入图片描述


在这里插入图片描述


/* =========================================================================*  Project:       Timer Interrupt & WDT Interrupt*  File:          main.c*  Description:   Set Timer0、Timer1、WDT Interrupt*                 1. FINST = 4MHz/4T(I_HRC)*                 2. Timer0 overflow interrupt flag bit will be set every 2048us then toggle PB0 output state  (2048us = 1us*256*8)*                 3. Timer1 underflow interrupt flag bit will be set every 1024us then toggle PB1 output state  (1024us = 1us*256*4)*                 4. WDT timeout interrupt flag bit will be set every 3.5ms then toggle PB2 output state*                    4.1  Set project options : WDT Time Base = 3.5ms**  Author:        JasonLee*  Version:       V1.0*  Date:          2017/11/08=========================================================================*/
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)	__asm__("MOVR _" #x ",F")//PB0 -- 转灯
//PB1 -- 位置灯
//PB2 -- 转灯信号#define TURN_LIGHT_O PB0
#define POSIT_LIGHT_O PB1
#define TURN_SINGLE_I PB2static unsigned long  low_time = 0;  // 用于记录低电平持续时间
static unsigned char Left_Turn_Flag = 0;
static unsigned long count_720ms = 0;
static unsigned char task_720ms_flag = 0;void Single_Scan(void) {//static unsigned long  low_time = 0;  // 用于记录低电平持续时间if (PORTBbits.PB2 == 0) {  // 检测到低电平if (low_time < 1000) {low_time++;  // 增加计时}// delay_ms(2);  // 2ms 延时if ((PORTBbits.PB2 == 0) && (low_time >= 500)) {  // 超过 1s 且 LED 关闭Left_Turn_Flag = 0;//TURN_LIGHT_O = 0;//POSIT_LIGHT_O = 1;}} else {  // 检测到高电平low_time = 0;  // 重置计时Left_Turn_Flag = 1;//POSIT_LIGHT_O = 0;}
}//! interrupt service routine
void isr(void) __interrupt(0) {if(INTFbits.T1IF) {count_720ms++;if(count_720ms >= 720) {count_720ms = 0;task_720ms_flag = 1;}//PORTB ^= (1<<1);					// PB1 ToggleINTF= (unsigned char)~(C_INT_TMR1);	// Clear T1IF flag bit}if(INTFbits.T0IF) {Single_Scan();//PORTB ^= 1;							// PB0 Toggle//TURN_LIGHT_O = PORTBbits.PB2;INTF= (unsigned char)~(C_INT_TMR0);	// Clear T0IF flag bit}if(INTFbits.WDTIF) {//PORTB ^= (1<<2);					// PB2 ToggleINTF= (unsigned char)~(C_INT_WDT);	// Clear WDTIF flag bit}}void main(void) {unsigned char R_shift_regl = 0xFF;
//;Initial GPIO//IOSTB =  C_PB5_Input | C_PB4_Input | C_PB3_Input;     // Set PB0 & PB1 to input mode,others set to output mode//PORTB = 0x07;                           // PB0、PB1 & PB2 are output HighIOSTB =  C_PB2_Input;PORTB = 0x00;DISI();
//;Initial Timer0PCON1 = C_TMR0_Dis;						// Disable Timer0TMR0 = 0;								// Load 0x00 to TMR0 (Initial Timer0 register)T0MD = C_PS0_TMR0 | C_PS0_Div8 ;		// Prescaler0 is assigned to Timer0, Prescaler0 dividing rate = 1:8,clock source is instruction clock//;--Initial WDT (if WDT needs prescaler0 dividing rate )--------------------------------------------------
//	T0MD = C_PS0_WDT						// Prescaler0 is assigned to WDT, Prescaler0 dividing rate = 1:2 (WDT select interrupt)
//;--------------------------------------------------------------------------------------------------------//;Initial Timer1TMR1 = 0xFF;							// Load 0xFF to TMR1 (Initial Timer1 register)T1CR1 = C_TMR1_Reload | C_TMR1_En;      // Enable Timer1, Initial value reloaded from TMR1, Non-stop modeT1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;	// Enable Prescaler1, Prescaler1 dividing rate = 1:4, Timer1 clock source is instruction clock//;Setting Interrupt Enable RegisterINTE = C_INT_WDT | C_INT_TMR1 | C_INT_TMR0;	// Enable Timer0、Timer1、WDT overflow interrupt//;Initial Power control registerPCON = C_WDT_En | C_LVR_En;				// Enable WDT ,  Enable LVR//;Enable Timer0 & Global interrupt bitPCON1 = C_TMR0_En;						// Enable Timer0ENI();									// Enable all unmasked interruptswhile(1) {if(task_720ms_flag) {task_720ms_flag = 0;if(Left_Turn_Flag) {POSIT_LIGHT_O = 0;//TURN_LIGHT_O = ~TURN_LIGHT_O;PORTB ^= 1;// PB0 Toggle} else {TURN_LIGHT_O = 0;POSIT_LIGHT_O = 1;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/453598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue - Element 选择器 el-select 既可以选择下拉又可以手动输入文本功能(手动输入的值只能是数字 并且支持4位小数)

Vue - Element 选择器 el-select 既可以选择下拉又可以手动输入文本功能&#xff08;手动输入的值只能是数字 并且支持4位小数&#xff09; 备注 filterable 下拉框开启快速搜索功能 no-match-text 当输入的内容在下拉框中找不到时&#xff1b;下拉框提示的文字 handFocus 触发…

软件测试快速入门:测试对象、过程模型、生命周期与测试用例

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

redis集群介绍

Redis集群是一种分布式存储系统&#xff0c;它通过将数据分散存储在多个Redis节点上来实现可扩展性和高可用性。每个节点都是一个独立的Redis服务器实例&#xff0c;它们通过网络相互连接&#xff0c;共同协作以提供数据服务。 在Redis集群中&#xff0c;数据被划分为多个槽&am…

【Vercel】Vercel静态部署踩坑

背景 在现代的软件开发中&#xff0c;自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台&#xff0c;提供了与GitHub的无缝集成&#xff0c;使得开发者能够在每次提交代码后自动触发部署流程。然而&#xff0c;自动化部署过程中可能会遇到一些挑战&#xff0…

自动化工具:Ansible

目录 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 三、安装部署Ansible 1、环境部署 2、管理节点安装 Ansible 3、查看Ansible相关文件 4、配置主机清单 5、免密管理 ssh-keygen 5.1、测试连通性 5.2、简洁输…

IPC通信-消息队列

使用消息队列实现两个进程的相互通信 #include<myhead.h>//定义结构体存储信息种类和信息正文 typedef struct {long mtype; //信息类型char mtext[128]; //信息正文 }msgbuf;//宏定义信息正文的大小 #define MESIZE sizeof(msgbuf)-sizeof(long)typedef struct sockad…

vscode:创建fastapi项目

1.选择py解释器 或者 uvicorn main:app --reload

java游戏网站源码

题目&#xff1a;java游戏网站源码 编号B22A390 主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Mysql|大数据|SSM|SpringBoot|Vue|Jsp|MYSQL等)、学习资料、JAVA源码、技术咨询 文末联系获取 感兴趣可以先收藏起来&#xff0c;以防走丢&#xff0c;有任何选题、文档编…

雷池WAF自动化实现安全运营实操案例终极篇

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中&#xff0c;archetype&#xff08;原型&#xff09;用来表示一个world里具有相同component类型组合的entity。也就是说&#xff0c;相同component类型的entity在Unity内部会存储到一起&#xff0c;共享同一个archetype。 使用这样的设…

React是如何工作的?

从编写组件到最后屏幕生成界面&#xff0c;如上图所示&#xff0c;我们现在需要知道的就是后面几步是如何运行的。 概述 这张图解释了 React 渲染过程的几个阶段&#xff1a; 渲染触发&#xff1a;通过更新某处的状态来触发渲染。渲染阶段&#xff1a;React 调用组件函数&…

智能优化算法-生物地理学算法(BBO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 生物地理学优化算法 (Biogeography-Based Optimization, BBO) 是一种基于生物地理学原理的元启发式优化算法&#xff0c;由Dan Simon于2008年提出。BBO通过模拟物种在不同栖息地之间的迁移过程来搜索最优解&…

Dongle Sentinal在Jenkins下访问不了的问题

背景&#xff1a; 工作站部署的jenkins的脚本无法正常打包&#xff0c;定位后发现是本地获取不了license&#xff0c;但是使用usb over network的远程license都能获取并正常打包 分析&#xff1a; 获取不了license的原因是本地无法识别dongle。根据提供信息&#xff0c;之前…

卡特兰数解释相关的样例以及补充例题

目录 拓展的场景分析 1.圆上连接线段 2.二叉树问题 3.多边形划分三角形问题 补充的例题 P1976 鸡蛋饼 P1722 矩阵 II 通过取模处理判断选择用哪个式子​编辑 P2532 [AHOI2012] 树屋阶梯 P3978 [TJOI2015] 概率论 拓展的场景分析 1.圆上连接线段 一个圆上有2*n个点&am…

nginx中的HTTP 负载均衡

HTTP 负载均衡&#xff1a;如何实现多台服务器的高效分发 为了让流量均匀分配到两台或多台 HTTP 服务器上&#xff0c;我们可以通过 NGINX 的 upstream 代码块实现负载均衡。 方法 在 NGINX 的 HTTP 模块内使用 upstream 代码块对 HTTP 服务器实施负载均衡&#xff1a; upstr…

基于微博评论的自然语言处理情感分析

目录 一、项目概述 二、需要解决的问题 三、数据预处理 1、词汇表构建&#xff08;vocab_creat.py&#xff09; 2、数据集加载&#xff08;load_dataset.py&#xff09; 四、模型构建&#xff08;TextRNN.py&#xff09; 1、嵌入层&#xff08;Embedding Layer&#xff…

Unity通过高德开放平台获取天气信息

一、注册高德开放平台账号&#xff0c;获取天气接口Key 1、构建自己的应用 网址&#xff1a;https://lbs.amap.com/api/webservice/guide/api/weatherinfo 最终调用api的地址形式&#xff1a; https://restapi.amap.com/v3/weather/weatherInfo?city110101&key<用户…

ionic Capacitor 生成 Android 应用

官方文档 https://ionic.nodejs.cn/developing/android/ https://capacitorjs.com/docs/getting-started 1、创建新的 Capacitor 应用程序 空目录下面 npm init capacitor/app2、install Capacitor npm install npm start在这里插入图片描述 3、生成dist目录 npm run buil…

华为eNSP:MAC地址漂移防止与检测

一、什么是MAC地址漂移&#xff1f; MAC地址漂移是指在计算机网络中&#xff0c;MAC&#xff08;Media Access Control&#xff09;地址被动态更改的现象。每个网络接口设备都有一个唯一的MAC地址&#xff0c;用来标识该设备在网络中的身份。然而&#xff0c;有些恶意软件或网…

15.JVM垃圾收集算法

一、垃圾收集算法 1.分代收集理论 分代收集理论是JAVA虚拟机进行垃圾回收的一种思想&#xff0c;根据对象存活周期的不同将内存分成不同的几个区域&#xff1b;一般将JAVA堆内存分为新生代和老年代&#xff1b;根据每个分代特点选择不同的垃圾收集器&#xff1b; 在新生代中&am…