1、汇编中的宏定义,大写且前缀加MAC,如下:
MAC_XXX_XX EQU 12、定义变量,前缀加VAR;局部变量小写,全局变量首字母大写
VAR_XXX DS 13、定义位变量(可作为标志位)
workflag DS 2 BF_XXX EQU (workflag+0).0 ... BF_XXX EQU (workflag+0).7 BF_XXX EQU (workflag+1).04、定义引脚
PIN_Led_Red EQU P0.05、定义跳转位置
JMP JMP_XXX ;跳转 JMP_XXX: BTS0 XXX6、定义函数
;--------------------------------------------------------------------------------------- ; 函数功能: ; XXX ; 入口参数: ; 1. XXX 2.XXX …… ; 出口参数: ; 1. XXX 2.XXX …… ; 占用资源: ; 1. XXX 2.XXX …… ; 堆栈深度: ; SP_DEPTH = 1 ;--------------------------------------------------------------------------------------- func_XXX: XXX XXX …… RET异或运算:相同为0,不同为1; 两变量相同,异或运算为0;两变量不同,异或运算为1; 进行异或运算后(也是逻辑运算),零标志(Z)状态会改变:
Z:零标志。 1 = 逻辑运算的结果为零; 0 = 逻辑运算的结果非零。 B0MOV A,var1 XOR A,#AA ; "#AA"可以是宏定义或变量 (异或:两变量值相同为0(FZ==1),两变量值不同为1(FZ==0)) B0BTS0 FZ JMP JMP_XXX ... ;------------------------------------------------------------------------------------------ B0MOV A,var2 XOR A,#BB ; B0BTS1 FZ JMP JMP_XXX ...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值为0x01 MOV A,#0xFF B0MOV R0,A ; R1 为按键状态,R0 为0xFF KEYIN2: B0MOV Y,#TBL_KEY$M B0MOV Z,#TBL_KEY$L INCMS R0 ; 第一遍R0 == 0 ;第二遍 R0 == 1;... NOP B0MOV A,R0 ; A 即 R0 的值; B0ADD Z,A ; 第一遍 Z == #TBL_KEY$L;第二遍 Z 为 #TBL_KEY$L 的下一个地址;...(ADD,如果产生进位则 C = 1,否则 C = 0。 ) B0BTS1 FC ; JMP FIND_KEYTBL INCMS Y NOP 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,A RET KEYIN3: CMPRS A,#0xFF ; 比较,如果相等则跳过下一条指令(0xFF是TBL_KEY表中结尾的值,所以前面值都不等,最后一个就一定等) JMP KEYIN2 ; 没有查完 TBL_KEY 表,循环查找 B0MOV keycode,A ; RET TBL_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,P1 XOR A,#0xFF ; 此处是为了避免不按键时与结束码相同,键码取反 AND A,#(BIT2|BIT3) ; 屏蔽非按键IO口(读取P1^2,P1^3) B0MOV R1,A MOV A,P5 XOR A,#0xFF ; 此处是为了避免不按键时与结束码相同,键码取反 AND A,#(BIT4|BIT5) ; 屏蔽非按键IO口(读取P5^4,P5^5) OR R1,A ; 综合P1 & P5两个IO口 KEYIN1: MOV A,#0xFF B0MOV R0,A KEYIN2: B0MOV Y,#TBL_KEY$M B0MOV Z,#TBL_KEY$L INCMS R0 NOP B0MOV A,R0 B0ADD Z,A B0BTS1 FC JMP FIND_KEYTBL INCMS Y NOP FIND_KEYTBL: MOVC ; CMPRS A,R1 JMP KEYIN3 B0MOV A,R0 B0MOV keycode,A RET KEYIN3: CMPRS A,#0xFF JMP KEYIN2 B0MOV keycode,A ; RET TBL_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 ; ---------------> 无定义的按键值