📄 ic.lst
字号:
A51 MACRO ASSEMBLER IC 07/12/2008 15:19:28 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN ic.OBJ
ASSEMBLER INVOKED BY: F:\keilC51\C51\BIN\A51.EXE ic.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*****************************************************************
2 ; IC卡收费 单片机中地址30H至37H为8位数字的保存位
3 ;***************************************************************
4 ;*******************************************************************
000A 5 SUR EQU 0AH
0020 6 POINTER EQU 20H ;芯片中间变量地址,用来保存数据输入到的24C02的内存地址
0030 7 NUM EQU 30H
00A0 8 SDA EQU P2.0 ;24c02数据端口
00A1 9 SCL EQU P2.1 ;24c02时钟端口
0021 10 NUMB EQU 21H
00A6 11 DULA BIT P2.6
00A7 12 WELA BIT P2.7
00A3 13 SPK BIT P2.3
14 ;********************************************************************
0000 15 ORG 0000H
0000 020030 16 LJMP MAIN
0030 17 ORG 0030H
18 ;&&&&&&&&&&&&&&&&&&主程序开始&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0030 19 MAIN:
0030 7930 20 MOV R1,#NUM ;将30H--37H初始化为0
0032 21 M1:
0032 7700 22 MOV @R1,#0H
0034 09 23 INC R1
0035 E9 24 MOV A,R1
0036 B436F9 25 CJNE A,#36H,M1
0039 120586 26 LCALL RT ;把24C02中30--37H内容读入内存30H--37H
003C 7935 27 MOV R1,#35H
003E 28 M4: ;判断余额是否小于10
003E B9300D 29 CJNE R1,#30H,M2
0041 120741 30 LCALL FENGMING ;余额小于10蜂鸣器响
0044 120738 31 LCALL DELAY2
0047 32 M5:
0047 120730 33 LCALL KSTART
004A 7008 34 JNZ MAIN1
004C 80F9 35 JMP M5
004E 36 M2:
004E B70003 37 CJNE @R1,#0H,MAIN1
0051 19 38 DEC R1
0052 80EA 39 JMP M4
0054 40 MAIN1:
0054 120100 41 LCALL STARTSHOW ;初始化LED界面进行功能选择
0057 42 CHO:
0057 1206E7 43 LCALL KEYSCAN ;按键扫描,进行功能选择,1 查询上一次的操作 2 扣钱
3存钱 4查询余额
005A 120634 44 LCALL SELSHOW ;对输入数字进行显示
005D B40AF7 45 CJNE A,#SUR,CHO ;输入不是确定键,仍能继续输入
0060 46 CHO1:
47 ;LCALL KSTART
48 ;JZ CHO1 ;将JNZ改为JZ
0060 12019F 49 LCALL FOUS ;根据输入数字选择功能
0063 80EF 50 JMP MAIN1
0065 80FE 51 SJMP $
52 ;&&&&&&&&&&&&&&&&&&&&&&&&&&主程序结束$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
53 ;子程序开始
0100 54 ORG 0100H
55 ;******************初始化LED界面进行功能选择*******************
0100 56 STARTSHOW:
0100 C2A7 57 CLR WELA
A51 MACRO ASSEMBLER IC 07/12/2008 15:19:28 PAGE 2
0102 758000 58 MOV P0,#00H
0105 D2A7 59 SETB WELA
0107 C2A7 60 CLR WELA
61 ;低电平有效
0109 C2A6 62 CLR DULA
010B 758000 63 MOV P0,#00H ;低电平有效
010E D2A6 64 SETB DULA
0110 C2A6 65 CLR DULA
0112 66 LOOP:
0112 C2A7 67 CLR WELA
0114 7580FE 68 MOV P0,#0FEH
0117 D2A7 69 SETB WELA
0119 C2A7 70 CLR WELA
011B C2A6 71 CLR DULA
011D 758040 72 MOV P0,#40H ;选中Q1,显示C
0120 D2A6 73 SETB DULA
0122 C2A6 74 CLR DULA
0124 120738 75 LCALL DELAY2
76
77
0127 C2A7 78 CLR WELA
0129 7580FD 79 MOV P0,#0FDH
012C D2A7 80 SETB WELA
012E C2A7 81 CLR WELA ;低电平有效
0130 C2A6 82 CLR DULA
0132 758076 83 MOV P0,#76H ;;选中Q2,显示H
0135 D2A6 84 SETB DULA
0137 C2A6 85 CLR DULA
0139 120738 86 LCALL DELAY2
87
88
013C C2A7 89 CLR WELA
013E 7580FB 90 MOV P0,#0FBH
0141 D2A7 91 SETB WELA
0143 C2A7 92 CLR WELA ;低电平有效
0145 C2A6 93 CLR DULA
0147 758079 94 MOV P0,#79H ;选中Q3,显示O
014A D2A6 95 SETB DULA
014C C2A6 96 CLR DULA
014E 120738 97 LCALL DELAY2
98
99
0151 C2A7 100 CLR WELA
0153 7580F7 101 MOV P0,#0F7H
0156 D2A7 102 SETB WELA
0158 C2A7 103 CLR WELA ;低电平有效
015A C2A6 104 CLR DULA
015C 758038 105 MOV P0,#38H ;Q4,O
015F D2A6 106 SETB DULA
0161 C2A6 107 CLR DULA
0163 120738 108 LCALL DELAY2
109
0166 C2A7 110 CLR WELA
0168 7580EF 111 MOV P0,#0EFH
016B D2A7 112 SETB WELA
016D C2A7 113 CLR WELA
016F C2A6 114 CLR DULA
0171 758038 115 MOV P0,#38H ;Q5,S
0174 D2A6 116 SETB DULA
0176 C2A6 117 CLR DULA
0178 120738 118 LCALL DELAY2
119
120
017B C2A7 121 CLR WELA
017D 7580DF 122 MOV P0,#0DFH
0180 D2A7 123 SETB WELA
A51 MACRO ASSEMBLER IC 07/12/2008 15:19:28 PAGE 3
0182 C2A7 124 CLR WELA
0184 C2A6 125 CLR DULA
0186 75803F 126 MOV P0,#3fH ;Q6,E
0189 D2A6 127 SETB DULA
018B C2A6 128 CLR DULA
018D 120738 129 LCALL DELAY2
130
131 ;检测是否有键按下
0190 75B0F0 132 MOV P3,#0F0H ;将P1口高四位置0低四位值1
0193 E5B0 133 MOV A,P3 ;读P1口
0195 64F0 134 XRL A,#0F0H ;将A中的值与A中的值相异或
0197 120738 135 LCALL DELAY2
019A 7002 136 JNZ SE
019C 2112 137 JMP LOOP
019E 22 138 SE: RET
139 ;***************************功能选择***************************
019F 140 FOUS:
019F E8 141 MOV A,R0
01A0 B40C03 142 CJNE A,#0CH,F2
01A3 0202E2 143 LJMP INQUIRE ;查询上一次的操作
01A6 144 F2:
01A6 B40D03 145 CJNE A,#0DH,F3
01A9 0201B6 146 LJMP DEDUCT ;扣钱
01AC 147 F3:
01AC B40E03 148 CJNE A,#0EH,F4
01AF 02025C 149 LJMP DEPOSIT ;存钱
01B2 150 F4:
01B2 020356 151 LJMP SURPLUS ;查询余额
01B5 22 152 RET
153 ;********************************扣钱**************************
01B6 154 DEDUCT:
01B6 120586 155 LCALL RT ;把外存30~37读入内存30H~37H
01B9 754023 156 MOV 40H,#23H
01BC 754154 157 MOV 41H,#54H
01BF 754257 158 MOV 42H,#57H
01C2 754346 159 MOV 43H,#46H
01C5 754435 160 MOV 44H,#35H
01C8 754525 161 MOV 45H,#25H
162 ;MOV 46H,#56H
163 ;MOV 47H,#56H
01CB 120540 164 LCALL STS ;键盘输入到60h~67h单元中,并且将输入的单元送到40h~47h中以便后面处理
01CE 120521 165 LCALL WT1 ;将40h起始的内容写入到24c02中50-57H,以便进行查询
166 ;等待处理
01D1 7935 167 MOV R1,#35H ;卡里的钱最高位存到37H
01D3 7A07 168 MOV R2,#07H
01D5 7850 169 MOV R0,#50H ;统计卡里钱的位数,存到50H
01D7 12023E 170 LCALL LOOP1 ;子程序统计
01DA 08 171 INC R0 ;将要扣的钱位数存在51H
01DB 7945 172 MOV R1,#45H ;将要扣的钱最高位存在47H
01DD 7A07 173 MOV R2,#07H
01DF 12023E 174 LCALL LOOP1 ;子程序统计
01E2 18 175 DEC R0
01E3 E6 176 MOV A,@R0
01E4 08 177 INC R0
01E5 C3 178 CLR C
01E6 96 179 SUBB A,@R0
01E7 402A 180 JC ERRORB ;卡里钱的位数比要扣的钱的位数小则报错,调用显示出错的子程序
01E9 18 181 DEC R0
01EA E6 182 MOV A,@R0
01EB 14 183 DEC A
01EC 2440 184 ADD A,#40H
01EE F9 185 MOV R1,A ;把扣钱的最高位存到R1所指定的地址单元里
01EF E6 186 MOV A,@R0
01F0 14 187 DEC A
01F1 2430 188 ADD A,#30H
01F3 F8 189 MOV R0,A
A51 MACRO ASSEMBLER IC 07/12/2008 15:19:28 PAGE 4
01F4 E6 190 MOV A,@R0 ;把卡里的钱最高位存到A
01F5 C3 191 CLR C
01F6 97 192 SUBB A,@R1
01F7 401A 193 JC ERRORB ;若要扣的钱和存的钱的位数一样,但扣的钱大,调用显示出错的子程序
01F9 7930 194 MOV R1,#30H
01FB 7850 195 MOV R0,#50H
01FD E6 196 MOV A,@R0
01FE 7840 197 MOV R0,#40H
0200 FA 198 MOV R2,A
0201 C3 199 CLR C
0202 E7 200 KOUQIAN:MOV A,@R1
0203 96 201 SUBB A,@R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -