A51 MACRO ASSEMBLER EX3_3 06/23/2007 17:01:14 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN ex3-3.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE ex3-3.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;--------------程序信息-----------------
2 ;文件名 : ex3-3.asm
3 ;版本 : 1.0
4 ;作者 :
5 ;修改时间 :
6
7 ;--------------程序说明------------------
8 ;CHAP 3.3 扫描方式键盘输入实例
9
10 ;-----------常量和变量声明---------------
0090 11 KEYIN EQU P1;
12
13 ;--------------预定义--------------------
14
0000 15 ORG 0000H
0000 020003 16 LJMP START
17
18 ;------------中断入口地址分配------------
19 ;ORG 0003H
20 ;LJMP INT0PRG
21 ;ORG 000BH
22 ;LJMP INT1PRG
23 ;ORG 0013H;
24 ;LJMP
25 ;ORG 0030H
26
0003 27 START:
28 ;--------------初始化子程序--------------
0003 856081 29 MOV SP,60H;
30 ;--------------主程序--------------------
0006 31 MAIN:
0006 12000C 32 LCALL KEYBOARD;
0009 020006 33 LJMP MAIN
34
35
36 ;----------------子程序------------------
37
38 ;---------------------------------
39 ; 行列式键盘扫描方式子程序部分
40 ;---------------------------------
000C 41 KEYBOARD:
000C 7800 42 MOV R0,#00H; r0寄存器保存键值,初始化清零
000E 75900F 43 MOV KEYIN,#0FH; 所有列置高电平
0011 E590 44 MOV A,KEYIN; 读取行值
0013 F8 45 MOV R0,A; 保存这次的行值
0014 120075 46 LCALL DEYLAY10MS; 延时去抖
0017 75900F 47 MOV KEYIN,#0FH; 再读行值
001A E590 48 MOV A,KEYIN;
49 ;CJNE A,R0,KEYBOARD; 比较去抖前后,相同则认为有键按下,否则重新读键值
001C B40F03 50 CJNE A,#0FH,HAVEKEY;
001F 02000C 51 LJMP KEYBOARD;
0022 52 HAVEKEY:
0022 759008 53 MOV KEYIN,#08H; 第一列置高电平扫描
0025 E590 54 MOV A,KEYIN; 读出扫描的行值
0027 B40803 55 CJNE A,#08H,COL1; 判断按键是否在第一列
002A 020031 56 LJMP COL2; 否,则跳转扫描下一列
002D 7900 57 COL1: MOV R1,#00H; 是,则记下列数
002F 801E 58 JMP KEYBOARDEND; 跳转到键值处理部分
A51 MACRO ASSEMBLER EX3_3 06/23/2007 17:01:14 PAGE 2
0031 B40403 59 COL2: CJNE A,#04H,COL22; 同上,判断按键是否在第二列
0034 02003B 60 LJMP COL3;
0037 7901 61 COL22: MOV R1,#01H; 是,记下列数,第二列
0039 8014 62 JMP KEYBOARDEND;
003B B40203 63 COL3: CJNE A,#02H,COL33;
003E 020045 64 LJMP COL4;
0041 7902 65 COL33: MOV R1,#02H; 记下列数,第三列
0043 800A 66 JMP KEYBOARDEND;
0045 B40103 67 COL4: CJNE A,#01H,COL44;
0048 02000C 68 LJMP KEYBOARD;
004B 7901 69 COL44: MOV R1,#01H ;第四列
004D 8000 70 JMP KEYBOARDEND;
004F 71 KEYBOARDEND: ;键值处理程序块
004F E8 72 MOV A,R0;
0050 120057 73 LCALL COLSCAN; 判断按键在第几行,R0返回行基数
0053 F8 74 MOV R0,A; R1保存列数,R0保存行基数
0054 29 75 ADD A,R1; 则 键值=R1+R0
0055 F8 76 MOV R0,A;
0056 22 77 RET;
78 ;---------------------------------
79 ; 行扫描方式识别子程序部分
80 ; R0返回行增加的键值基数
81 ; 具体是第一行R0 82 ;---------------------------------
0057 E8 83 COLSCAN: MOV A,R0;
0058 30E404 84 JNB ACC.4,ROW2; 判断是否是第一行
005B 7800 85 MOV R0,#00H; 是,则R0=0保存行基数
005D 8015 86 JMP COLSCANEND; 否,则跳转判断下一行
005F 30E504 87 ROW2: JNB ACC.5,ROW3;
0062 7804 88 MOV R0,#04H;
0064 800E 89 JMP COLSCANEND;
0066 30E604 90 ROW3: JNB ACC.6,ROW4;
0069 7808 91 MOV R0,#08H;
006B 8007 92 JMP COLSCANEND;
006D 30E704 93 ROW4: JNB ACC.7,COLSCANEND;
0070 780C 94 MOV R0,#0CH;
0072 8000 95 JMP COLSCANEND;
0074 96 COLSCANEND:
0074 22 97 RET;
98
99 ;--------------中断子程序----------------
100
101 ;---------------延时子程序---------------
0075 7E40 102 DEYLAY10MS: MOV R6,#40H;
0077 7F48 103 DELAY0: MOV R7,#248H;
*** _____________________________________________^
*** WARNING #A52 IN 103 (ex3-3.asm, LINE 103): VALUE HAS BEEN TRUNCATED TO 8 BITS
0079 DFFE 104 DJNZ R7,$;
007B DEFA 105 DJNZ R6,DELAY0;
007D 22 106 RET;
107
108
109 END
;---------------注意事项-----------------
A51 MACRO ASSEMBLER EX3_3 06/23/2007 17:01:14 PAGE 3
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
COL1 . . . . . . . C ADDR 002DH A
COL2 . . . . . . . C ADDR 0031H A
COL22. . . . . . . C ADDR 0037H A
COL3 . . . . . . . C ADDR 003BH A
COL33. . . . . . . C ADDR 0041H A
COL4 . . . . . . . C ADDR 0045H A
COL44. . . . . . . C ADDR 004BH A
COLSCAN. . . . . . C ADDR 0057H A
COLSCANEND . . . . C ADDR 0074H A
DELAY0 . . . . . . C ADDR 0077H A
DEYLAY10MS . . . . C ADDR 0075H A
HAVEKEY. . . . . . C ADDR 0022H A
KEYBOARD . . . . . C ADDR 000CH A
KEYBOARDEND. . . . C ADDR 004FH A
KEYIN. . . . . . . D ADDR 0090H A
MAIN . . . . . . . C ADDR 0006H A
P1 . . . . . . . . D ADDR 0090H A
ROW2 . . . . . . . C ADDR 005FH A
ROW3 . . . . . . . C ADDR 0066H A
ROW4 . . . . . . . C ADDR 006DH A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 0003H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 1 WARNING(S), 0 ERROR(S)