松翰单片机之汇编编程
汇编工程排版说明
1、汇编中的宏定义,大写且前缀加MAC,如下:
MAC_XXX_XX EQU 1
2、定义变量,前缀加VAR;局部变量小写,全局变量首字母大写
VAR_XXX DS 1
3、定义位变量(可作为标志位)
workflag DS 2BF_XXX EQU (workflag+0).0...BF_XXX EQU (workflag+0).7BF_XXX EQU (workflag+1).0
4、定义引脚
PIN_Led_Red EQU P0.0
5、定义跳转位置
JMP JMP_XXX ;跳转
JMP_XXX: BTS0 XXX
6、定义函数
;---------------------------------------------------------------------------------------
; 函数功能:
; XXX
; 入口参数:
; 1. XXX 2.XXX ……
; 出口参数:
; 1. XXX 2.XXX ……
; 占用资源:
; 1. XXX 2.XXX ……
; 堆栈深度:
; SP_DEPTH = 1
;---------------------------------------------------------------------------------------
func_XXX:XXX XXX……RET
程序状态寄存器 PFLAG 中常用标志 C、DC、Z
- C:进位标志。
1 = 加法运算后有进位、减法运算没有借位发生或移位后移出逻辑“1”或比较运算的结果 ≥ 0;
0 = 加法运算后没有进位、减法运算有借位发生或移位后移出逻辑“0”或比较运算的结果 < 0。 - DC:辅助进位标志。
1 = 加法运算时低四位有进位,或减法运算后没有向高四位借位;
0 = 加法运算时低四位没有进位,或减法运算后有向高四位借位。 - Z:零标志。
1 = 算术/逻辑/分支运算的结果为零;
0 = 算术/逻辑/分支运算的结果非零。
常用的判断指令 BTS0、BTS1
BTS0 M.b | 如果 M.b = 0,则跳过下一条指令 |
---|---|
BTS1 M.b | 如果 M.b = 1,则跳过下一条指令 |
用 XOR(异或)判断两变量是否相同
异或运算:相同为0,不同为1;
两变量相同,异或运算为0;两变量不同,异或运算为1;
进行异或运算后(也是逻辑运算),零标志(Z)状态会改变:
- Z:零标志。
1 = 逻辑运算的结果为零;
0 = 逻辑运算的结果非零。
B0MOV A,var1XOR A,#AA ; "#AA"可以是宏定义或变量 (异或:两变量值相同为0(FZ==1),两变量值不同为1(FZ==0))B0BTS0 FZJMP JMP_XXX ...
;------------------------------------------------------------------------------------------B0MOV A,var2XOR A,#BB ; B0BTS1 FZJMP JMP_XXX ...
用SUB(减法)判断两变量大小
SUB A,M | A ← A – M,如果产生借位则 C=0,否则 C=1。 |
---|---|
SUB M,A | M ← A – M,如果产生借位则 C=0,否则 C=1。 |
;subtract word
SUBW MACRO m_minuend,m_subtrahend //m_minuend=m_minuend-m_subtrahendMOV A,m_minuendSUB A,m_subtrahendMOV m_minuend,A // save low byteMOV A,m_minuend+1SBC A,m_subtrahend+1MOV m_minuend+1,A // save high byteENDM;------------------------------------------------------------------------------------------AAA DS 2 ; 临时双字节寄存器AAABBB DS 2 ; 临时双字节寄存器BBB;------------------------------------------------------------------------------------------;双字节变量的比较B0MOV A,var1 + 0 ; var1 + 0:表示字节1B0MOV AAA + 0,AB0MOV A,var1 + 1 ; var1 + 1:表示字节2B0MOV AAA + 1,AMOV A,#CON1$L ; #CON1$L 低字节B0MOV BBB+0,AMOV A,#CON1$M ; #CON1$M 中字节B0MOV BBB + 1,ASUBW AAA,BBB ; var1 -CON1(AAA >= BBB,FC为1)B0BTS1 FC ; 也可以用 B0BTS0JMP JMP_XXX ; var1 < CON1... ; var1 > CON1;------------------------------------------------------------------------------------------;单字节变量的比较B0MOV A,var1 ; B0MOV AAA ,AMOV A,#CON1 ; B0MOV BBB,ASUBW AAA,BBB ; var1 -CON1(AAA >= BBB,FC为1)B0BTS1 FC ; 也可以用 B0BTS0JMP JMP_XXX ; var1 < CON1... ; var1 > CON1
用跳转表实现如C语言switch功能
B0MOV A, BUF0 ; “BUF0”从 0 至 4。
@JMP_A 5 ; 列表个数为 5。
JMP A0POINT ; ACC = 0,跳至 A0POINT。
JMP A1POINT ; ACC = 1,跳至 A1POINT。
JMP A2POINT ; ACC = 2,跳至 A2POINT。
JMP A3POINT ; ACC = 3,跳至 A3POINT。
JMP A4POINT ; ACC = 4,跳至 A4POINT。
扫描按键输入
按键连接同一个端口
key0、key1、key2、key3 分别连接 P1端口的P1.0、P1.1、P1.2、P1.3;
;最后 keycode 返回的是序号,而不是 TBL_KEY 表中的值
KEYIN:MOV A,P1 ; (有按键按下,相应位为0)XOR A,#0xFF ; 此处是为了避免不按键时与结束码相同,键码取反(即有按键按下,相应位为1)(XOR:相同为0,不同为1)AND A,#0x0F ; 屏蔽非按键IO口
KEYIN1:B0MOV R1,A ; A 保存了按键值,如果只有P1.0按下,则A值为0x01MOV A,#0xFFB0MOV R0,A ; R1 为按键状态,R0 为0xFF
KEYIN2:B0MOV Y,#TBL_KEY$MB0MOV Z,#TBL_KEY$LINCMS R0 ; 第一遍R0 == 0 ;第二遍 R0 == 1;...NOPB0MOV A,R0 ; A 即 R0 的值;B0ADD Z,A ; 第一遍 Z == #TBL_KEY$L;第二遍 Z 为 #TBL_KEY$L 的下一个地址;...(ADD,如果产生进位则 C = 1,否则 C = 0。 )B0BTS1 FC ; JMP FIND_KEYTBLINCMS YNOP
FIND_KEYTBL:MOVC ; 查表(执行完 MOVC 指令后,所查找数据低字节内容被存入 ACC 中,而数据高字节内容被存入 R 寄存器。)CMPRS A,R1 ; A 存储的是 TBL_KEY 表中的值,R1 即按键状态 JMP KEYIN3 ; A != R1 ,B0MOV A,R0 ; A == R1 , 将 R0 序号(0、1、2、3...)赋值给keycode,而不是将TBL_KEY 表中的值 B0MOV keycode,ARET
KEYIN3:CMPRS A,#0xFF ; 比较,如果相等则跳过下一条指令(0xFF是TBL_KEY表中结尾的值,所以前面值都不等,最后一个就一定等)JMP KEYIN2 ; 没有查完 TBL_KEY 表,循环查找B0MOV keycode,A ; RETTBL_KEY: ; 如key0(P1.0)按下,按键值为0x01,DW 0x0000 ; ---------------> 无按键按下DW 0x0001 ; ---------------> key0 按下DW 0x0002 ; ---------------> key1 按下DW 0x0004 ; ---------------> key2 按下DW 0x0008 ; ---------------> key3 按下DW 0x00FF ; ---------------> 无定义的按键值
按键连接不同端口
key0、key1、key2、key3 分别连接 P1端口的P5.4、P5.5、P1.2、P1.3;
KEYIN:MOV A,P1XOR A,#0xFF ; 此处是为了避免不按键时与结束码相同,键码取反AND A,#(BIT2|BIT3) ; 屏蔽非按键IO口(读取P1^2,P1^3)B0MOV R1,AMOV A,P5XOR A,#0xFF ; 此处是为了避免不按键时与结束码相同,键码取反AND A,#(BIT4|BIT5) ; 屏蔽非按键IO口(读取P5^4,P5^5)OR R1,A ; 综合P1 & P5两个IO口
KEYIN1:MOV A,#0xFFB0MOV R0,A
KEYIN2:B0MOV Y,#TBL_KEY$MB0MOV Z,#TBL_KEY$LINCMS R0NOPB0MOV A,R0B0ADD Z,AB0BTS1 FCJMP FIND_KEYTBLINCMS YNOP
FIND_KEYTBL:MOVC ; CMPRS A,R1JMP KEYIN3B0MOV A,R0B0MOV keycode,ARET
KEYIN3:CMPRS A,#0xFFJMP KEYIN2B0MOV keycode,A ; RETTBL_KEY: ; 如key0(P5.4)按下,按键值为0x10,DW 0x0000 ; ---------------> 无按键按下DW 0x0010 ; ---------------> key0 按下DW 0x0020 ; ---------------> key1 按下DW 0x0004 ; ---------------> key2 按下DW 0x0008 ; ---------------> key3 按下DW 0x0030 ; ---------------> key0&key1 同时按下DW 0x00FF ; ---------------> 无定义的按键值
松翰单片机之汇编编程相关推荐
- 松翰单片机keil环境芯片包
松翰单片机keil环境芯片包(SN8F5700系列):安装时与Keil安装位置相同可以直接使用. 安装后依次点击可查看芯片包具体型号: 芯片包下载链接:阿里云盘分享https://www.aliyun ...
- FS2712A单片机可替换松翰SN8P2711
FS2712A单片机可以替代松翰SN8P2711B型号,程序直接转换使用,不需要修改PCB,因此FS2712A的成本更低,让微薄的利润再增添一笔,FS单片机更加节省成本! FS2712A是以EPROM ...
- FS2711单片机可替换松翰SN8P2711
FS2711单片机可以替代松翰SN8P2711B型号,程序直接转换使用,不需要修改PCB,因此FS2711的成本更低,让微薄的利润再增添一笔,FS单片机更加节省成本! FS2711 是以EPROM作為 ...
- 松翰松翰c语言编程指导,松翰C程序检单例程代码下载
标签: 松翰C程序检单例程 #include "define.h" #include "sn8p2501b.h" //--------------------- ...
- 松翰SN8F5703单片机WDT例程
松翰5703例程-WDT //-------------------------------------------------------------------------- //Filename ...
- 替代松翰sn8p2711,153系列主控IC
8P153/8P2711/8S003F3P6/32F103CBT6/32F103C8T6/32F103RBT6/32F103R8T6原厂封装欢迎来人来电咨询洽谈张生151.1803*6667 现货单片 ...
- 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...
描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...
- 51单片机c语言工作手册,51单片机C语言编程手册
51单片机C语言编程手册 1 第一章 介绍 这是一本关于Intel 80C51 以及广大的51 系列单片机的书这本书介绍给读者一些 新的技术使你的8051 工程和开发过程变得简单请注意这本书的目的可不 ...
- c语言延空指令,单片机C语言编程空指令产生短延时怎么办.doc
单片机C语言编程空指令产生短延时怎么办.doc (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 7.9 积分 个人收集整理-仅供参考单片机语言编程空 ...
- 单片机实验汇编2--P1口输入、输出实验
P1口输入.输出实验 一.实验要求 1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮. 2.P1口做输入口,接八个扭子开关,以实验机上74LS273做输出口,编写程序读取开关状态, ...
最新文章
- mysql 匹配 findinset
- 记录我学github的路程(二)
- Python 技术篇-调用浏览器访问指定网页,一行代码实现。非Selenium。
- hdu 1228-A+B
- 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
- c语言输出后面空格,新人提问:如何将输出时每行最后一个空格删除
- centos编译安装php7_centos7源码安装php7.2
- Android学习笔记07---查看Android虚拟机输出的错误信息与如何部署应用到自己的真实手机
- HttpClient settimeout 设置
- 使用windows 命令行创建一个空的文本文件
- C语言实现舒尔特表格生成器
- 工具-cloc代码行数统计工具
- 软件体系结构期末复习总结
- spring切点表达式提取jdk版本与aspectjweaver版本不匹配
- java编程选游戏本还是轻薄本,编程用什么笔记本,超薄本还是游戏本
- python list 添加噪声_在python中为信号添加噪声
- 1148. 简单密码破解
- PS制作独特火焰立体文字
- JVM进阶(六):鲜为人知的二次标记
- 企业微信获取corpid,Secret,Agentid