登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
代码拉取完成,页面将自动刷新
开源项目
>
工业软件
>
智能硬件
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
21
Star
129
Fork
57
ECBM工作室
/
STC8-BOOTLOADER-TINY
代码
Issues
2
Pull Requests
0
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
汇编的延时函数
待办的
#I4A1T1
Lee8871
创建于
2021-09-14 19:21
汇编文件如下: ---------------------- ```asm NAME delay_20tick_asm PUBLIC _delay_20tick ;C语言函数在Keil中对应的 段名 前面会多一个下划线 DE SEGMENT CODE ;DE定义为一个 RSEG DE _delay_20tick: SJMP check ;进来就跳转到Check函数,这样传入的参数为0就会直接退出。 subb_num: CLR C ;因为后面要用到带进位减法 MOV A,R4 SUBB A,#1 ;R4既最低位减1,此时如果发生借位,C变为1 MOV R4,A MOV A,R5 SUBB A,#0 ;R5减去0,同时减去了借位C MOV R5,A MOV A,R6 SUBB A,#0 ;R6减去0,同时减去了借位C MOV R6,A MOV A,R7 SUBB A,#0 ;R7减去0,同时减去了借位C MOV R7,A check: MOV A,R4 ORL A,R5 ORL A,R6 ORL A,R7 ;将A计算为R4到R7的按位或,如果这些值都等于0,或的结果就是0 JNZ subb_num ;如果A不是0,就跳转到subb_num RET ;在STC8下,整个循环的时间为 1 + 12+ 4+ 3 = 20机器周期 ; 清C 4次减法 或 跳转(成功时) END ``` 在C语言中写 ---------------------- ```c #define F_CPU 24000000ul #ifndef F_CPU #error "F_CPU is not defined !" #endif extern void delay_20tick(long int us); #define delayMs(ms) delay_20tick((long int)(ms * (F_CPU/(20.0*1000.0)))) //20.0就汇编每周期的Tick数 void main(void){ delayMs(20); } ``` 实验 --------------------  用Keil的软件仿真测试(没有烧单片机测试)但是同样的函数在IAR烧写过单片机测试。  可以看到调用的数据是正确的,(不过反汇编自动解析成了别的数字) 注意如果换成别的MCU比如STC12或者STC15,汇编语句的完成时间是不同的,就要改这个数字: ```c #define delayMs(ms) delay_20tick((long int)(ms * (F_CPU/(20.0*1000.0)))) ^^^^ ```
汇编文件如下: ---------------------- ```asm NAME delay_20tick_asm PUBLIC _delay_20tick ;C语言函数在Keil中对应的 段名 前面会多一个下划线 DE SEGMENT CODE ;DE定义为一个 RSEG DE _delay_20tick: SJMP check ;进来就跳转到Check函数,这样传入的参数为0就会直接退出。 subb_num: CLR C ;因为后面要用到带进位减法 MOV A,R4 SUBB A,#1 ;R4既最低位减1,此时如果发生借位,C变为1 MOV R4,A MOV A,R5 SUBB A,#0 ;R5减去0,同时减去了借位C MOV R5,A MOV A,R6 SUBB A,#0 ;R6减去0,同时减去了借位C MOV R6,A MOV A,R7 SUBB A,#0 ;R7减去0,同时减去了借位C MOV R7,A check: MOV A,R4 ORL A,R5 ORL A,R6 ORL A,R7 ;将A计算为R4到R7的按位或,如果这些值都等于0,或的结果就是0 JNZ subb_num ;如果A不是0,就跳转到subb_num RET ;在STC8下,整个循环的时间为 1 + 12+ 4+ 3 = 20机器周期 ; 清C 4次减法 或 跳转(成功时) END ``` 在C语言中写 ---------------------- ```c #define F_CPU 24000000ul #ifndef F_CPU #error "F_CPU is not defined !" #endif extern void delay_20tick(long int us); #define delayMs(ms) delay_20tick((long int)(ms * (F_CPU/(20.0*1000.0)))) //20.0就汇编每周期的Tick数 void main(void){ delayMs(20); } ``` 实验 --------------------  用Keil的软件仿真测试(没有烧单片机测试)但是同样的函数在IAR烧写过单片机测试。  可以看到调用的数据是正确的,(不过反汇编自动解析成了别的数字) 注意如果换成别的MCU比如STC12或者STC15,汇编语句的完成时间是不同的,就要改这个数字: ```c #define delayMs(ms) delay_20tick((long int)(ms * (F_CPU/(20.0*1000.0)))) ^^^^ ```
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
C
1
https://gitee.com/ecbm/stc8-bootloader-tiny.git
git@gitee.com:ecbm/stc8-bootloader-tiny.git
ecbm
stc8-bootloader-tiny
STC8-BOOTLOADER-TINY
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册