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