📄 traffic light firmware.lst
字号:
1 000000 CHIP SN8P2604
2 000000 //{{SONIX_CODE_OPTION
3 000000 .Code_Option Noise_Filter Disable
4 000000 .Code_Option Reset_Pin Reset
5 000000 .Code_Option Watch_Dog Disable ; Disable Watchdog
6 000000 .Code_Option High_Clk 4M_X'tal ; Crystal/Resonator: 2Mhz~10Mhz
7 000000 .Code_Option Fcpu #2 ; Fcpu = High_Clk/4
8 000000 .Code_Option Security Disable
9 000000 //}}SONIX_CODE_OPTION
10 000000 .DATA
11 0000 D DLY1 DS 02H
12 0002 D DLY2 DS 03H ;延时程序暂存器
13 E 00000004 TIMER00 EQU 04H ;tc1中断计数器
14 E 00000005 TIMER01 EQU 05H ;t0中断计数器
15 E 00000006 S_CNT EQU 06H
16 E 00000007 S_BIT EQU 07H
17 E 0000000A DISP1 EQU 0AH
18 E 0000000B DISP2 EQU 0BH
19 E 0000000C DISP3 EQU 0CH
20 E 0000000D DISP4 EQU 0DH
21 E 00000010 N_L EQU 10H ;北边显示器低位
22 E 00000011 N_H EQU 11H ;北边显示器高位
23 E 00000012 E_L EQU 12H ;东边显示器低位
24 E 00000013 E_H EQU 13H ;东边显示器高位
25 000000 .CODE
26 000000 ORG 00H
27 000000 8010(2) JMP MAIN
28 000008 ORG 08H
29 000008 80C9(2) JMP CYC
30 000010 ORG 10H
31 000010 ;************************************
32 000010 ;主程序
33 000010 ;************************************
34 000010 MAIN:
35 000010 C0D2(2) CALL INIT_IO
36 000011 C0D9(2) CALL INIT_DATA
37 000012 C0E0(2) CALL INIT_TIMER
38 000013 C0ED(2) CALL INIT_TC0
39 000014 START:
40 000014 C02D(2) CALL DATA_SHOW
41 000015 C017(2) CALL SCAN
42 000016 8014(2) JMP START
43 000017 ;************************************
44 000017 ;扫描
45 000017 ;************************************
46 000017 SCAN:
47 000017 2D04(1) MOV A,#04H
48 000018 1F06(1) MOV S_CNT,A
49 000019 2DF7(1) MOV A,#11110111B
50 00001A 1F07(1) MOV S_BIT,A
51 00001B 2B84(1) CLR Y
52 00001C 2D0A(1) MOV A,#0AH
53 00001D 1F83(1) MOV Z,A
54 00001E SCAN_LP:
55 00001E 1EE7(1) MOV A,@YZ
56 00001F 1FD2(1) MOV P2,A
57 000020 1E07(1) MOV A,S_BIT
58 000021 1FD5(1) MOV P5,A
59 000022 C10C(2) CALL DELAY
60 000023 2606(1+S) DECMS S_CNT
61 000024 8026(2) JMP @F
62 000025 0E00(2) RET
63 000026 @@:
64 000026 1683(1+S) INCMS Z
65 000027 0000(1) NOP
66 000028 6A86(1) B0BSET FC
67 000029 0907(1) RRCM S_BIT
68 00002A 2DFF(1) MOV A,#0FFH
69 00002B 1FD2(1) MOV P2,A
70 00002C 801E(2) JMP SCAN_LP
71 00002D ;************************************
72 00002D ;显示
73 00002D ;************************************
74 00002D DATA_SHOW:
75 00002D 1E12(1) MOV A,E_L
76 00002E 2A0F(1) AND A,#00001111B ;取出秒的低四位元来做数据转换
77 00002F C0FC(2) CALL BCD_DISP
78 000030 1F0A(1) MOV DISP1,A ;把显示的值送到disp1
79 000031
80 000031 1E13(1) MOV A,E_H
81 000032 2A0F(1) AND A,#00001111B ;取出秒的高四位元来做数据转换
82 000033 C0FC(2) CALL BCD_DISP
83 000034 1F0B(1) MOV DISP2,A ;把显示的值送到disp2
84 000035
85 000035 1E10(1) MOV A,N_L
86 000036 2A0F(1) AND A,#00001111B ;取出秒的低四位元来做数据转换
87 000037 C0FC(2) CALL BCD_DISP
88 000038 1F0C(1) MOV DISP3,A ;把显示的值送到disp3
89 000039
90 000039 1E11(1) MOV A,N_H
91 00003A 2A0F(1) AND A,#00001111B ;取出秒的高四位元来做数据转换
92 00003B C0FC(2) CALL BCD_DISP
93 00003C 1F0D(1) MOV DISP4,A ;把显示的值送到disp4
94 00003D 0E00(2) RET
95 00003E ;************************************
96 00003E ;TC1中断
97 00003E ;************************************
98 00003E MY_IRQ:
99 00003E 0400(1) PUSH
100 00003F 7EC8(1+S) B0BTS1 FTC1IRQ
101 000040 80FA(2) JMP EXIT_IRQ ;检查中断
102 000041 66C8(1) B0BCLR FTC1IRQ
103 000042 2D3D(1) MOV A,#61
104 000043 1FDD(1) MOV TC1C,A ;设定每50ms中断一次
105 000044 2604(1+S) DECMS TIMER00
106 000045 80FA(2) JMP EXIT_IRQ
107 000046 2D14(1) MOV A,#20
108 000047 1F04(1) MOV TIMER00,A
109 000048 //判断是否为00
110 000048 CHECK00:
111 000048 2D00(1) MOV A,#00H
112 000049 0711(1+S) CMPRS A,N_H ;yes,比较北边高位是否为00
113 00004A 80A9(2) JMP NORMAL00 ;no,减一秒
114 00004B
115 00004B 2D00(1) MOV A,#00H
116 00004C 0710(1+S) CMPRS A,N_L
117 00004D 8057(2) JMP CHECK42
118 00004E 804F(2) JMP CHECK18 ;比较高位低位是否为00,用以隔开设定17s,正常计数。
119 00004F CHECK18:
120 00004F 2D18(1) MOV A,#18H
121 000050 07D1(1+S) CMPRS A,P1
122 000051 8053(2) JMP CHECK14 ;n=第一步,设定17s计数
123 000052 8065(2) JMP SET03 ;判断此时led显示是否为18h,y=第二步,03--00
124 000053 CHECK14:
125 000053 2D14(1) MOV A,#14H
126 000054 07D1(1+S) CMPRS A,P1
127 000055 805E(2) JMP SET17
128 000056 806C(2) JMP SET20
129 000057 CHECK42:
130 000057 2D42(1) MOV A,#42H
131 000058 07D1(1+S) CMPRS A,P1
132 000059 80A9(2) JMP NORMAL00
133 00005A
134 00005A 2D04(1) MOV A,#04H
135 00005B 0710(1+S) CMPRS A,N_L
136 00005C 80A9(2) JMP NORMAL00
137 00005D 8073(2) JMP SET031
138 00005E SET17:
139 00005E 2D18(1) MOV A,#18H
140 00005F 1FD1(1) MOV P1,A
141 000060 2D08(1) MOV A,#08
142 000061 1F10(1) MOV N_L,A
143 000062 2D01(1) MOV A,#01
144 000063 1F11(1) MOV N_H,A ;北边赋值18
145 000064 80A9(2) JMP NORMAL00
146 000065 SET03:
147 000065 2D14(1) MOV A,#14H
148 000066 1FD1(1) MOV P1,A
149 000067 2D03(1) MOV A,#03
150 000068 1F10(1) MOV N_L,A
151 000069 2D00(1) MOV A,#00
152 00006A 1F11(1) MOV N_H,A ;北边赋值03
153 00006B 80A9(2) JMP NORMAL00
154 00006C SET20:
155 00006C 2D42(1) MOV A,#42H
156 00006D 1FD1(1) MOV P1,A
157 00006E 2D01(1) MOV A,#01
158 00006F 1F10(1) MOV N_L,A
159 000070 2D02(1) MOV A,#02
160 000071 1F11(1) MOV N_H,A
161 000072 80A9(2) JMP NORMAL00
162 000073 SET031:
163 000073 2D22(1) MOV A,#22H
164 000074 1FD1(1) MOV P1,A
165 000075 2D04(1) MOV A,#04
166 000076 1F10(1) MOV N_L,A
167 000077 2D00(1) MOV A,#00
168 000078 1F11(1) MOV N_H,A ;北边赋值03
169 000079 80A9(2) JMP NORMAL00
170 00007A ;*********************************
171 00007A ;TO中断
172 00007A ;*********************************
173 00007A INTT0:
174 00007A 0400(1) PUSH
175 00007B 7CC8(1+S) B0BTS1 FT0IRQ
176 00007C 80FA(2) JMP EXIT_IRQ ;检查中断
177 00007D
178 00007D 64C8(1) B0BCLR FT0IRQ
179 00007E 2D3D(1) MOV A,#61
180 00007F 1FD9(1) MOV T0C,A ;设定每50ms中断一次
181 000080 2605(1+S) DECMS TIMER01
182 000081 80FA(2) JMP EXIT_IRQ
183 000082 2D14(1) MOV A,#20
184 000083 1F05(1) MOV TIMER01,A
185 000084 CHECKE00:
186 000084 2D00(1) MOV A,#00H
187 000085 0713(1+S) CMPRS A,E_H
188 000086 80B9(2) JMP NORMAL01
189 000087 2D00(1) MOV A,#00H
190 000088 0712(1+S) CMPRS A,E_L
191 000089 80B9(2) JMP NORMAL01 ;检查00,用以隔开东边计数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -