📄 infrared_measure.lst
字号:
__start:
__text_start:
0016 E5CF LDI R28,0x5F
0017 E0D4 LDI R29,4
0018 BFCD OUT 0x3D,R28
0019 BFDE OUT 0x3E,R29
001A 51C0 SUBI R28,0x10
001B 40D0 SBCI R29,0
001C EA0A LDI R16,0xAA
001D 8308 STD Y+0,R16
001E 2400 CLR R0
001F E6E6 LDI R30,0x66
0020 E0F0 LDI R31,0
0021 E011 LDI R17,1
0022 33E5 CPI R30,0x35
0023 07F1 CPC R31,R17
0024 F011 BEQ 0x0027
0025 9201 ST R0,Z+
0026 CFFB RJMP 0x0022
0027 8300 STD Z+0,R16
0028 E2E6 LDI R30,0x26
0029 E0F0 LDI R31,0
002A E6A0 LDI R26,0x60
002B E0B0 LDI R27,0
002C E010 LDI R17,0
002D 32EC CPI R30,0x2C
002E 07F1 CPC R31,R17
002F F021 BEQ 0x0034
0030 95C8 LPM
0031 9631 ADIW R30,1
0032 920D ST R0,X+
0033 CFF9 RJMP 0x002D
0034 D09A RCALL _main
_exit:
0035 CFFF RJMP _exit
_delay_us:
i --> R20
n --> R16
0036 D171 RCALL push_gset1
FILE: E:\avr\开发板\source\INFRARED\infrared_measure\main.c
(0001) /******************************************/
(0002) /* 北京MCU学习之家 */
(0003) /* 采集红外输入数据的高低电平保持时间程序 */
(0004) /* 作者:白如冰 */
(0005) /* 2005年10月1日 */
(0006) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0007) /******************************************/
(0008) // 1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
(0009) // 2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
(0010) // 3、输出高低电平的保持时间,单位是微秒。
(0011) #include <iom8v.h>
(0012) #include "infrared_measure.h"
(0013) #define fosc 8000000 //晶振8MHZ
(0014) #define baud 9600 //波特率
(0015)
(0016) extern void init_infr(void);
(0017) unsigned char uia_data[5]; //5位ASC码存储区
(0018)
(0019) void delay_us(unsigned int n)
(0020) {
(0021) unsigned int i;
(0022) for(i=n;i>0;i--);
0037 01A8 MOVW R20,R16
0038 C002 RJMP 0x003B
0039 5041 SUBI R20,1
003A 4050 SBCI R21,0
003B 3040 CPI R20,0
003C 0745 CPC R20,R21
003D F7D9 BNE 0x0039
(0023) }
003E D16C RCALL pop_gset1
003F 9508 RET
(0024)
(0025) void delay_1ms(void)
(0026) { unsigned int i;
(0027) for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
i --> R16
0040 E001 LDI R16,1
0041 E010 LDI R17,0
0042 C002 RJMP 0x0045
0043 5F0F SUBI R16,0xFF
0044 4F1F SBCI R17,0xFF
0045 3706 CPI R16,0x76
0046 E0E4 LDI R30,4
0047 071E CPC R17,R30
0048 F3D0 BCS 0x0043
(0028) ;
(0029) }
0049 9508 RET
_delay_ms:
i --> R20
n --> R22
004A D174 RCALL push_gset2
004B 01B8 MOVW R22,R16
(0030) void delay_ms(unsigned int n)
(0031) {
(0032) unsigned int i=0;
004C 2744 CLR R20
004D 2755 CLR R21
004E C003 RJMP 0x0052
(0033) while(i<n)
(0034) {delay_1ms();
004F DFF0 RCALL _delay_1ms
(0035) i++;
0050 5F4F SUBI R20,0xFF
0051 4F5F SBCI R21,0xFF
0052 1746 CP R20,R22
0053 0757 CPC R21,R23
0054 F3D0 BCS 0x004F
(0036) }
(0037) }
0055 D14E RCALL pop_gset2
0056 9508 RET
_uint_asc:
temp --> R22
uia --> R20
data --> R10
0057 D16A RCALL push_gset3
0058 0158 MOVW R10,R16
(0038)
(0039) unsigned char *uint_asc(unsigned int data) //字转换为5位ASC码
(0040) {
(0041) unsigned char *uia;
(0042) unsigned int temp;
(0043) uia=uia_data;
0059 E646 LDI R20,0x66
005A E050 LDI R21,0
(0044)
(0045) temp=data;
005B 01B5 MOVW R22,R10
(0046) uia+=4;
005C 5F4C SUBI R20,0xFC
005D 4F5F SBCI R21,0xFF
(0047) *uia--=temp%10+0x30;
005E 011A MOVW R2,R20
005F 5041 SUBI R20,1
0060 4050 SBCI R21,0
0061 E02A LDI R18,0xA
0062 E030 LDI R19,0
0063 018B MOVW R16,R22
0064 D113 RCALL mod16u
0065 01C8 MOVW R24,R16
0066 96C0 ADIW R24,0x30
0067 01F1 MOVW R30,R2
0068 8380 STD Z+0,R24
(0048) temp=data;
(0049) *uia--=(temp/10)%10+0x30;
0069 011A MOVW R2,R20
006A 5041 SUBI R20,1
006B 4050 SBCI R21,0
006C E02A LDI R18,0xA
006D E030 LDI R19,0
006E 018B MOVW R16,R22
006F D10A RCALL div16u
0070 E02A LDI R18,0xA
0071 E030 LDI R19,0
0072 D105 RCALL mod16u
0073 01C8 MOVW R24,R16
0074 96C0 ADIW R24,0x30
0075 01F1 MOVW R30,R2
0076 8380 STD Z+0,R24
(0050) temp=data;
(0051) *uia--=(temp/100)%10+0x30;
0077 011A MOVW R2,R20
0078 5041 SUBI R20,1
0079 4050 SBCI R21,0
007A E624 LDI R18,0x64
007B E030 LDI R19,0
007C 018B MOVW R16,R22
007D D0FC RCALL div16u
007E E02A LDI R18,0xA
007F E030 LDI R19,0
0080 D0F7 RCALL mod16u
0081 01C8 MOVW R24,R16
0082 96C0 ADIW R24,0x30
0083 01F1 MOVW R30,R2
0084 8380 STD Z+0,R24
(0052) temp=data;
(0053) *uia--=(temp/1000)%10+0x30;
0085 011A MOVW R2,R20
0086 5041 SUBI R20,1
0087 4050 SBCI R21,0
0088 EE28 LDI R18,0xE8
0089 E033 LDI R19,3
008A 018B MOVW R16,R22
008B D0EE RCALL div16u
008C E02A LDI R18,0xA
008D E030 LDI R19,0
008E D0E9 RCALL mod16u
008F 01C8 MOVW R24,R16
0090 96C0 ADIW R24,0x30
0091 01F1 MOVW R30,R2
0092 8380 STD Z+0,R24
(0054) *uia=temp/10000+0x30;
0093 E120 LDI R18,0x10
0094 E237 LDI R19,0x27
0095 018B MOVW R16,R22
0096 D0E3 RCALL div16u
0097 01C8 MOVW R24,R16
0098 96C0 ADIW R24,0x30
0099 01FA MOVW R30,R20
009A 8380 STD Z+0,R24
(0055) uia=uia_data;
009B E646 LDI R20,0x66
009C E050 LDI R21,0
(0056) return(uia);
009D 018A MOVW R16,R20
009E D107 RCALL pop_gset3
009F 9508 RET
(0057) }
(0058)
(0059) /* 字符输出函数 */
(0060) void putchar(unsigned char c)
(0061) {
(0062) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00A0 9B5D SBIS 0x0B,5
00A1 CFFE RJMP _putchar
(0063) UDR=c;
00A2 B90C OUT 0x0C,R16
(0064) }
00A3 9508 RET
_puts:
s --> R20
00A4 D103 RCALL push_gset1
00A5 01A8 MOVW R20,R16
(0065)
(0066) /* 字符串输出函数 */
(0067) int puts(char *s)
(0068) {
00A6 C005 RJMP 0x00AC
(0069) while (*s)
(0070) {
(0071) putchar(*s);
00A7 01FA MOVW R30,R20
00A8 8100 LDD R16,Z+0
00A9 DFF6 RCALL _putchar
(0072) s++;
00AA 5F4F SUBI R20,0xFF
00AB 4F5F SBCI R21,0xFF
00AC 01FA MOVW R30,R20
00AD 8020 LDD R2,Z+0
00AE 2022 TST R2
00AF F7B9 BNE 0x00A7
(0073) }
(0074) return 1;
00B0 E001 LDI R16,1
00B1 E010 LDI R17,0
00B2 D0F8 RCALL pop_gset1
00B3 9508 RET
_puts_hh:
s --> R20
00B4 D0F3 RCALL push_gset1
00B5 01A8 MOVW R20,R16
(0075) }
(0076) /* 含回车换行的字符串输出函数 */
(0077) void puts_hh(char *s)
(0078) {
00B6 C005 RJMP 0x00BC
(0079) while (*s)
(0080) {
(0081) putchar(*s);
00B7 01FA MOVW R30,R20
00B8 8100 LDD R16,Z+0
00B9 DFE6 RCALL _putchar
(0082) s++;
00BA 5F4F SUBI R20,0xFF
00BB 4F5F SBCI R21,0xFF
00BC 01FA MOVW R30,R20
00BD 8020 LDD R2,Z+0
00BE 2022 TST R2
00BF F7B9 BNE 0x00B7
(0083) }
(0084) putchar(0x0a);//换行
00C0 E00A LDI R16,0xA
00C1 DFDE RCALL _putchar
(0085) putchar(0x0d);//回车
00C2 E00D LDI R16,0xD
00C3 DFDC RCALL _putchar
(0086) }
00C4 D0E6 RCALL pop_gset1
00C5 9508 RET
(0087) /* UART初始化 */
(0088) void uart_init(void)
(0089) {
(0090) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
_uart_init:
00C6 E188 LDI R24,0x18
00C7 B98A OUT 0x0A,R24
(0091) UBRRL=(fosc/16/(baud+1))%256;
00C8 E384 LDI R24,0x34
00C9 B989 OUT 0x09,R24
(0092) UBRRH=(fosc/16/(baud+1))/256;
00CA 2422 CLR R2
00CB BC20 OUT 0x20,R2
(0093) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
00CC E886 LDI R24,0x86
00CD BD80 OUT 0x20,R24
(0094) }
00CE 9508 RET
(0095)
(0096) void main(void)
(0097) {
(0098)
(0099) unsigned char i,*p;
(0100) uart_init();
_main:
p --> R22
i --> R20
00CF DFF6 RCALL _uart_init
(0101) init_infr();
00D0 D047 RCALL _init_infr
00D1 C044 RJMP 0x0116
(0102)
(0103)
(0104)
(0105)
(0106) while(1)
(0107) {
(0108) delay_ms(2000);
00D2 ED00 LDI R16,0xD0
00D3 E017 LDI R17,7
00D4 DF75 RCALL _delay_ms
(0109) for(i=0;i<100;i++)
00D5 2744 CLR R20
00D6 C023 RJMP 0x00FA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -