📄 atmegal16l.lst
字号:
013F E280 LDI R24,0x20
0140 BB8A OUT 0x1A,R24
(0179) i=0;
0141 2744 CLR R20
(0180) PORTD=0x00;
0142 BA22 OUT 0x12,R2
(0181) DDRD=0x80;
0143 E880 LDI R24,0x80
0144 BB81 OUT 0x11,R24
(0182) i=0;
(0183) i=0;
(0184) i=0;
(0185) i=0;
(0186) PORTD=0x00;
0145 BA22 OUT 0x12,R2
(0187) i=0;
(0188) PORTA=0x20;
0146 E280 LDI R24,0x20
0147 BB8B OUT 0x1B,R24
0148 C006 RJMP 0x014F
(0189)
(0190)
(0191) //Uart_PutChar(EEBuffer[0]);
(0192) //Uart_PutChar(EEBuffer[1]);
(0193) //SEI();
(0194) while(1)
(0195) h=measure();
0149 DF4A RCALL _measure
014A 01FE MOVW R30,R28
014B 8302 STD Z+2,R16
014C 8313 STD Z+3,R17
014D 8324 STD Z+4,R18
014E 8335 STD Z+5,R19
014F CFF9 RJMP 0x0149
(0196)
(0197) Uart_PutChar(0x03);
0150 E003 LDI R16,3
0151 940E034E CALL _Uart_PutChar
(0198) Uart_PutChar(0x04);
0153 E004 LDI R16,4
0154 940E034E CALL _Uart_PutChar
(0199) while(1);
0156 CFFF RJMP 0x0156
(0200)
(0201) }
0157 962A ADIW R28,0xA
0158 9508 RET
_BlockCRC16UsingAlgorithm:
uiCharShifted --> R20
i --> R22
v --> R12
CRC --> R10
Len --> R18
Block --> R16
0159 940E0431 CALL push_gset4
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\Crc.c
(0001) #include <iom16v.h>
(0002) #include "Crc.h"
(0003)
(0004) //============================================================
(0005) //函 数:unsigned short CRC16(unsigned char *Message, int Len)
(0006) //功 能:CRC16计算
(0007) //入口参数:Message 要进行CRC16计算字符串,Len字符串长度
(0008) //返 回 值:CRC16计算结果
(0009) //设 计 者:覃道堂
(0010) //创作时间:2004-03-30
(0011) //修改时间:
(0012) //修改目的:
(0013) //============================================================
(0014) unsigned int BlockCRC16UsingAlgorithm(unsigned char *Block, unsigned int Len)
(0015) {
(0016) unsigned int CRC;
(0017) unsigned int uiCharShifted;
(0018) unsigned int i;
(0019) unsigned char v;
(0020)
(0021) CRC = 0;
015B 24AA CLR R10
015C 24BB CLR R11
(0022) for (i=0; i<Len; i++)
015D 2766 CLR R22
015E 2777 CLR R23
015F C01F RJMP 0x017F
(0023) {
(0024) uiCharShifted = ((unsigned int)(Block[i]) & 0x00FF) << 8;
0160 01FB MOVW R30,R22
0161 0FE0 ADD R30,R16
0162 1FF1 ADC R31,R17
0163 8140 LDD R20,Z+0
0164 2755 CLR R21
0165 7050 ANDI R21,0
0166 2F54 MOV R21,R20
0167 2744 CLR R20
(0025) CRC = (CRC) ^ uiCharShifted;
0168 26A4 EOR R10,R20
0169 26B5 EOR R11,R21
(0026) for (v = 0; v < 8; ++v)
016A 24CC CLR R12
016B C00E RJMP 0x017A
(0027) {
(0028) if ( CRC & 0x8000 )
016C FEB7 SBRS R11,7
016D C009 RJMP 0x0177
(0029) CRC = (CRC << 1) ^ 0x1021;
016E E281 LDI R24,0x21
016F E190 LDI R25,0x10
0170 0115 MOVW R2,R10
0171 0C22 LSL R2
0172 1C33 ROL R3
0173 2628 EOR R2,R24
0174 2639 EOR R3,R25
0175 0151 MOVW R10,R2
0176 C002 RJMP 0x0179
(0030) else
(0031) CRC = CRC << 1;
0177 0CAA LSL R10
0178 1CBB ROL R11
0179 94C3 INC R12
017A 2D8C MOV R24,R12
017B 3088 CPI R24,0x8
017C F378 BCS 0x016C
017D 5F6F SUBI R22,0xFF
017E 4F7F SBCI R23,0xFF
017F 1762 CP R22,R18
0180 0773 CPC R23,R19
0181 F2F0 BCS 0x0160
(0032) }
(0033) CRC = CRC & 0xFFFF;
(0034) }
(0035) // ByteCRC16UsingAlgorithm(CRC, Block[i]);
(0036) return CRC;
0182 0185 MOVW R16,R10
0183 940E040C CALL pop_gset4
0185 9508 RET
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\Eeprom16.c
(0001) #include <iom16v.h>
(0002) #include "Eeprom16.h"
(0003)
(0004) //============================================================
(0005) //函 数:unsigned char eeprom_read_byte(unsigned long *addr)
(0006) //功 能:读取EE一个字节
(0007) //入口参数:读取地址
(0008) //返 回 值:读取的字节数据
(0009) //设 计 者:覃道堂
(0010) //创作时间:2006-03-28
(0011) //修改时间:
(0012) //修改目的:
(0013) //============================================================
(0014) unsigned char eeprom_read_byte(unsigned int *addr)
(0015) {
(0016) /* Wait for completion of previous write */
(0017) while(EECR & (1<<EEWE));
_eeprom_read_byte:
addr --> R16
0186 99E1 SBIC 0x1C,1
0187 CFFE RJMP _eeprom_read_byte
(0018) /* Set up address register */
(0019) EEAR = *addr;
0188 01F8 MOVW R30,R16
0189 8020 LDD R2,Z+0
018A 8031 LDD R3,Z+1
018B BA3F OUT 0x1F,R3
018C BA2E OUT 0x1E,R2
(0020) /* Start eeprom read by writing EERE */
(0021) EECR |= (1<<EERE);
018D 9AE0 SBI 0x1C,0
(0022) /* Return data from Data Register */
(0023) return EEDR;
018E B30D IN R16,0x1D
018F 9508 RET
(0024) }
(0025) //============================================================
(0026) //函 数:void eeprom_write_byte(unsigned long *addr, unsigned char val)
(0027) //功 能:写入EE一个字节
(0028) //入口参数:写入地址,写入数据
(0029) //返 回 值:无
(0030) //设 计 者:覃道堂
(0031) //创作时间:2006-03-28
(0032) //修改时间:
(0033) //修改目的:
(0034) //============================================================
(0035) void eeprom_write_byte(unsigned int *addr, unsigned char val)
(0036) {
(0037) /* Wait for completion of previous write */
(0038) while(EECR & (1<<EEWE));
_eeprom_write_byte:
val --> R18
addr --> R16
0190 99E1 SBIC 0x1C,1
0191 CFFE RJMP _eeprom_write_byte
(0039) /* Set up address and Data Registers */
(0040) EEAR = *addr;
0192 01F8 MOVW R30,R16
0193 8020 LDD R2,Z+0
0194 8031 LDD R3,Z+1
0195 BA3F OUT 0x1F,R3
0196 BA2E OUT 0x1E,R2
(0041) EEDR = val;
0197 BB2D OUT 0x1D,R18
(0042) /* Write logical one to EEMWE */
(0043) EECR |= (1<<EEMWE);
0198 9AE2 SBI 0x1C,2
(0044) /* Start eeprom write by setting EEWE */
(0045) EECR |= (1<<EEWE);
0199 9AE1 SBI 0x1C,1
(0046) while(EECR & (1<<EEWE));
019A 99E1 SBIC 0x1C,1
019B CFFE RJMP 0x019A
(0047) }
019C 9508 RET
_Write_EEPROM:
i --> R20
EE_START_ADR --> Y+6
num_bytes --> R22
pBuffer --> R10
019D 940E042D CALL push_gset3
019F 2F62 MOV R22,R18
01A0 0158 MOVW R10,R16
(0048) /*****************************************************************************
(0049) *
(0050) * Function name : StoreEEPROM
(0051) *
(0052) * Returns : None
(0053) *
(0054) * Parameters : Pointer to string, number of bytes to write, adress in EEPROM
(0055) *
(0056) * Purpose : Write byte(s) to the EEPROM
(0057) *
(0058) *****************************************************************************/
(0059) void Write_EEPROM(unsigned char *pBuffer, unsigned char num_bytes, unsigned int EE_START_ADR)
(0060) {
(0061) unsigned char i;
(0062) for (i=0;i<num_bytes;i++)
01A1 2744 CLR R20
01A2 C00F RJMP 0x01B2
(0063) {
(0064) eeprom_write_byte(&EE_START_ADR, pBuffer[i]);
01A3 2FE4 MOV R30,R20
01A4 27FF CLR R31
01A5 0DEA ADD R30,R10
01A6 1DFB ADC R31,R11
01A7 8120 LDD R18,Z+0
01A8 018E MOVW R16,R28
01A9 5F0A SUBI R16,0xFA
01AA 4F1F SBCI R17,0xFF
01AB DFE4 RCALL _eeprom_write_byte
(0065) EE_START_ADR++;
01AC 818E LDD R24,Y+6
01AD 819F LDD R25,Y+7
01AE 9601 ADIW R24,1
01AF 839F STD Y+7,R25
01B0 838E STD Y+6,R24
01B1 9543 INC R20
01B2 1746 CP R20,R22
01B3 F378 BCS 0x01A3
(0066) }
(0067) }
01B4 940E0409 CALL pop_gset3
01B6 9508 RET
_Read_EEPROM:
i --> R20
EE_START_ADR --> Y+6
num_bytes --> R22
pBuffer --> R10
01B7 940E042D CALL push_gset3
01B9 2F62 MOV R22,R18
01BA 0158 MOVW R10,R16
(0068)
(0069)
(0070) /*****************************************************************************
(0071) *
(0072) * Function name : ReadEEPROM
(0073) *
(0074) * Returns : None
(0075) *
(0076) * Parameters : Pointer to string, number of bytes to read, adress in EEPROM
(0077) *
(0078) * Purpose : Write byte(s) to the EEPROM
(0079) *
(0080) *****************************************************************************/
(0081)
(0082) void Read_EEPROM(unsigned char *pBuffer, unsigned char num_bytes, unsigned int EE_START_ADR)
(0083) {
(0084) unsigned char i;
(0085)
(0086) for (i=0;i<num_bytes;i++)
01BB 2744 CLR R20
01BC C00F RJMP 0x01CC
(0087) {
(0088) pBuffer[i]=eeprom_read_byte(&EE_START_ADR);
01BD 018E MOVW R16,R28
01BE 5F0A SUBI R16,0xFA
01BF 4F1F SBCI R17,0xFF
01C0 DFC5 RCALL _eeprom_read_byte
01C1 2FE4 MOV R30,R20
01C2 27FF CLR R31
01C3 0DEA ADD R30,R10
01C4 1DFB ADC R31,R11
01C5 8300 STD Z+0,R16
(0089) EE_START_ADR++;
01C6 818E LDD R24,Y+6
01C7 819F LDD R25,Y+7
01C8 9601 ADIW R24,1
01C9 839F STD Y+7,R25
01CA 838E STD Y+6,R24
01CB 9543 INC R20
01CC 1746 CP R20,R22
01CD F378 BCS 0x01BD
(0090) }
(0091)
(0092) }
01CE 940E0409 CALL pop_gset3
01D0 9508 RET
_crccheck:
j --> R20
r --> R14
cbit --> Y+0
bit0 --> R8
byte --> R10
i --> R12
temp --> R22
len --> R6
p --> R4
01D1 940E0435 CALL push_gset5
01D3 2E62 MOV R6,R18
01D4 0128 MOVW R4,R16
01D5 9721 SBIW R28,1
FILE: D:\MY_COMPUTER\d\avr16\atmegal16\DS18B20.C
(0001) /********************************************************************
(0002) ATmega16L开发板18B20测试程序
(0003) 晶振频率: 4MHz
(0004) 编译: ICCAVR 6.31
(0005) 编写: QINDAOTANG
(0006) ********************************************************************/
(0007)
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #include "DS18B20.H"
(0011) //硬件连接与PD6
(0012) #define DQ 1<<6
(0013) #define true 0
(0014) #define false 1
(0015) float temperature;
(0016) /*===================================================================
(0017) // 函数功能: DS18B20数据校验函数
(0018) // 形参: void
(0019) // 返回: unsigned char 校验结果
(0020) // 编写: 2004/8/25
(0021) // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
(0022) ===================================================================*/
(0023) unsigned char crccheck(unsigned char *p,unsigned char len)
(0024) {
(0025) unsigned char bit0,cbit,r,temp,i,j,byte;
(0026) temp = 0;
01D6 2766 CLR R22
(0027) for(j = 0; j < len; j++)
01D7 2744 CLR R20
01D8 C020 RJMP 0x01F9
(0028) {
(0029) byte = p[j];
01D9 2FE4 MOV R30,R20
01DA 27FF CLR R31
01DB 0DE4 ADD R30,R4
01DC 1DF5 ADC R31,R5
01DD 80A0 LDD R10,Z+0
(0030) for(i = 0; i < 8; i++)
01DE 24CC CLR R12
01DF C015 RJMP 0x01F5
(0031) {
(0032) cbit = temp & 0x01;
01E0 2F86 MOV R24,R22
01E1 7081 ANDI R24,1
01E2 8388 STD Y+0,R24
(0033) bit0 = byte&0x01;
01E3 2D8A MOV R24,R10
01E4 7081 ANDI R24,1
01E5 2E88 MOV R8,R24
(0034) temp >>= 1;
01E6 9566 LSR R22
(0035) r = cbit ^ bit0;
01E7 80E8 LDD R14,Y+0
01E8 26E8 EOR R14,R24
(0036) if(r == 1)
01E9 2D8E MOV R24,R14
01EA 3081 CPI R24,1
01EB F439 BNE 0x01F3
(0037) temp ^= 0x8c;
01EC E88C LDI R24,0x8C
01ED E090 LDI R25,0
01EE 2E26 MOV R2,R22
01EF 2433 CLR R3
01F0 2628 EOR R2,R24
01F1 2639 EOR R3,R25
01F2 2D62 MOV R22,R2
(0038) byte >>= 1;
01F3 94A6 LSR R10
01F4 94C3 INC R12
01F5 2D8C MOV R24,R12
01F6 3088 CPI R24,0x8
01F7 F340 BCS 0x01E0
01F8 9543 INC R20
01F9 1546 CP R20,R6
01FA F2F0 BCS 0x01D9
(0039) }
(0040) }
(0041) return temp;
01FB 2F06 MOV R16,R22
01FC 9621 ADIW R28,1
01FD 940E040F CALL pop_gset5
01FF 9508 RET
(0042) }
(0043) /*===================================================================
(0044) // 函数功能: us延时函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -