汇编工程排版说明

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         ; --------------->  无定义的按键值

松翰单片机之汇编编程相关推荐

  1. 松翰单片机keil环境芯片包

    松翰单片机keil环境芯片包(SN8F5700系列):安装时与Keil安装位置相同可以直接使用. 安装后依次点击可查看芯片包具体型号: 芯片包下载链接:阿里云盘分享https://www.aliyun ...

  2. FS2712A单片机可替换松翰SN8P2711

    FS2712A单片机可以替代松翰SN8P2711B型号,程序直接转换使用,不需要修改PCB,因此FS2712A的成本更低,让微薄的利润再增添一笔,FS单片机更加节省成本! FS2712A是以EPROM ...

  3. FS2711单片机可替换松翰SN8P2711

    FS2711单片机可以替代松翰SN8P2711B型号,程序直接转换使用,不需要修改PCB,因此FS2711的成本更低,让微薄的利润再增添一笔,FS单片机更加节省成本! FS2711 是以EPROM作為 ...

  4. 松翰松翰c语言编程指导,松翰C程序检单例程代码下载

    标签: 松翰C程序检单例程 #include "define.h" #include "sn8p2501b.h" //--------------------- ...

  5. 松翰SN8F5703单片机WDT例程

    松翰5703例程-WDT //-------------------------------------------------------------------------- //Filename ...

  6. 替代松翰sn8p2711,153系列主控IC

    8P153/8P2711/8S003F3P6/32F103CBT6/32F103C8T6/32F103RBT6/32F103R8T6原厂封装欢迎来人来电咨询洽谈张生151.1803*6667 现货单片 ...

  7. 简单51单片机c语言编程流水灯,51单片机如何实现流水灯?51单片机实现流水灯的三种方法详细分析...

    描述 首先,介绍下原理.下图为主控芯片和流水灯模块的原理图.流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯.相反,如果要LED灯熄灭,就要把P1口的电平变为高电平 ...

  8. 51单片机c语言工作手册,51单片机C语言编程手册

    51单片机C语言编程手册 1 第一章 介绍 这是一本关于Intel 80C51 以及广大的51 系列单片机的书这本书介绍给读者一些 新的技术使你的8051 工程和开发过程变得简单请注意这本书的目的可不 ...

  9. c语言延空指令,单片机C语言编程空指令产生短延时怎么办.doc

    单片机C语言编程空指令产生短延时怎么办.doc (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 7.9 积分 个人收集整理-仅供参考单片机语言编程空 ...

  10. 单片机实验汇编2--P1口输入、输出实验

    P1口输入.输出实验 一.实验要求 1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮. 2.P1口做输入口,接八个扭子开关,以实验机上74LS273做输出口,编写程序读取开关状态, ...

最新文章

  1. mysql 匹配 findinset
  2. 记录我学github的路程(二)
  3. Python 技术篇-调用浏览器访问指定网页,一行代码实现。非Selenium。
  4. hdu 1228-A+B
  5. 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
  6. c语言输出后面空格,新人提问:如何将输出时每行最后一个空格删除
  7. centos编译安装php7_centos7源码安装php7.2
  8. Android学习笔记07---查看Android虚拟机输出的错误信息与如何部署应用到自己的真实手机
  9. HttpClient settimeout 设置
  10. 使用windows 命令行创建一个空的文本文件
  11. C语言实现舒尔特表格生成器
  12. 工具-cloc代码行数统计工具
  13. 软件体系结构期末复习总结
  14. spring切点表达式提取jdk版本与aspectjweaver版本不匹配
  15. java编程选游戏本还是轻薄本,编程用什么笔记本,超薄本还是游戏本
  16. python list 添加噪声_在python中为信号添加噪声
  17. 1148. 简单密码破解
  18. PS制作独特火焰立体文字
  19. JVM进阶(六):鲜为人知的二次标记
  20. 企业微信获取corpid,Secret,Agentid

热门文章

  1. 三网融合融什么融,团购网站团什么团【涂雅速涂】
  2. PaddleDetection 自定义VOC数据集进行目标检测
  3. 一题多解×2(流的概念+递归)
  4. 双屏怎么快速切换鼠标_Win7系统如何设置一键快速切换双屏显示(图文)
  5. 阿里云服务器怎么预防CC攻击?
  6. PID调节原理——方法
  7. WiFi关联拒绝log分析以及代码流程 ASSOC_REJECT
  8. Inside-out追踪技术浅析
  9. 微型计算机显示器能源效率,【Mr. Green】加州计算机显示器能源效率规定
  10. 开源API查询IP地址归属信息