📄 m16eeprom.lst
字号:
0089 C00D RJMP 0x0097
(0051) while (num)
(0052) {
(0053) while ( EECR&0x01 ); //判断EEWE是否为0
008A 99E0 SBIC 0x1C,0
008B CFFE RJMP 0x008A
(0054) EEAR = addr;
008C BB3F OUT 0x1F,R19
008D BB2E OUT 0x1E,R18
(0055) EECR = EECR|0x01; //置EERE为1
008E 9AE0 SBI 0x1C,0
(0056) *val = EEDR;
008F B22D IN R2,0x1D
0090 01FA MOVW R30,R20
0091 8220 STD Z+0,R2
(0057) addr++;
0092 5F2F SUBI R18,0xFF
0093 4F3F SBCI R19,0xFF
(0058) val++;
0094 5F4F SUBI R20,0xFF
0095 4F5F SBCI R21,0xFF
(0059) num--;
0096 950A DEC R16
0097 2300 TST R16
0098 F789 BNE 0x008A
0099 940E0168 CALL pop_gset1
009B 9508 RET
(0060) }
(0061) }
(0062) /*-----------------------------------------------------------------
(0063) 函数名称: void Uart0Init(void)
(0064) 函数功能: 串口初始化
(0065) 波特率 600 0.2% 字符长度 8bit 无奇偶校验
(0066) 参 数:
(0067) 返 回 值: 无
(0068) -----------------------------------------------------------------*/
(0069) void Uart0Init(void)
(0070) {
(0071) UCSRB = 0x00; //关串口
_Uart0Init:
009C 2422 CLR R2
009D B82A OUT 0x0A,R2
(0072) UCSRA = 0x02; //倍速模式 M16中文P151
009E E082 LDI R24,2
009F B98B OUT 0x0B,R24
(0073) UCSRC = BIT(URSEL) | 0x06; //写UCSRC寄存器,设定8个bit
00A0 E886 LDI R24,0x86
00A1 BD80 OUT 0x20,R24
(0074) UBRR = 206; //设定串口波特率为600
00A2 EC8E LDI R24,0xCE
00A3 B989 OUT 0x09,R24
(0075) UCSRB = 0x98; //开串口
00A4 E988 LDI R24,0x98
00A5 B98A OUT 0x0A,R24
00A6 9508 RET
_UartRecvData:
00A7 922A ST R2,-Y
00A8 938A ST R24,-Y
00A9 B62F IN R2,0x3F
00AA 922A ST R2,-Y
(0076) }
(0077) /*-----------------------------------------------------------------
(0078) 函数名称: void UartRecvData(void)
(0079) 函数功能:
(0080) 参 数:
(0081) 返 回 值: 无
(0082) -----------------------------------------------------------------*/
(0083) #pragma interrupt_handler UartRecvData:12
(0084) void UartRecvData(void)
(0085) {
(0086) temp1 = UDR;
00AB B02C IN R2,0x0C
00AC 92200065 STS temp1,R2
(0087) RecvFlag = 1;
00AE E081 LDI R24,1
00AF 93800060 STS RecvFlag,R24
00B1 9029 LD R2,Y+
00B2 BE2F OUT 0x3F,R2
00B3 9189 LD R24,Y+
00B4 9029 LD R2,Y+
00B5 9518 RETI
_UartTransmitData:
i --> R20
len --> R18
SendData --> R16
00B6 940E0165 CALL push_gset1
(0088) }
(0089) /*-----------------------------------------------------------------
(0090) 函数名称: void UartTransmitData(uchar *SendData, uchar len)
(0091) 函数功能: 发送字符串
(0092) 参 数: SendData 发送字符串的首地址
(0093) len 发送字符串的长度
(0094) 返 回 值: 无
(0095) -----------------------------------------------------------------*/
(0096) void UartTransmitData(uchar *SendData, uint len)
(0097) {
(0098) uint i;
(0099) for( i = 0; i < len; i++)
00B8 2744 CLR R20
00B9 2755 CLR R21
00BA C009 RJMP 0x00C4
(0100) {
(0101) while(!(UCSRA&0x20)); //判断数据寄存器是否为空
00BB 9B5D SBIS 0x0B,5
00BC CFFE RJMP 0x00BB
(0102) UDR = SendData[i];
00BD 01FA MOVW R30,R20
00BE 0FE0 ADD R30,R16
00BF 1FF1 ADC R31,R17
00C0 8020 LDD R2,Z+0
00C1 B82C OUT 0x0C,R2
00C2 5F4F SUBI R20,0xFF
00C3 4F5F SBCI R21,0xFF
00C4 1742 CP R20,R18
00C5 0753 CPC R21,R19
00C6 F3A0 BCS 0x00BB
00C7 940E0168 CALL pop_gset1
00C9 9508 RET
(0103) }
(0104) }
(0105) /*-----------------------------------------------------------------
(0106) 函数名称: void InitDevices(void)
(0107) 函数功能: 初始化各种信息
(0108) 参 数:
(0109) 返 回 值: 无
(0110) -----------------------------------------------------------------*/
(0111) void InitDevices(void)
(0112) {
(0113) CLI(); //关全部中断
_InitDevices:
00CA 94F8 BCLR 7
(0114) Uart0Init();
00CB DFD0 RCALL _Uart0Init
(0115) SEI(); //开全中断
00CC 9478 BSET 7
00CD 9508 RET
_main:
j --> R20
EepromData --> Y+2
00CE 97EF SBIW R28,0x3F
00CF 97EF SBIW R28,0x3F
00D0 97EF SBIW R28,0x3F
00D1 97EF SBIW R28,0x3F
00D2 9725 SBIW R28,5
(0116) }
(0117)
(0118) void main(void)
(0119) {
(0120) uchar EepromData[255] ;
(0121) uint j;
(0122) InitDevices();
00D3 DFF6 RCALL _InitDevices
(0123) while(j++);
00D4 011A MOVW R2,R20
00D5 5F4F SUBI R20,0xFF
00D6 4F5F SBCI R21,0xFF
00D7 2022 TST R2
00D8 F7D9 BNE 0x00D4
00D9 2033 TST R3
00DA F7C9 BNE 0x00D4
(0124) EepromRead (255, 0, EepromData); //读取上次断电前程序存储的数据
00DB 01CE MOVW R24,R28
00DC 9602 ADIW R24,2
00DD 8399 STD Y+1,R25
00DE 8388 STD Y+0,R24
00DF 2722 CLR R18
00E0 2733 CLR R19
00E1 EF0F LDI R16,0xFF
00E2 DFA2 RCALL _EepromRead
(0125) UartTransmitData(EepromData, 255); //通过串口显示
00E3 EF2F LDI R18,0xFF
00E4 E030 LDI R19,0
00E5 018E MOVW R16,R28
00E6 5F0E SUBI R16,0xFE
00E7 4F1F SBCI R17,0xFF
00E8 DFCD RCALL _UartTransmitData
00E9 C054 RJMP 0x013E
(0126) while(1)
(0127) {
(0128) if( Flag == 2)
00EA 91800061 LDS R24,Flag
00EC 3082 CPI R24,2
00ED F4A1 BNE 0x0102
(0129) {
(0130) Flag = 0;
00EE 2422 CLR R2
00EF 92200061 STS Flag,R2
(0131) EepromRead (EEpromAdd, 0, EepromData);//读取本次存储的数据,串口输出
00F1 01CE MOVW R24,R28
00F2 9602 ADIW R24,2
00F3 8399 STD Y+1,R25
00F4 8388 STD Y+0,R24
00F5 2722 CLR R18
00F6 2733 CLR R19
00F7 91000062 LDS R16,EEpromAdd
00F9 DF8B RCALL _EepromRead
(0132) UartTransmitData(EepromData, EEpromAdd);
00FA 91200062 LDS R18,EEpromAdd
00FC 91300063 LDS R19,EEpromAdd+1
00FE 018E MOVW R16,R28
00FF 5F0E SUBI R16,0xFE
0100 4F1F SBCI R17,0xFF
0101 DFB4 RCALL _UartTransmitData
(0133) }
(0134) if( RecvFlag)
0102 90200060 LDS R2,RecvFlag
0104 2022 TST R2
0105 F1C1 BEQ 0x013E
(0135) {
(0136) RecvFlag = 0;
0106 2422 CLR R2
0107 92200060 STS RecvFlag,R2
(0137) if( temp1 == '@')
0109 91800065 LDS R24,temp1
010B 3480 CPI R24,0x40
010C F421 BNE 0x0111
(0138) Flag = 1;
010D E081 LDI R24,1
010E 93800061 STS Flag,R24
0110 C02D RJMP 0x013E
(0139) else if(((temp1 == 'R')||(temp1 == 'r'))&&( Flag == 1))//连续接收到@R
0111 91800065 LDS R24,temp1
0113 3582 CPI R24,0x52
0114 F011 BEQ 0x0117
0115 3782 CPI R24,0x72
0116 F441 BNE 0x011F
0117 91800061 LDS R24,Flag
0119 3081 CPI R24,1
011A F421 BNE 0x011F
(0140) {
(0141) Flag = 2;
011B E082 LDI R24,2
011C 93800061 STS Flag,R24
(0142) }
011E C01F RJMP 0x013E
(0143) else
(0144) {
(0145) Flag = 0;
011F 2422 CLR R2
0120 92200061 STS Flag,R2
(0146) EepromWrite ( EEpromAdd++, temp1);
0122 91200065 LDS R18,temp1
0124 90200062 LDS R2,EEpromAdd
0126 90300063 LDS R3,EEpromAdd+1
0128 01C1 MOVW R24,R2
0129 9601 ADIW R24,1
012A 93900063 STS EEpromAdd+1,R25
012C 93800062 STS EEpromAdd,R24
012E 0181 MOVW R16,R2
012F DF4B RCALL _EepromWrite
(0147) if( EEpromAdd >= 255)
0130 91800062 LDS R24,EEpromAdd
0132 91900063 LDS R25,EEpromAdd+1
0134 3F8F CPI R24,0xFF
0135 E0E0 LDI R30,0
0136 079E CPC R25,R30
0137 F030 BCS 0x013E
(0148) EEpromAdd = 0;
FILE: <library>
0138 2422 CLR R2
0139 2433 CLR R3
013A 92300063 STS EEpromAdd+1,R3
013C 92200062 STS EEpromAdd,R2
013E CFAB RJMP 0x00EA
013F 96EF ADIW R28,0x3F
0140 96EF ADIW R28,0x3F
0141 96EF ADIW R28,0x3F
0142 96EF ADIW R28,0x3F
0143 9625 ADIW R28,5
0144 9508 RET
mod8u:
0145 9468 BSET 6
0146 C001 RJMP xdiv8u
div8u:
0147 94E8 BCLR 6
xdiv8u:
0148 932A ST R18,-Y
0149 92FA ST R15,-Y
014A 92EA ST R14,-Y
014B 24FF CLR R15
014C 24EE CLR R14
014D E120 LDI R18,0x10
014E 0F00 LSL R16
014F 1CFF ROL R15
0150 1CEE ROL R14
0151 16E1 CP R14,R17
0152 F010 BCS 0x0155
0153 1AE1 SUB R14,R17
0154 9503 INC R16
0155 952A DEC R18
0156 F7B9 BNE 0x014E
0157 F40E BRTC 0x0159
0158 2D0E MOV R16,R14
0159 90E9 LD R14,Y+
015A 90F9 LD R15,Y+
015B 9129 LD R18,Y+
015C 9508 RET
push_gset5:
015D 92FA ST R15,-Y
015E 92EA ST R14,-Y
push_gset4:
015F 92DA ST R13,-Y
0160 92CA ST R12,-Y
push_gset3:
0161 92BA ST R11,-Y
0162 92AA ST R10,-Y
push_gset2:
0163 937A ST R23,-Y
0164 936A ST R22,-Y
push_gset1:
0165 935A ST R21,-Y
0166 934A ST R20,-Y
0167 9508 RET
pop_gset1:
0168 E0E1 LDI R30,1
pop:
0169 9149 LD R20,Y+
016A 9159 LD R21,Y+
016B FDE0 SBRC R30,0
016C 9508 RET
016D 9169 LD R22,Y+
016E 9179 LD R23,Y+
016F FDE1 SBRC R30,1
0170 9508 RET
0171 90A9 LD R10,Y+
0172 90B9 LD R11,Y+
0173 FDE2 SBRC R30,2
0174 9508 RET
0175 90C9 LD R12,Y+
0176 90D9 LD R13,Y+
0177 FDE3 SBRC R30,3
0178 9508 RET
0179 90E9 LD R14,Y+
017A 90F9 LD R15,Y+
017B 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -