📄 djskz.lst
字号:
A51 MACRO ASSEMBLER DJSKZ 03/20/2008 16:11:40 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN djskz.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE djskz.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;**************************************************
2 ;djskz.asm
3 ;可设定倒计时控制
4 ;数码管在按键的控制下可以显示所有设置的小时时间秒数(0~99)
5 ;当外部中断信号 来临 的时候以该数字位初值进行倒计时计数,并控制继电器
6 ;great by 2008-3-15 lus2008
7
8 ;**************************************************
9 ;定义变量
0030 10 DisplayBuffer equ 30h ;显示数据缓冲器为30h-31h
0033 11 Modedis equ 33h ;显示数据存放
0034 12 OneSecondCounter equ 34h ;1s中断次数
0035 13 Danqians equ 35h ;存储上一次的数据
0001 14 Daojs equ 20h.1 ;中断来临标志位
00B4 15 Addkey bit P3.4 ;设置加按键
00B3 16 Deckey bit P3.3 ;设置减按键
00B0 17 RelayOut equ P3.0 ;定义输出引脚,扬声器控制
00B5 18 RelayOut1 equ P3.5 ;定义输出引脚,继电器1控制
19
20 ;程序开始
0000 21 org 00h
0000 0120 22 ajmp Main
0003 23 org 03h
0003 01AD 24 ajmp Intsig
000B 25 org 0bh
000B 01BB 26 ajmp Inttimer
0020 27 org 20h
0020 28 Main:
29 ;中断初始化
0020 758150 30 mov sp,#50h
0023 75A883 31 mov ie,#10000011b ;启动中断总开关ea和外部中断0开关ex0,et0
0026 D288 32 setb it0 ;采用脉冲负降沿启动中断
33 ;定时器初始化
0028 758901 34 mov tmod,#00000001b ; ;使用定时器0,方式1
002B 758CE3 35 mov th0,#0E3h ; 8ms
002E 758A33 36 mov tl0,#33h
37
0031 C201 38 clr Daojs ;将标志位清0
0033 75347D 39 mov OneSecondCounter,#125 ;1s钟中断次数
40 ;*****************************************************************
41 ;主程序开始
42 ;*****************************************************************
43 ;按键选择,数码管显示的数据的设置
0036 753302 44 mov Modedis,#02
0039 E533 45 Loop2: mov a,Modedis
003B 120073 46 lcall Disshu ;将数据放入缓冲区
003E 20B417 47 Loop5: jb Addkey,Next2
0041 120102 48 lcall Delayd
0044 20B411 49 jb Addkey,Next2
0047 E533 50 mov a,Modedis
0049 2401 51 add a,#1
004B B46302 52 cjne a,#99,Loop
004E 7400 53 mov a,#0
0050 30B4FD 54 Loop: jnb Addkey,$
0053 F533 55 mov Modedis,a
0055 120073 56 lcall Disshu ;将数据放入缓冲区
0058 20B316 57 Next2: jb Deckey,Next
005B 120102 58 lcall Delayd
A51 MACRO ASSEMBLER DJSKZ 03/20/2008 16:11:40 PAGE 2
005E 20B310 59 jb Deckey,Next
0061 E533 60 mov a,Modedis
0063 14 61 dec a
0064 B40002 62 cjne a,#00h,Loop1
0067 7462 63 mov a,#98
0069 30B3FD 64 Loop1: jnb Deckey,$
006C F533 65 mov Modedis,a
006E 120073 66 lcall Disshu ;将数据放入缓冲区
0071 0139 67 Next: ajmp Loop2
68
69 ;
70
71 ;*****************************************************************
72 ;数据存储,扫描显示
73 ;*****************************************************************
74 ;将数据存储到缓存里
0073 7930 75 Disshu: mov r1,#DisplayBuffer
0075 E533 76 mov a,Modedis ;将存储区里的数据分位放入缓冲区
0077 75F00A 77 mov b,#10
007A 84 78 div ab
007B A7F0 79 mov @r1,b
007D 09 80 inc r1
007E F7 81 mov @r1,a
007F 1182 82 call Candis ;显示缓冲区里的数据
0081 22 83 ret
84 ;将缓冲区里的数据显示到数码管上
0082 7930 85 Candis: mov r1,#DisplayBuffer
0084 7CDF 86 mov r4,#11011111b ;选择右边第一个数码管,其次选择第二个
0086 EC 87 Again: mov a,r4
0087 F5A0 88 mov p2,a
0089 E7 89 mov a,@r1
008A 9000A0 90 mov dptr,#tab
008D 93 91 movc a,@a+dptr
008E F580 92 mov p0,a ;显示第一个数据
0090 09 93 inc r1
0091 EC 94 mov a,r4
0092 30E307 95 jnb acc.3,Nextd
0095 03 96 rr a
0096 FC 97 mov r4,a
0097 12010B 98 lcall Delays ;2ms间隔显示时间
009A 0186 99 ajmp Again
009C 75A0FF 100 Nextd: mov p2,#0ffh
009F 22 101 ret
00A0 C0F9A4B0 102 tab: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH
00A4 999282F8
00A8 80907FB7
00AC FF
103 ;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9"".""=""不亮"
104
105 ;
106
107 ;*****************************************************************
108 ;中断服务子程序
109 ;*****************************************************************
110 ;中断服务子程序
00AD C0E0 111 Intsig: push acc
00AF C0D0 112 push psw
00B1 D28C 113 setb tr0
114 ; mov a,
00B3 853335 115 mov Danqians,Modedis
00B6 D0D0 116 pop psw
00B8 D0E0 117 pop acc
00BA 32 118 reti
119 ;定时器中断服务程序
00BB 120 Inttimer:
00BB 758CE3 121 mov th0,#0E3h ;重新加载定时参数
A51 MACRO ASSEMBLER DJSKZ 03/20/2008 16:11:40 PAGE 3
00BE 758A33 122 mov tl0,#33h
00C1 C0E0 123 push acc
00C3 C0D0 124 push psw ; 保护累加器及程序状态字的内容
00C5 D53409 125 djnz OneSecondCounter,NotoneSecond ;中断了125次了吗?即够1秒了吗?
00C8 75347D 126 mov OneSecondCounter,#125 ;如够1秒则重新设置"OneSecondCounter"计数器
00CB 1200D9 127 lcall Jiano ;调用减1秒的子程序
00CE 120073 128 lcall Disshu ;将数据放入缓冲区
00D1 129 NotoneSecond:
00D1 120082 130 lcall Candis ;调用扫描显示子程序
00D4 D0D0 131 pop psw
00D6 D0E0 132 pop acc ;恢复累加器及程序状态字的内容
00D8 32 133 reti ;中断返回
134
135 ;
136
137 ;*****************************************************************
138 ;其他子程序
139 ;*****************************************************************
140 ;将当前显示的值减1子程序
00D9 E533 141 Jiano: mov a,Modedis ;取得当前值
00DB 14 142 dec a
00DC F533 143 mov Modedis,a
00DE B40003 144 cjne a,#00h,Next5
00E1 1200E5 145 lcall Alrmk ;倒计时间到
00E4 22 146 Next5: ret
147
148 ;
149
150 ;倒计时间到服务程序
00E5 C28C 151 Alrmk: clr tr0 ;关闭定时器
00E7 853533 152 mov Modedis,Danqians ;该地方,不能用a寄存器来转接?????
00EA 120073 153 lcall Disshu ;将数据放入缓冲区
154
00ED C2B0 155 clr RelayOut ;启动继电器1
00EF C2B5 156 clr RelayOut1 ;启动扬声器
00F1 7A32 157 mov r2,#50
00F3 853533 158 lop: mov Modedis,Danqians ;使用动态显示程序达到延时间效果
00F6 120073 159 lcall Disshu ;将数据放入缓冲区
00F9 DAF8 160 djnz r2,lop
00FB D2B0 161 setb RelayOut ;启动继电器1
00FD D2B5 162 setb RelayOut1 ;启动扬声器
00FF C28C 163 clr tr0
0101 22 164 ret
165
166 ;
167
168 ;防止抖动延时 20ms
0102 7F08 169 Delayd: mov r7,#8
0104 7E7A 170 D1: mov r6,#122
0106 DEFE 171 djnz r6,$
0108 DFFA 172 djnz r7,D1
010A 22 173 ret
174
175 ;数码管显示间隔延时 16ms
010B 7F04 176 Delays: mov r7,#4
010D 7EF5 177 D2: mov r6,#245
010F DEFE 178 djnz r6,$
0111 DFFA 179 djnz r7,D2
0113 22 180 ret
181
182 end
A51 MACRO ASSEMBLER DJSKZ 03/20/2008 16:11:40 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
ADDKEY . . . . . . B ADDR 00B0H.4 A
AGAIN. . . . . . . C ADDR 0086H A
ALRMK. . . . . . . C ADDR 00E5H A
B. . . . . . . . . D ADDR 00F0H A
CANDIS . . . . . . C ADDR 0082H A
D1 . . . . . . . . C ADDR 0104H A
D2 . . . . . . . . C ADDR 010DH A
DANQIANS . . . . . N NUMB 0035H A
DAOJS. . . . . . . B ADDR 0020H.1 A
DECKEY . . . . . . B ADDR 00B0H.3 A
DELAYD . . . . . . C ADDR 0102H A
DELAYS . . . . . . C ADDR 010BH A
DISPLAYBUFFER. . . N NUMB 0030H A
DISSHU . . . . . . C ADDR 0073H A
IE . . . . . . . . D ADDR 00A8H A
INTSIG . . . . . . C ADDR 00ADH A
INTTIMER . . . . . C ADDR 00BBH A
IT0. . . . . . . . B ADDR 0088H.0 A
JIANO. . . . . . . C ADDR 00D9H A
LOOP . . . . . . . C ADDR 0050H A
LOOP1. . . . . . . C ADDR 0069H A
LOOP2. . . . . . . C ADDR 0039H A
LOOP5. . . . . . . C ADDR 003EH A
LOP. . . . . . . . C ADDR 00F3H A
MAIN . . . . . . . C ADDR 0020H A
MODEDIS. . . . . . N NUMB 0033H A
NEXT . . . . . . . C ADDR 0071H A
NEXT2. . . . . . . C ADDR 0058H A
NEXT5. . . . . . . C ADDR 00E4H A
NEXTD. . . . . . . C ADDR 009CH A
NOTONESECOND . . . C ADDR 00D1H A
ONESECONDCOUNTER . N NUMB 0034H A
P0 . . . . . . . . D ADDR 0080H A
P2 . . . . . . . . D ADDR 00A0H A
P3 . . . . . . . . D ADDR 00B0H A
PSW. . . . . . . . D ADDR 00D0H A
RELAYOUT . . . . . B ADDR 00B0H.0 A
RELAYOUT1. . . . . B ADDR 00B0H.5 A
SP . . . . . . . . D ADDR 0081H A
TAB. . . . . . . . C ADDR 00A0H A
TH0. . . . . . . . D ADDR 008CH A
TL0. . . . . . . . D ADDR 008AH A
TMOD . . . . . . . D ADDR 0089H A
TR0. . . . . . . . B ADDR 0088H.4 A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -