📄 nrf905_send.lst
字号:
(0027) if(count==number)
0222 9020013B LDS R2,_number
0224 9030013C LDS R3,_number+1
0226 1582 CP R24,R2
0227 0593 CPC R25,R3
0228 F441 BNE 0x0231
(0028) {
(0029) TIMSK=0x00;
0229 2422 CLR R2
022A BE29 OUT 0x39,R2
(0030) flag=1;
022B E081 LDI R24,1
022C E090 LDI R25,0
022D 939000B4 STS 0xB4,R25
022F 938000B3 STS 0xB3,R24
(0031) }
(0032) }
0231 9029 LD R2,Y+
0232 BE2F OUT 0x3F,R2
0233 9199 LD R25,Y+
0234 9189 LD R24,Y+
0235 9039 LD R3,Y+
0236 9029 LD R2,Y+
0237 9518 RETI
(0033) //call this routine to initialise all peripherals
(0034) void init_devices1(void)
(0035) {
(0036)
(0037) //stop errant interrupts until set up
(0038) CLI(); //disable all interrupts
_init_devices1:
0238 94F8 BCLR 7
(0039) timer0_init();
0239 DFD0 RCALL _timer0_init
(0040) count=0;
023A 2422 CLR R2
023B 2433 CLR R3
023C 923000B2 STS 0xB2,R3
023E 922000B1 STS 0xB1,R2
(0041) flag=0;
0240 923000B4 STS 0xB4,R3
0242 922000B3 STS 0xB3,R2
(0042)
(0043) TIMSK = 0x01; //timer interrupt sources
0244 E081 LDI R24,1
0245 BF89 OUT 0x39,R24
(0044) SEI(); //re-enable interrupts
0246 9478 BSET 7
(0045) //all peripherals are now initialised
(0046) }
0247 9508 RET
(0047)
(0048) /*
(0049) int delay_10ms(int no)
(0050) {
(0051) number=no;
(0052) init_devices1();
(0053) while(1)
(0054) {
(0055) if(flag==1)
(0056) break;
(0057) }
(0058) return 0;
(0059) }
(0060) */
(0061)
(0062) int delay_10ms(int no)
(0063) {
(0064) for(;no>0;no--)
_delay_10ms:
no --> R16
0248 C01A RJMP 0x0263
(0065) for (i=0;i<700;i++) ;
0249 2422 CLR R2
024A 2433 CLR R3
024B 923000B0 STS 0xB0,R3
024D 922000AF STS 0xAF,R2
024F C009 RJMP 0x0259
0250 918000AF LDS R24,0xAF
0252 919000B0 LDS R25,0xB0
0254 9601 ADIW R24,1
0255 939000B0 STS 0xB0,R25
0257 938000AF STS 0xAF,R24
0259 918000AF LDS R24,0xAF
025B 919000B0 LDS R25,0xB0
025D 3B8C CPI R24,0xBC
025E E0E2 LDI R30,2
025F 079E CPC R25,R30
0260 F378 BCS 0x0250
0261 5001 SUBI R16,1
0262 4010 SBCI R17,0
0263 2422 CLR R2
0264 2433 CLR R3
0265 1620 CP R2,R16
0266 0631 CPC R3,R17
0267 F30C BLT 0x0249
(0066)
(0067) return 0;
0268 2700 CLR R16
0269 2711 CLR R17
026A 9508 RET
_delay_us:
m --> R20
us --> R16
026B D6D6 RCALL push_gset1
(0068) }
(0069)
(0070) void delay_us(uint us)
(0071) {
(0072) uint m;
(0073) for (m=0;m<us;m++)
026C 2744 CLR R20
026D 2755 CLR R21
026E C008 RJMP 0x0277
(0074) {NOP();NOP();NOP();NOP();NOP();NOP();
026F 0000 NOP
0270 0000 NOP
0271 0000 NOP
0272 0000 NOP
0273 0000 NOP
0274 0000 NOP
0275 5F4F SUBI R20,0xFF
0276 4F5F SBCI R21,0xFF
0277 1740 CP R20,R16
0278 0751 CPC R21,R17
0279 F3A8 BCS 0x026F
(0075) }
(0076) }
027A D6CA RCALL pop_gset1
027B 9508 RET
FILE: E:\公司用\atmega8l\final\nrf905_send1\uart.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "confg.h"
(0004) /*****************************************/
(0005) //文件名:usart int .c
(0006) //功能:中断模式串口通信的应用
(0007) //目标MC U:ATYnega8
(0008) //晶振8MHZ
(0009) /*****************************************/
(0010) //通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0011)
(0012) #define fosc 4000000 //晶振频率
(0013) #define baud 9600 //波特率
(0014)
(0015)
(0016)
(0017) void putch(unsigned char c)
(0018) {
(0019) //等待写入UDR的字符被送到发送移位寄存器
(0020) while(!(UCSRA&(1<<UDRE)));
_putch:
c --> R16
027C 9B5D SBIS 0x0B,5
027D CFFE RJMP _putch
(0021) UDR=c;
027E B90C OUT 0x0C,R16
(0022) }
027F 9508 RET
(0023) //字符输入函数
(0024) unsigned char getch(void)
(0025) {
(0026) //等待接收字符
(0027) while(!(UCSRA&(1<<RXC))) ;
_getch:
0280 9B5F SBIS 0x0B,7
0281 CFFE RJMP _getch
(0028) return UDR;
0282 B10C IN R16,0x0C
0283 9508 RET
_putss:
s --> R20
0284 D6BD RCALL push_gset1
0285 01A8 MOVW R20,R16
(0029) }
(0030)
(0031) //字符串输出函数
(0032) int putss(char * s )
(0033) {
0286 C005 RJMP 0x028C
(0034) while(*s)
(0035) {
(0036) putch(*s);
0287 01FA MOVW R30,R20
0288 8100 LDD R16,Z+0
0289 DFF2 RCALL _putch
(0037) s++;
028A 5F4F SUBI R20,0xFF
028B 4F5F SBCI R21,0xFF
028C 01FA MOVW R30,R20
028D 8020 LDD R2,Z+0
028E 2022 TST R2
028F F7B9 BNE 0x0287
(0038) }
(0039) return 1;
0290 E001 LDI R16,1
0291 E010 LDI R17,0
0292 D6B2 RCALL pop_gset1
0293 9508 RET
_puts_hh:
s --> R20
0294 D6AD RCALL push_gset1
0295 01A8 MOVW R20,R16
(0040) }
(0041)
(0042) //含回车换行的字符串输出函数
(0043) void puts_hh(char *s)
(0044) {
0296 C005 RJMP 0x029C
(0045) while(*s)
(0046) {
(0047) putch(*s);
0297 01FA MOVW R30,R20
0298 8100 LDD R16,Z+0
0299 DFE2 RCALL _putch
(0048) s++;
029A 5F4F SUBI R20,0xFF
029B 4F5F SBCI R21,0xFF
029C 01FA MOVW R30,R20
029D 8020 LDD R2,Z+0
029E 2022 TST R2
029F F7B9 BNE 0x0297
(0049) }
(0050) putch(0X0A);//回车
02A0 E00A LDI R16,0xA
02A1 DFDA RCALL _putch
(0051) putch(0X0D);//换行
02A2 E00D LDI R16,0xD
02A3 DFD8 RCALL _putch
(0052) }
02A4 D6A0 RCALL pop_gset1
02A5 9508 RET
(0053) //UART初始化
(0054) void uart_init(void)
(0055) {
(0056) UCSRB=(1<<RXEN)|(1<<TXEN);
_uart_init:
02A6 E188 LDI R24,0x18
02A7 B98A OUT 0x0A,R24
(0057) UBRRL=(fosc/16/baud-1)%256;
02A8 E189 LDI R24,0x19
02A9 B989 OUT 0x09,R24
(0058) UBRRH=(fosc/16/baud-1)/256;
02AA 2422 CLR R2
02AB BC20 OUT 0x20,R2
(0059) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
02AC E886 LDI R24,0x86
02AD BD80 OUT 0x20,R24
(0060) //允许发送和接收,接收完成中断允许
(0061)
(0062) }
02AE 9508 RET
_AdcConvertStd:
min_value --> R14
max_value --> R20
min_id --> R12
max_id --> R10
ret --> Y+0
i --> R22
02AF D6B2 RCALL push_gset5
02B0 9722 SBIW R28,2
FILE: E:\公司用\atmega8l\final\nrf905_send1\ad.c
(0001)
(0002) /********************************
(0003) ATMega8 查询方式 A/D转换测试程序
(0004) 文件名:main.c
(0005) 编译:WinAVR-20070122
(0006)
(0007) 外部4MHz晶振
(0008) *******************************/
(0009)
(0010) #include "confg.h"
(0011)
(0012) #define _BV(n) (1<<n)
(0013)
(0014) static unsigned int g_aAdValue[8]; //A/D转换缓冲区
(0015)
(0016)
(0017) //AD转换8次去掉最高和最低后取平均值返回
(0018) unsigned int AdcConvertStd(void)
(0019) {
(0020) char i;
(0021) unsigned int ret;
(0022) char max_id,min_id,max_value,min_value;
(0023)
(0024) ADMUX=0X45;//参考电压VCC
02B1 E485 LDI R24,0x45
02B2 B987 OUT 0x07,R24
(0025) ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
02B3 E880 LDI R24,0x80
02B4 B986 OUT 0x06,R24
(0026) //连续转换8次
(0027) for(i=0;i<8;i++)
02B5 2766 CLR R22
02B6 C024 RJMP 0x02DB
(0028) {
(0029) ADCSRA|=_BV(ADSC);
02B7 9A36 SBI 0x06,6
(0030) delay_us(30);
02B8 E10E LDI R16,0x1E
02B9 E010 LDI R17,0
02BA DFB0 RCALL _delay_us
02BB C003 RJMP 0x02BF
(0031) while(ADCSRA&_BV(ADSC))
(0032) delay_us(30);
02BC E10E LDI R16,0x1E
02BD E010 LDI R17,0
02BE DFAC RCALL _delay_us
02BF 9936 SBIC 0x06,6
02C0 CFFB RJMP 0x02BC
(0033) ret=ADCL;
02C1 B024 IN R2,0x04
02C2 2433 CLR R3
02C3 8239 STD Y+1,R3
02C4 8228 STD Y+0,R2
(0034) ret|=(unsigned int)(ADCH<<8);
02C5 B025 IN R2,0x05
02C6 2433 CLR R3
02C7 2C32 MOV R3,R2
02C8 2422 CLR R2
02C9 8008 LDD R0,Y+0
02CA 8019 LDD R1,Y+1
02CB 2802 OR R0,R2
02CC 2813 OR R1,R3
02CD 8219 STD Y+1,R1
02CE 8208 STD Y+0,R0
(0035) g_aAdValue[i]=ret;
02CF E082 LDI R24,2
02D0 9F86 MUL R24,R22
02D1 01F0 MOVW R30,R0
02D2 E38D LDI R24,0x3D
02D3 E091 LDI R25,1
02D4 0FE8 ADD R30,R24
02D5 1FF9 ADC R31,R25
02D6 8008 LDD R0,Y+0
02D7 8019 LDD R1,Y+1
02D8 8211 STD Z+1,R1
02D9 8200 STD Z+0,R0
02DA 9563 INC R22
02DB 3068 CPI R22,0x8
02DC F2D0 BCS 0x02B7
(0036) }
(0037) ret=0;
02DD 2400 CLR R0
02DE 2411 CLR R1
02DF 8219 STD Y+1,R1
02E0 8208 STD Y+0,R0
(0038) for(i=1;i<8;i++)
02E1 E061 LDI R22,1
02E2 C010 RJMP 0x02F3
(0039) ret+=g_aAdValue[i];
02E3 E082 LDI R24,2
02E4 9F86 MUL R24,R22
02E5 01F0 MOVW R30,R0
02E6 E38D LDI R24,0x3D
02E7 E091 LDI R25,1
02E8 0FE8 ADD R30,R24
02E9 1FF9 ADC R31,R25
02EA 8020 LDD R2,Z+0
02EB 8031 LDD R3,Z+1
02EC 8008 LDD R0,Y+0
02ED 8019 LDD R1,Y+1
02EE 0C02 ADD R0,R2
02EF 1C13 ADC R1,R3
02F0 8219 STD Y+1,R1
02F1 8208 STD Y+0,R0
02F2 9563 INC R22
02F3 3068 CPI R22,0x8
02F4 F370 BCS 0x02E3
(0040)
(0041) //找到最大和最小值索引
(0042) ret/=7;
02F5 E027 LDI R18,7
02F6 E030 LDI R19,0
02F7 8108 LDD R16,Y+0
02F8 8119 LDD R17,Y+1
02F9 D58B RCALL div16u
02FA 8319 STD Y+1,R17
02FB 8308 STD Y+0,R16
(0043) max_id=min_id=1;
02FC 24CC CLR R12
02FD 94C3 INC R12
02FE 24AA CLR R10
02FF 94A3 INC R10
(0044) max_value=min_value=0;
0300 24EE CLR R14
0301 2744 CLR R20
(0045) for(i=1;i<8;i++)
0302 E061 LDI R22,1
0303 C04F RJMP 0x0353
(0046) {
(0047) if(g_aAdValue[i]>ret)
0304 E082 LDI R24,2
0305 9F86 MUL R24,R22
0306 01F0 MOVW R30,R0
0307 E38D LDI R24,0x3D
0308 E091 LDI R25,1
0309 0FE8 ADD R30,R24
030A 1FF9 ADC R31,R25
030B 8020 LDD R2,Z+0
030C 8031 LDD R3,Z+1
030D 8008 LDD R0,Y+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -