📄 main.lst
字号:
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 1
MACRO ASSEMBLER A51 V7.00a
OBJECT MODULE PLACED IN main.OBJ
ASSEMBLER INVOKED BY: D:\soft\Keil\C51\BIN\A51.EXE main.asm DB
LOC OBJ LINE SOURCE
1 ;program for c51 jfq
2 ;xintong company
3 ;
4
0093 5 LED_1_BIT EQU P1.3 ;P1.3
0092 6 LED_2_BIT EQU P1.2 ;P1.3
7
0095 8 EEPROM_SCL_BIT EQU P1.5 ;P1.6
0096 9 EEPROM_SDA_BIT EQU P1.6 ;P1.7
0097 10 DOWNLOAD_BUTTON_BIT EQU P1.7 ;P2.3
0094 11 SELECT_SWITCH_BIT EQU P1.4;P1.4
12
13
14 ;串行口通信参数
000B 15 SCOM_RECV_FRAME_VALID_REG EQU 0Bh
0000 16 SCOM_RECV_FRAME_VALID_KEY EQU 00h
00FF 17 SCOM_RECV_FRAME_INVALID_KEY EQU 0FFh
18
0010 19 SCOM_SEND_DATA_BUFFER_ADDR EQU 10h
0010 20 SCOM_RECV_DATA_BUFFER_ADDR EQU 10h
0008 21 SCOM_SEND_DATA_CNT_REG EQU 08h
0009 22 SCOM_SEND_DATA_IDX_REG EQU 09h
000A 23 SCOM_RECV_DATA_CNT_REG EQU 0Ah
24
00FA 25 IRQ_TIMER1_BYTE_KEY_FAh EQU 0FAh
26
27 ;EEPROM芯片读写
00A0 28 EEPROM_WRITE_KEY_BYTE equ 0A0h
00A1 29 EEPROM_READ_KEY_BYTE equ 0A1h
0004 30 EEP_RDWR_BYTE_NUM EQU 4
0010 31 EEP_RDWR_BYTE_BUFFER_ADDR EQU 10h
0000 32 EEP_RDWR_BYTE_ADDR_LOW EQU 00h
0000 33 EEP_RDWR_BYTE_ADDR_HIGH EQU 00h
34
35
36 ;串行口命令帧的操作码关键字
0031 37 Scom_frame_Op_Send_ACK_Key EQU 31h
0030 38 Scom_frame_Op_Send_NAK_Key EQU 30h
0006 39 Scom_frame_Op_Write_File_Block_Key EQU 06h
40
41
42 ;数据块按64字节算的最大个数
00FA 43 DATA_BLOCK_AREA_64B_block_Cnt EQU 250
44
45 ;计费器数据写入地址
0000 46 DATA_BLOCK_JFQ_AREA_ADDR_Low EQU 00H
0001 47 DATA_BLOCK_JFQ_AREA_ADDR_High EQU 01H
48 ;计费器费率数据块中存放块个数的地址
0014 49 DATA_Block_JFQ_Num_ADDR_Low EQU 14H
0001 50 DATA_Block_JFQ_Num_ADDR_High EQU 01H
51
52 ;接入台数据块写入地址
0000 53 DATA_BLOCK_JRT_AREA_ADDR_Low EQU 00H
0020 54 DATA_BLOCK_JRT_AREA_ADDR_High EQU 20H
55 ;接入台费率数据块中存放块个数的地址
0014 56 DATA_Block_JRT_Num_ADDR_Low EQU 14H
0020 57 DATA_Block_JRT_Num_ADDR_High EQU 20H
58
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 2
59
60 ;计费器数据有效标志字节地址
0010 61 DATA_VALID_JFQ_IDX_BYTE_ADDR_Low EQU 10H
0000 62 DATA_VALID_JFQ_IDX_BYTE_ADDR_High EQU 00H
63
64 ;接入台数据有效标志字节地址
0012 65 DATA_VALID_JRT_IDX_BYTE_ADDR_Low EQU 12H
0000 66 DATA_VALID_JRT_IDX_BYTE_ADDR_High EQU 00H
67
68
0060 69 stack EQU 060h
70 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
71 ; CSEG AT 0
0000 72 ORG 0
0000 02003B 73 LJMP poweron
0003 74 ORG 3;INT0
0003 32 75 reti
000B 76 ORG 0BH;T0
000B 32 77 reti
0013 78 org 13h;INT1
0013 32 79 reti
001B 80 org 1bh;T1
001B 32 81 reti
0023 82 org 23h;TRI
0023 0201FE 83 ljmp func_IRQ_Serial_Comm_service_n1945
84 ;reti
85
86 ;#########################################################
0030 87 ORG 30H
0030 56657273 88 Version: DB 'Version2004'
0034 696F6E32
0038 303034
89 ;
003B 90 poweron:
003B 75A800 91 mov ie,#0
003E 758160 92 mov sp,#stack
0041 7580FF 93 mov p0,#0ffh
0044 75A0FF 94 mov p2,#0ffh
0047 75B0FF 95 mov p3,#0ffh
004A 7590FF 96 mov p1,#0ffh
004D 75D000 97 mov psw,#0
98
0050 C295 99 clr EEPROM_SCL_BIT ;EEPROM的时钟线拉低
0052 D296 100 setb EEPROM_SDA_BIT ;EEPROM的数据线拉高
0054 750BFF 101 mov SCOM_RECV_FRAME_VALID_REG,#SCOM_RECV_FRAME_INVALID_KEY
0057 750800 102 mov SCOM_SEND_DATA_CNT_REG,#0
005A 750900 103 mov SCOM_SEND_DATA_IDX_REG,#0
005D 750A00 104 mov SCOM_RECV_DATA_CNT_REG,#0
0060 D293 105 setb LED_1_BIT ;点灭1
0062 D292 106 setb LED_2_BIT ;点灭2
107
108 ;定时器串行口中断寄存器初始化
0064 1201DB 109 lcall func_init_timer_scom_irq_reg_n1946
110
111 ;检测数据块有效性并显示LED指示灯
0067 1204E4 112 lcall func_Check_data_valid_show_LED_n0601
113
114 ;debug
115 ;lcall func_Scom_send_ack_n1954 ;应答
116 ;lcall func_File_Block_Full_Write_Entry_n2067
006A 117 start:
006A 00 118 nop
006B 00 119 nop
006C 7403 120 mov A,#3
006E 12058B 121 lcall func_delay_A_mul_1ms_n2242
122
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 3
0071 020076 123 ljmp func_Main_control_n1301
0074 80F4 124 jmp start
125 ;main program end
126
127
128
129
130 ;主控程序模块
0076 131 func_Main_control_n1301:
0076 132 n1301_start:
133 ;检测是否有接收到有效数据帧
0076 E50B 134 mov A,SCOM_RECV_FRAME_VALID_REG
0078 B40003 135 cjne A,#SCOM_RECV_FRAME_VALID_KEY,n1301_not_receive_frame
007B 1202F0 136 lcall func_Scom_write_file_block_n1965
007E 137 n1301_not_receive_frame:
138 ;检测是否有按钮按下
007E 209706 139 jb DOWNLOAD_BUTTON_BIT,n1301_not_button_down
0081 12009B 140 lcall func_File_Block_Full_Write_Entry_n2067
0084 141 n1301_wait_button_up:
0084 3097FD 142 jnb DOWNLOAD_BUTTON_BIT,n1301_wait_button_up
143
0087 144 n1301_not_button_down:
0087 209406 145 jb SELECT_SWITCH_BIT,n1301_show_Led_1
008A C292 146 clr LED_2_BIT ;点亮2
008C D293 147 setb LED_1_BIT ;点灭1
008E 0194 148 ajmp n1301_delay
0090 149 n1301_show_Led_1:
0090 C293 150 clr LED_1_BIT ;点亮1
0092 D292 151 setb LED_2_BIT ;点灭2
0094 152 n1301_delay:
0094 740A 153 mov A,#10
0096 12058B 154 lcall func_delay_A_mul_1ms_n2242 ;延迟1/4秒
0099 0176 155 ajmp n1301_start
156 ;func_Main_control_n1301:end
157
158
159
160 ;数据发送函数模块,按段写入
009B 161 func_File_Block_Full_Write_Entry_n2067:
009B D293 162 setb LED_1_BIT ;点灭1
009D D292 163 setb LED_2_BIT ;点灭2
164
009F 209418 165 jb SELECT_SWITCH_BIT,n2067_send_jfq_data_block
166 ;判断数据有效标志字节是否有效
00A2 7A12 167 mov R2,#DATA_VALID_JRT_IDX_BYTE_ADDR_Low
00A4 7B00 168 mov R3,#DATA_VALID_JRT_IDX_BYTE_ADDR_High
00A6 7801 169 mov R0,#1
00A8 7910 170 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
00AA 12048D 171 lcall func_EEP_IIC_bus_read_n1123
00AD E510 172 mov A,EEP_RDWR_BYTE_BUFFER_ADDR
00AF B40006 173 cjne A,#00,n2067_data_invalid
174
00B2 7A14 175 mov R2,#DATA_Block_JRT_Num_ADDR_Low
00B4 7B20 176 mov R3,#DATA_Block_JRT_Num_ADDR_High
00B6 01CE 177 ajmp n2067_read_block_cnt_num
00B8 178 n2067_data_invalid:
00B8 8061 179 jmp n2067_exit_failed2
00BA 180 n2067_send_jfq_data_block:
181 ;判断数据有效标志字节是否有效
00BA 7A10 182 mov R2,#DATA_VALID_JFQ_IDX_BYTE_ADDR_Low
00BC 7B00 183 mov R3,#DATA_VALID_JFQ_IDX_BYTE_ADDR_High
00BE 7801 184 mov R0,#1
00C0 7910 185 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
00C2 12048D 186 lcall func_EEP_IIC_bus_read_n1123
00C5 E510 187 mov A,EEP_RDWR_BYTE_BUFFER_ADDR
00C7 B400EE 188 cjne A,#00,n2067_data_invalid
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 4
189
00CA 7A14 190 mov R2,#DATA_Block_JFQ_Num_ADDR_Low
00CC 7B01 191 mov R3,#DATA_Block_JFQ_Num_ADDR_High
00CE 192 n2067_read_block_cnt_num:
193 ;读取块的个数
00CE 7801 194 mov R0,#1 ;块个数1个字节,
00D0 7910 195 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
00D2 12048D 196 lcall func_EEP_IIC_bus_read_n1123
00D5 AC10 197 mov R4,EEP_RDWR_BYTE_BUFFER_ADDR;R4中存放块的个数
198 ;R4存放块的个数,如果为0,则退出
00D7 BC0002 199 cjne R4,#0,n2067_block_num_not_0
00DA 8039 200 jmp n2067_exit_success
00DC 201 n2067_block_num_not_0:
00DC EA 202 mov A,R2
00DD 2401 203 add A,#1 ;偏移个数的1个字节,偏移块的个数字节
00DF FA 204 mov R2,A
00E0 EB 205 mov A,R3
00E1 3400 206 addc A,#0
00E3 FB 207 mov R3,A
208
00E4 209 n2067_next_block:
00E4 C004 210 push 4 ;保存R4,块的个数
211 ;读取块的写入地址
00E6 7802 212 mov R0,#2 ;读取2个字节的写入地址
00E8 7910 213 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
00EA 12048D 214 lcall func_EEP_IIC_bus_read_n1123
215 ;设置第1块数据的目的地址,存放在R6,R7中
00ED AE11 216 mov R6,EEP_RDWR_BYTE_BUFFER_ADDR+1
00EF AF10 217 mov R7,EEP_RDWR_BYTE_BUFFER_ADDR
218
00F1 EA 219 mov A,R2
00F2 2402 220 add A,#2 ;偏移写入地址的2个字节
00F4 FA 221 mov R2,A
00F5 EB 222 mov A,R3
00F6 3400 223 addc A,#0
00F8 FB 224 mov R3,A
225 ;读取块的数据长度2个字节
00F9 7802 226 mov R0,#2
00FB 7910 227 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
00FD 12048D 228 lcall func_EEP_IIC_bus_read_n1123
229 ;块的数据长度存入R4,R5
0100 AC11 230 mov R4,EEP_RDWR_BYTE_BUFFER_ADDR+1
0102 AD10 231 mov R5,EEP_RDWR_BYTE_BUFFER_ADDR
232
0104 EA 233 mov A,R2
0105 2402 234 add A,#2;偏移块的数据长度2个字节,指向块1的数据
0107 FA 235 mov R2,A
0108 EB 236 mov A,R3
0109 3400 237 addc A,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -