📄 shuma-yanshi.lst
字号:
1 ; ===========================================
2 ;中断方式实现内部TCC功能
3 ;晶振=4MHZ,指令周期为4个时钟
4 ;============================================
5 ;--------------------------------------------------------------
6 ; 定义变量
7 ;--------------------------------------------------------------
8 0000 r0 == 0x00
9 0002 pc == 0x02
10 0003 status == 0x03 ; 状态寄存器
11 0004 r4 == 0x04
12 0005 PORT5 == 0x05 ; PORT5端口
13 0005 ioc5 == 0x05
14 0006 port6 == 0x06 ;PORT6端口
15 0006 ioc6 == 0x06
16 000B iocb == 0x0b ;设置下拉端口
17 000E IOCE == 0x0E ; WDT控制寄存器
18 ;-------------------------------------------------------------------
19 0012 scancnt == 0x12
20 0013 scanmap == 0x13
21 0014 count == 0x14
22 0015 dispbuf == 0x15
23 0016 dispbuf1 == 0x16
24 0017 year == 0x17
25 0018 flag_lian == 0x18
26 0019 flag_ying == 0x19
27 001A r_x1 == 0x1a
28 001B r_x2 == 0x1b
29 0002 z == 2
30 0000 c == 0
31 ;----------------------------程序入口地址-----------------------------------;
32 ORG 0x00
33 00000 146A JMP tcc_start
34 org 0x10
35 ;--------------------------------------------------------------------------
36 ;显示处理子程序
37 ;----------------------------------------------------------------------------
38 00010 disp_chuli:
39 00010 180F mov a,@0x0f
40 00011 0294 and a,count ;保留低四位
41 00012 0055 mov dispbuf,a
42 00013 0714 swapa count ;高四位和低四位转换
43 00014 1A0F and a,@0x0f
44 00015 0056 mov dispbuf1,a ;保留高四位
45 00016 0012 ret
46 ;-------------------------------------------------------------------------
47 ;LED显示子程序
48 ;-------------------------------------------------------------------------
49 00017 led_disp:
50 00017 0A03 bs status,c ;状态位置1
51 00018 06D3 rlc scanmap ;位选左移
52 00019 0552 inc scancnt ;buf寄存器加一
53 0001A 0412 mov a,scancnt
54 0001B 1B02 xor a,@2 ;是否等于2
55 0001C 0E83 jbs status,z
56 0001D 1421 jmp disp_next ;否,转到disp_next
57 0001E 00D2 clr scancnt ;是,清0
58 0001F 18FE mov a,@0b11111110
59 00020 0053 mov scanmap,a ;为选重新赋位
60 00021 disp_next:
61 00021 0412 mov a,scancnt
62 00022 1F15 add a,@dispbuf ;选择寄存器
63 00023 0044 mov r4,a ;把寄存器的地址赋予R4
64 00024 0400 mov a,r0 ;通过间接寄存器把R4对应的地址赋予A
65 00025 1055 call led_table ;调用显示字符
66 00026 0046 mov port6,a ;把显示的字符赋给P6
67 00027 0413 mov a,scanmap
68 00028 0045 mov port5,a ;把位选赋给P5
69 00029 0012 ret
70 ;-----------------------------------------------------------------------
71 ;按键扫描子程序
72 ;----------------------------------------------------------------------
73 0002A key_scan:
74 0002A 0405 mov a,port5
75 0002B 0557 inc year
76 0002C 1A04 and a,@0x04
77 0002D 1B04 xor a,@0x04
78 0002E 0E83 jbs status,z
79 0002F 1437 jmp key_next
80 00030 0C18 jbc flag_lian,0
81 00031 143B jmp key_lianjia
82 00032 0C19 jbc flag_ying,0
83 00033 1442 jmp key_next1
84 00034 104A call disp_add
85 00035 0A19 bs flag_ying,0
86 00036 0012 ret
87 00037 key_next:
88 00037 00D7 clr year
89 00038 0819 bc flag_ying,0
90 00039 0818 bc flag_lian,0
91 0003A 0012 ret
92 0003B key_lianjia:
93 0003B 1805 mov a,@0x05
94 0003C 0117 sub a,year
95 0003D 0E03 jbs status,c
96 0003E 0012 ret
97 0003F 00D7 clr year
98 00040 104A call disp_add
99 00041 0012 ret
100 00042 key_next1:
101 00042 1864 mov a,@100
102 00043 0117 sub a,year
103 00044 0E03 jbs status,c
104 00045 0012 ret
105 00046 00D7 clr year
106 00047 0A18 bs flag_lian,0
107 00048 0012 ret
108 00049 key_out:
109 00049 0012 ret
110 ;----------------------------------------------------------------------------
111 ;字符增加
112 ;-------------------------------------------------------------------------
113 0004A disp_add:
114 0004A 0414 mov a,count ;是,count增加1
115 0004B 1F01 add a,@1
116 0004C 0001 daa ;转换成BCD码
117 0004D 0054 mov count,a
118 0004E 1860 mov a,@0x60 ;100到了吗
119 0004F 0314 xor a,count
120 00050 0E83 jbs status,z
121 00051 1453 jmp disp_add_next ;没到,调用disp_chuli
122 00052 00D4 clr count ;到了,清0
123 00053 disp_add_next:
124 00053 1010 call disp_chuli
125 00054 0012 ret
126 ;-----------------------------------------------------------------------------
127 ;字符显示子程序
128 ;-----------------------------------------------------------------------------
129 00055 led_table:
130 00055 03C2 add pc,a
131
132 00056 1C77 retl @0x77 ;0
133 00057 1C06 retl @0x06 ;1
134 00058 1CB3 retl @0xb3 ;2
135 00059 1C97 retl @0x97 ;3
136 0005A 1CC6 retl @0xc6 ;4
137 0005B 1CD5 retl @0xd5 ;5
138 0005C 1CF5 retl @0xf5 ;6
139 0005D 1C07 retl @0x07 ;7
140 0005E 1CF7 retl @0xf7 ;8
141 0005F 1CD7 retl @0xd7 ;9
142 ;-------------------------------------------------------------------
143 ;延时10ms子程序
144 ;------------------------------------------------------------------
145 00060 delay:
146 00060 180A mov a,@10
147 00061 005A mov r_x1,a
148 00062 d1:
149 00062 18FA mov a,@250
150 00063 005B mov r_x2,a
151 00064 d2:
152 00064 0000 nop
153 00065 05DB djz r_x2
154 00066 1464 jmp d2
155 00067 05DA djz r_x1
156 00068 1462 jmp d1
157 00069 0012 ret
158 ;---------------------------------------------------------------------
159 ;主程序
160 ;---------------------------------------------------------------------
161 0006A tcc_start:
162 0006A 1800 MOV A, @0x00
163 0006B 000E IOW IOCE ; 关闭看门狗
164 0006C 1804 mov a,@0x04 ;p50,p51位输出口
165 0006D 0005 IOW ioc5 ;p52位按键输入口
166 0006E 1808 mov a,@0x08 ;P63位输入口
167 0006F 0006 iow ioc6 ;其他口位输入口
168 00070 18FB mov a,@0xfb
169 00071 000B iow iocb
170 00072 18D0 mov A, @0b11010000 ; 保留不需要设置的状态位
171 00073 0002 CONTW
172 ;----------------赋初值------------------------------------------------
173 00074 00D7 clr year
174 00075 0818 bc flag_lian,0
175 00076 0819 bc flag_ying,0
176 ;-------------------------------------------------------------------
177 00077 18FE mov a,@0b11111110
178 00078 0053 mov scanmap,a
179 00079 1800 mov a,@0x00
180 0007A 0052 mov scancnt,a
181 0007B 0054 mov count,a
182 0007C 1010 call disp_chuli
183
184 0007D main:
185 0007D 1060 call delay
186 0007E 1017 call led_disp
187 0007F 102A call key_scan
188 00080 147D jmp main
189 ;----------------------------------------------------------------------------
190 END
0 Error(s), 0 Warning(s), 0 User Message(s)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -