📄 210.lst
字号:
__text_start:
__start:
0013 E9CF LDI R28,0x9F
0014 E0D0 LDI R29,0
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E6 LDI R30,0x66
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 37E7 CPI R30,0x77
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E0 LDI R30,0x20
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D104 RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: E:\abol\file\EMD\programme\EM-PB-210\210.c
(0001) #include <iot13v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define unit unsigned int
(0005) #define ulong unsigned long
(0006) #define xtal 8
(0007)
(0008) int mark=1500;
(0009)
(0010) unsigned int ai,aa;
(0011) unsigned char crc,i,j,flag=0,flagh=0,flagl,acount=0,bcount=0,PINBS;
(0012) unsigned char DECODER_CODE1,DECODER_CODE0;
(0013) unsigned char data[3];
(0014) unsigned char dataf[3];
(0015)
(0016)
(0017) //PB3是控制输出端口!
(0018) #define RF_ON PORTB |= (1 << PB2) //打开输出
(0019) #define RF_OFF PORTB &= ~(1 << PB2) //关闭输出
(0020) #define EN_ON PORTB |= (1 << PB1) //打开输出
(0021) #define EN_OFF PORTB &= ~(1 << PB1) //关闭输出
(0022) #define DOOR_IN PINTB =BIT(0)
(0023)
(0024)
(0025) //端口初始化
(0026) void port_init(void)
(0027) {
(0028) PORTB = 0x29; //输入设置有上拉电阻,输出预设低电平
_port_init:
0033 E289 LDI R24,0x29
0034 BB88 OUT 0x18,R24
(0029) DDRB = 0x0e; //PB4输出,PB3输入
0035 E08E LDI R24,0xE
0036 BB87 OUT 0x17,R24
0037 9508 RET
(0030) }
(0031) //转换初始化
(0032) void adc_init(void)
(0033) {
(0034) ADCSRA=0x00; //
_adc_init:
0038 2422 CLR R2
0039 B826 OUT 0x06,R2
(0035)
(0036) ADCMUX = 0x42; //片内作为模拟参考电压 选择ADC2通道
003A E482 LDI R24,0x42
003B B987 OUT 0x07,R24
(0037) ACSR = (1 << ACD);//禁用模拟比较器
003C E880 LDI R24,0x80
003D E090 LDI R25,0
003E B999 OUT 0x09,R25
003F B988 OUT 0x08,R24
(0038)
(0039) //使能ADC,终端允许,自由模式,时钟CLK/8
(0040) //0x86允许转换ADEN,ADSC,时钟128分频 75KHz@9.6MHz system clock
(0041) ADCSRA = (1 << ADEN) | 0x07;//| ( 1 << ADATE )
0040 E887 LDI R24,0x87
0041 B986 OUT 0x06,R24
0042 9508 RET
(0042)
(0043) }
(0044) /*//看门狗初始化
(0045) void watchdog_init(void)
(0046) {
(0047) WDR(); //this prevents a timout on enabling
(0048) WDTCR=(1<<WDCE)|(1<<WDE);
(0049) WDTCR=(0<<WDE);
(0050) }*/
(0051) /* EEPROM 写入 */
(0052) void EEPROM_write(unsigned char uiaddress,unsigned char ucdata)
(0053) {
(0054) WDR();
_EEPROM_write:
ucdata --> R18
uiaddress --> R16
0043 95A8 WDR
(0055) while(EECR&(1<<EEWE)); /*等待上一次写操作结束*/
0044 99E1 SBIC 0x1C,1
0045 CFFE RJMP 0x0044
(0056) EEAR=uiaddress; /*设置地址寄存器*/
0046 BB0E OUT 0x1E,R16
(0057) EEDR=ucdata;
0047 BB2D OUT 0x1D,R18
(0058) EECR|=(1<<EEMWE);
0048 9AE2 SBI 0x1C,2
(0059) EECR|=(1<<EEWE); /*置位EEMWE 置位EEWE以启动写操作*/
0049 9AE1 SBI 0x1C,1
004A 9508 RET
(0060) }
(0061)
(0062) /* EEPROM 读取 */
(0063) unsigned char EEPROM_read(unsigned char uiaddress)
(0064) {
(0065) while(EECR&(1<<EEWE)); /*等待上一次写操作结束*/
_EEPROM_read:
uiaddress --> R16
004B 99E1 SBIC 0x1C,1
004C CFFE RJMP _EEPROM_read
(0066) EEAR=uiaddress; /*设置地址寄存器*/
004D BB0E OUT 0x1E,R16
(0067) EECR|=(1<<EERE); /*置位EEMWE 置位EEWE以启动读操作*/
004E 9AE0 SBI 0x1C,0
(0068) return EEDR; /*自数据存贮器返回数据*/
004F B30D IN R16,0x1D
0050 9508 RET
(0069) }
(0070) /* 微秒级延时程序 */
(0071) void del(int time)
(0072) {
(0073) do
(0074) {
(0075) time--;
_del:
time --> R16
0051 5001 SUBI R16,1
0052 4010 SBCI R17,0
(0076) }
(0077) while (time>1);
0053 E081 LDI R24,1
0054 E090 LDI R25,0
0055 1780 CP R24,R16
0056 0791 CPC R25,R17
0057 F3CC BLT 0x0051
0058 9508 RET
(0078) }
(0079)
(0080) /* 毫秒级延时程序 */
(0081) void delay_1ms(void)
(0082) { unsigned int i1;
(0083) for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
_delay_1ms:
i1 --> R16
0059 E001 LDI R16,1
005A E010 LDI R17,0
005B C002 RJMP 0x005E
005C 5F0F SUBI R16,0xFF
005D 4F1F SBCI R17,0xFF
005E 3706 CPI R16,0x76
005F E0E4 LDI R30,4
0060 071E CPC R17,R30
0061 F3D0 BCS 0x005C
0062 9508 RET
_delay:
i2 --> R20
n --> R22
0063 D12B RCALL push_gset2
0064 2F60 MOV R22,R16
0065 2F71 MOV R23,R17
(0084) ;
(0085) }
(0086)
(0087) void delay(unsigned int n)
(0088) {
(0089) unsigned int i2=0;
0066 2744 CLR R20
0067 2755 CLR R21
0068 C004 RJMP 0x006D
(0090) while(i2<n)
(0091) {delay_1ms();
0069 DFEF RCALL _delay_1ms
(0092) i2++; WDR();
006A 5F4F SUBI R20,0xFF
006B 4F5F SBCI R21,0xFF
006C 95A8 WDR
006D 1746 CP R20,R22
006E 0757 CPC R21,R23
006F F3C8 BCS 0x0069
0070 D114 RCALL pop_gset2
0071 9508 RET
_GetADC:
adc_value --> R20
0072 D11E RCALL push_gset1
(0093) }
(0094) }
(0095) //从AD口读入一个值
(0096) unsigned int GetADC(void)
(0097) {
(0098)
(0099) unsigned int adc_value;
(0100) DDRB|=(1<<PB3);
0073 9ABB SBI 0x17,3
(0101) PORTB&=~(1<<PB3);
0074 98C3 CBI 0x18,3
(0102) ADC = 0;
0075 2422 CLR R2
0076 2433 CLR R3
0077 B835 OUT 0x05,R3
0078 B824 OUT 0x04,R2
(0103) ADCSRA |= (1 << ADSC); //启动AD转换
0079 9A36 SBI 0x06,6
(0104)
(0105) del(10);
007A E00A LDI R16,0xA
007B E010 LDI R17,0
007C DFD4 RCALL _del
(0106) while(!(ADCSRA&(BIT(ADIF))));////ADIF=4, 表示若ADCSR的第5位置为1,则中断AD转换
007D 9B34 SBIS 0x06,4
007E CFFE RJMP 0x007D
(0107) //loop_until_bit_is_set(ADCSRA, ADIF);//等待AD转换结束
(0108)
(0109) ADCSRA |= (1 << ADIF); //写1清除标志位
007F 9A34 SBI 0x06,4
(0110)
(0111) adc_value = ADC; //读转换结果
0080 B144 IN R20,0x04
0081 B155 IN R21,0x05
(0112) DDRB&=~(1<<PB3);
0082 98BB CBI 0x17,3
(0113) PORTB|=(1<<PB3);
0083 9AC3 SBI 0x18,3
(0114)
(0115) return adc_value;
0084 2F04 MOV R16,R20
0085 2F15 MOV R17,R21
0086 D10D RCALL pop_gset1
0087 9508 RET
_CRC3:
i --> Y+1
j --> R22
len --> R10
data --> R20
0088 D104 RCALL push_gset3
0089 2EA2 MOV R10,R18
008A 2F40 MOV R20,R16
008B 2F51 MOV R21,R17
(0116) }
(0117) /******************************************
(0118) CRC3校验函数
(0119) 输 入: ptr需要进行校验的数据包
(0120) len需要校验的数据包字节数
(0121) 输 出: 校验码;
(0122) 调 用: 无;
(0123) 被调用: 从机协议打包函数;
(0124) 功 能: 将一给定的数据包进行CRC3校验给调用者返回校验码
(0125) ******************************************/
(0126) unsigned char CRC3(unsigned char *data, unsigned char len)
(0127) {
(0128) unsigned char i;
(0129) unsigned char j;
(0130) j = 0;
008C 2766 CLR R22
(0131) crc=0;
008D 2422 CLR R2
008E 92200072 STS crc,R2
0090 C034 RJMP 0x00C5
(0132)
(0133) while(len)
(0134) {
(0135) /*多项式除法*/
(0136) if(*data & (0x80>>j)) //如果该位为1
0091 2F26 MOV R18,R22
0092 2733 CLR R19
0093 E800 LDI R16,0x80
0094 E010 LDI R17,0
0095 D0E8 RCALL asr16
0096 2FE4 MOV R30,R20
0097 2FF5 MOV R31,R21
0098 8020 LDD R2,Z+0
0099 2433 CLR R3
009A 2220 AND R2,R16
009B 2231 AND R3,R17
009C 2022 TST R2
009D F411 BNE 0x00A0
009E 2033 TST R3
009F F029 BEQ 0x00A5
(0137) crc |= 0x01; //则在余数尾部添1否则添0
00A0 91800072 LDS R24,crc
00A2 6081 ORI R24,1
00A3 93800072 STS crc,R24
(0138) if(crc >= 0x8)
00A5 91800072 LDS R24,crc
00A7 3088 CPI R24,0x8
00A8 F030 BCS 0x00AF
(0139) crc ^= 11;
00A9 E08B LDI R24,0xB
00AA 90200072 LDS R2,crc
00AC 2628 EOR R2,R24
00AD 92200072 STS crc,R2
(0140) crc <<= 1;
00AF 90200072 LDS R2,crc
00B1 0C22 LSL R2
00B2 92200072 STS crc,R2
(0141) j++;
00B4 9563 INC R22
(0142) if(len==1)
00B5 2D8A MOV R24,R10
00B6 3081 CPI R24,1
00B7 F439 BNE 0x00BF
(0143) {
(0144) if(j == 7)
00B8 3067 CPI R22,7
00B9 F459 BNE 0x00C5
(0145) {
(0146) j = 0;
00BA 2766 CLR R22
(0147) data++;
00BB 5F4F SUBI R20,0xFF
00BC 4F5F SBCI R21,0xFF
(0148) len--;
00BD 94AA DEC R10
(0149) }
(0150) }
00BE C006 RJMP 0x00C5
(0151) else
(0152) {
(0153) if(j == 8)
00BF 3068 CPI R22,0x8
00C0 F421 BNE 0x00C5
(0154) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -