📄 shuma.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 flag == 0x15
28 0016 dispbuf == 0x16
29 0017 dispbuf1 == 0x17
30 00F6 num == 246
31 0002 z == 2
32 0000 c == 0
33 ;----------------------------主程序-----------------------------------;
34 ORG 0x00
35 00000 1416 JMP tcc_start
36 ORG 0x08
37 ;-------------------中断子程序-----------------------------------------;
38 00008 TCC_INT:
39 00008 0050 MOV A_BUF, A ; 保存A的值
40 00009 180E mov a,@0x0e
41 0000A 0041 mov TCC,a
42 0000B 18FE MOV A, @0xFE
43 0000C 02CF AND ISR, A ; 清中断标志位
44 ;----------------------------------------------------------------------;
45 0000D 1038 call led_disp ;2ms的时间到
46 0000E 0551 INC TCC_Count ; 每中断一次TCC_Count计数器加1
47 0000F 0E83 JBS status,z ; 判断TCC_Count是否溢出
48 00010 1414 JMP TCC_out ; 没有溢出
49 00011 18F6 mov a,@num
50 00012 0051 mov TCC_Count,a
51 00013 0A15 bs flag,0 ;20ms的时间到
52 ;------------------中断返回----------------------------------------------;
53 00014 TCC_out:
54 00014 0410 MOV A, A_BUF ; 恢复A的值
55 00015 0013 RETI ; 中断返回
56 ;------------------初始化-------------------------------------------------;
57 00016 tcc_start:
58 00016 1800 MOV A, @0x00
59 00017 000E IOW IOCE ; 关闭看门狗
60 00018 1804 mov a,@0x04 ;p50,p51位输出口
61 00019 0005 IOW ioc5 ;p52位按键输入口
62 0001A 1808 mov a,@0x08 ;P63位输入口
63 0001B 0006 iow ioc6 ;其他口位输入口
64 0001C 18FB mov a,@0xfb
65 0001D 000B iow iocb
66 ;----------------赋初值------------------------------------------------
67 0001E 0815 bc flag,0
68 0001F 18F6 mov a,@num
69 00020 0051 mov TCC_Count,a ;TCC置初值
70 00021 18FE mov a,@0b11111110
71 00022 0053 mov scanmap,a
72 00023 1800 mov a,@0x00
73 00024 0052 mov scancnt,a
74 00025 0054 mov count,a
75 00026 1031 call disp_chuli
76 ;----------------------开中断-----------------------------------------------
77 00027 18D0 mov A, @0b11010000 ; 保留不需要设置的状态位
78 00028 1902 OR A, @0b00000010 ; 预除数为8
79 00029 0002 CONTW
80 0002A 1801 MOV A, @0x01 ; 允许计数器中断
81 0002B 000F IOW IOCF
82 0002C 0010 ENI ; 开中断
83 ;----------------------等待中断-----------------------------------------------
84 0002D main:
85 0002D 104B call key_scan
86 0002E 0000 nop
87 0002F 0000 nop
88 00030 142D jmp main
89 ;----------------------------------------------------------------------------
90 ;显示处理子程序
91 ;----------------------------------------------------------------------------
92 00031 disp_chuli:
93 00031 180F mov a,@0x0f
94 00032 0294 and a,count ;保留低四位
95 00033 0056 mov dispbuf,a
96 00034 0714 swapa count ;高四位和低四位转换
97 00035 1A0F and a,@0x0f
98 00036 0057 mov dispbuf1,a ;保留高四位
99 00037 0012 ret
100 ;-------------------------------------------------------------------------
101 ;LED显示子程序
102 ;-------------------------------------------------------------------------
103 00038 led_disp:
104 00038 0A03 bs status,c ;状态位置1
105 00039 06D3 rlc scanmap ;位选左移
106 0003A 0552 inc scancnt ;buf寄存器加一
107 0003B 0412 mov a,scancnt
108 0003C 1B02 xor a,@2 ;是否等于2
109 0003D 0E83 jbs status,z
110 0003E 1442 jmp disp_next ;否,转到disp_next
111 0003F 00D2 clr scancnt ;是,清0
112 00040 18FE mov a,@0b11111110
113 00041 0053 mov scanmap,a ;为选重新赋位
114 00042 disp_next:
115 00042 0412 mov a,scancnt
116 00043 1F16 add a,@dispbuf ;选择寄存器
117 00044 0044 mov r4,a ;
118 00045 0400 mov a,r0
119 00046 105F call led_table
120 00047 0046 mov port6,a
121 00048 0413 mov a,scanmap
122 00049 0045 mov port5,a
123 0004A 0012 ret
124 ;-----------------------------------------------------------------------
125 ;按键扫描子程序
126 ;----------------------------------------------------------------------
127 0004B key_scan:
128 0004B 0E85 jbs port5,2
129 0004C 145E jmp key_out
130 0004D 0E15 jbs flag,0
131 0004E 145E jmp key_out
132 0004F 0815 bc flag,0
133 00050 0E85 jbs port5,2
134 00051 145E jmp key_out
135 00052 key_next:
136 00052 0C85 jbc port5,2
137 00053 1452 jmp key_next
138 00054 0414 mov a,count
139 00055 1F01 add a,@1 ;转换成BCD码
140 00056 0001 daa
141 00057 0054 mov count,a
142 00058 1899 mov a,@0x99
143 00059 0314 xor a,count
144 0005A 0E83 jbs status,z
145 0005B 145D jmp key_next1
146 0005C 00D4 clr count
147 0005D key_next1:
148 0005D 1031 call disp_chuli
149 0005E key_out:
150 0005E 0012 ret
151 ;-----------------------------------------------------------------------------
152 ;字符显示子程序
153 ;-----------------------------------------------------------------------------
154 0005F led_table:
155 0005F 03C2 add pc,a
156 00060 1C77 retl @0x77 ;0
157 00061 1C06 retl @0x06 ;1
158 00062 1CB3 retl @0xb3 ;2
159 00063 1C97 retl @0x97 ;3
160 00064 1CC6 retl @0xc6 ;4
161 00065 1CD5 retl @0xd5 ;5
162 00066 1CF5 retl @0xf5 ;6
163 00067 1C07 retl @0x07 ;7
164 00068 1CF7 retl @0xf7 ;8
165 00069 1CD7 retl @0xd7 ;9
166 END
0 Error(s), 0 Warning(s), 0 User Message(s)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -