jianming(dingshi).lst
来自「义隆单片机控制8个LED的渐明渐暗」· LST 代码 · 共 132 行
LST
132 行
1 ; ===========================================
2 ;中断方式实现内部TCC功能
3 ;晶振=4MHZ,指令周期为4个时钟
4 ;============================================
5 ;--------------------------------------------------
6 ; 定义变量
7 ;-------------------------------------------------------
8 0001 TCC == 0x01 ; TCC计数器
9 0003 psw == 0x03 ; 状态寄存器
10 0005 PORT5 == 0x05 ; PORT5端口
11 0005 ioc5 == 0x05 ; port5控制端口
12 000E IOCE == 0x0E ; WDT控制寄存器
13 000F IOCF == 0x0F ; 中断控制寄存器
14 000F ISR == 0x0F ; 中断状态寄存器
15 0010 A_BUF == 0x10 ; 保存中断前A的值
16 0011 flag_100ms == 0x11 ;100ms到标志位
17 0012 count_100ms == 0x12 ;100ms计数器
18 0013 count1_100ms == 0x13 ;100ms计数器1
19 0014 count_gu == 0x14 ;固定计数器
20 0015 count_bian == 0x15 ;可变计数器
21 0016 flag_ad == 0x16 ;选择可变计数器的加和减
22 0000 c == 0 ; 进位标志位
23 0002 Z == 2 ; 为0标志位
24 ;----------------------------程序入口地址------------------------------;
25 ORG 0x00
26
27 00000 1411 JMP tcc_start ;开始程序入口
28 ORG 0x08 ;中断入口地址
29 ;----------------------------------------------------------------------;
30 00008 TCC_INT:
31 00008 0050 MOV A_BUF, A ; 保存A的值
32 00009 18EB mov a,@0xeb ;TCC计数初值
33 0000A 0041 mov TCC,a
34 0000B 18FE MOV A, @0xFE
35 0000C 02CF AND ISR, A ; 清中断标志位
36 ;-----------------------------------------------------------------------
37 0000D 1035 call gu_loop ;调用固定计数子程序
38 0000E 1027 call sub_100ms ;调用延时100ms子程序
39 ;----------------------------------------------------------------------
40 0000F TCC_out:
41 0000F 0410 MOV A, A_BUF ; 恢复A的值
42 00010 0013 RETI ; 中断返回
43 ;---------------------主程序-----------------------------------------------;
44 00011 tcc_start:
45 00011 1800 MOV A, @0x00
46 00012 000E IOW IOCE ; 关闭看门狗
47 00013 0005 IOW ioc5 ; Port5为输出口
48 ;------------------赋初值-------------------------------------------------;
49 00014 0816 bc flag_ad,0
50 00015 0811 bc flag_100ms,0
51 00016 00D2 clr count_100ms
52 00017 00D3 clr count1_100ms
53 00018 00D4 clr count_gu
54 00019 00D5 clr count_bian
55 ; Bs PORT5,0 ; 关闭LED灯
56 ;----------------------------------------------------------------
57 0001A 18D0 MOV A, @0b11010000 ; 保留不需要设置的状态位
58 0001B 1900 OR A, @0b00000000 ; 预除数2
59 0001C 0002 CONTW
60 0001D 1801 MOV A, @0x01 ; 允许计数器中断
61 0001E 000F IOW IOCF
62 0001F 0010 ENI ; 开中断
63 ;----------------------等待中断----------------------------------------------;
64 00020 main:
65 00020 0E11 jbs flag_100ms,0 ;100ms到否
66 00021 1426 jmp main_out ;否,返回
67 00022 0811 bc flag_100ms,0
68 00023 1043 call bian_loop ;是,调用可变子程序
69 00024 0000 nop
70 00025 0000 nop
71 00026 main_out:
72 00026 1420 jmp main
73
74 ;======================================================================
75 ;100ms子程序
76 ;-----------------------------------------------------------------------
77 00027 sub_100ms:
78 00027 0552 inc count_100ms
79 00028 1864 mov a,@0x64
80 00029 0112 sub a,count_100ms
81 0002A 0E03 jbs psw,c ;是否大于等于100
82 0002B 0012 ret ;否,返回主程序
83 0002C 00D2 clr count_100ms ;5ms到
84 0002D 0553 inc count1_100ms
85 0002E 1814 mov a,@20
86 0002F 0113 sub a,count1_100ms
87 00030 0E03 jbs psw,c ;是否大于20
88 00031 0012 ret ;否,返回
89 00032 00D3 clr count1_100ms ;是,100ms到
90 00033 0A11 bs flag_100ms,0
91 00034 0012 ret
92 ;------------------------------------------------------------------------------
93 ;固定计数子程序
94 ;可以在此改变IO口的状态,50us-5ms,100等份
95 ;-----------------------------------------------------------------------------
96 00035 gu_loop:
97 00035 0554 inc count_gu
98 00036 1864 mov a,@0x64
99 00037 0314 xor a,count_gu ;是否等于100
100 00038 0E83 jbs psw,z
101 00039 143D jmp gu_next ;否,返回
102 0003A 00D4 clr count_gu
103 0003B 0A05 bs port5,0 ;P50置1
104 0003C 0012 ret
105 0003D gu_next:
106 0003D 0415 mov a,count_bian ;小于,从此处执行
107 0003E 0114 sub a,count_gu
108 0003F 0E03 jbs psw,c
109 00040 0012 ret
110 00041 0805 bc port5,0 ;大于等于COUNT_BIAN,P50置0
111 00042 0012 ret
112 ;------------------------------------------------------------------------
113 ;可变计数器,决定占空比
114 ;-----------------------------------------------------------------------
115 00043 bian_loop:
116 00043 0C16 jbc flag_ad,0 ;flag_ad为0,执行递增
117 00044 144C jmp bian_next ;flag_ad为1,执行递减
118 00045 0555 inc count_bian
119 00046 1864 mov a,@0x64
120 00047 0115 sub a,count_bian
121 00048 0E03 jbs psw,c
122 00049 0012 ret
123 0004A 0A16 bs flag_ad,0
124 0004B 0012 ret
125 0004C bian_next: ;递减开始
126 0004C 05D5 djz count_bian
127 0004D 0012 ret
128 0004E 0816 bc flag_ad,0
129 0004F 00D5 clr count_bian
130 00050 0012 ret
131 END
0 Error(s), 0 Warning(s), 0 User Message(s)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?