📄 infrared_test.lst
字号:
__start:
__text_start:
001F E5CF LDI R28,0x5F
0020 E0D4 LDI R29,4
0021 BFCD OUT 0x3D,R28
0022 BFDE OUT 0x3E,R29
0023 51C0 SUBI R28,0x10
0024 40D0 SBCI R29,0
0025 EA0A LDI R16,0xAA
0026 8308 STD Y+0,R16
0027 2400 CLR R0
0028 E7E7 LDI R30,0x77
0029 E0F0 LDI R31,0
002A E011 LDI R17,1
002B 31EB CPI R30,0x1B
002C 07F1 CPC R31,R17
002D F011 BEQ 0x0030
002E 9201 ST R0,Z+
002F CFFB RJMP 0x002B
0030 8300 STD Z+0,R16
0031 E2E6 LDI R30,0x26
0032 E0F0 LDI R31,0
0033 E6A0 LDI R26,0x60
0034 E0B0 LDI R27,0
0035 E010 LDI R17,0
0036 33ED CPI R30,0x3D
0037 07F1 CPC R31,R17
0038 F021 BEQ 0x003D
0039 95C8 LPM
003A 9631 ADIW R30,1
003B 920D ST R0,X+
003C CFF9 RJMP 0x0036
003D D09A RCALL _main
_exit:
003E CFFF RJMP _exit
_delay_us:
i --> R20
n --> R16
003F D2F6 RCALL push_gset1
FILE: D:\开发板\source\infrared\infrared_test\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)
(0011) #include <iom8v.h>
(0012) #include <macros.h>
(0013) #include "infrared_test.h"
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 9600 //波特率
(0016) #define buffer_max 75
(0017)
(0018) extern void init_infr(void);
(0019) unsigned char uia_data[5]; //5位ASC码存储区
(0020)
(0021) void delay_us(unsigned int n)
(0022) {
(0023) unsigned int i;
(0024) for(i=n;i>0;i--);
0040 01A8 MOVW R20,R16
0041 C002 RJMP 0x0044
0042 5041 SUBI R20,1
0043 4050 SBCI R21,0
0044 3040 CPI R20,0
0045 0745 CPC R20,R21
0046 F7D9 BNE 0x0042
0047 D2F1 RCALL pop_gset1
0048 9508 RET
(0025) }
(0026)
(0027) void delay_1ms(void)
(0028) { unsigned int i;
(0029) for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
i --> R16
0049 E001 LDI R16,1
004A E010 LDI R17,0
004B C002 RJMP 0x004E
004C 5F0F SUBI R16,0xFF
004D 4F1F SBCI R17,0xFF
004E 3706 CPI R16,0x76
004F E0E4 LDI R30,4
0050 071E CPC R17,R30
0051 F3D0 BCS 0x004C
0052 9508 RET
_delay_ms:
i --> R20
n --> R22
0053 D2E0 RCALL push_gset2
0054 01B8 MOVW R22,R16
(0030) ;
(0031) }
(0032) void delay_ms(unsigned int n)
(0033) {
(0034) unsigned int i=0;
0055 2744 CLR R20
0056 2755 CLR R21
0057 C003 RJMP 0x005B
(0035) while(i<n)
(0036) {delay_1ms();
0058 DFF0 RCALL _delay_1ms
(0037) i++;
0059 5F4F SUBI R20,0xFF
005A 4F5F SBCI R21,0xFF
005B 1746 CP R20,R22
005C 0757 CPC R21,R23
005D F3D0 BCS 0x0058
005E D2CB RCALL pop_gset2
005F 9508 RET
_uint_asc:
temp --> R22
uia --> R20
data --> R10
0060 D2D1 RCALL push_gset3
0061 0158 MOVW R10,R16
(0038) }
(0039) }
(0040)
(0041) unsigned char *uint_asc(unsigned int data) //字转换为5位ASC码
(0042) {
(0043) unsigned char *uia;
(0044) unsigned int temp;
(0045) uia=uia_data;
0062 E747 LDI R20,0x77
0063 E050 LDI R21,0
(0046)
(0047) temp=data;
0064 01B5 MOVW R22,R10
(0048) uia+=4;
0065 5F4C SUBI R20,0xFC
0066 4F5F SBCI R21,0xFF
(0049) *uia--=temp%10+0x30;
0067 011A MOVW R2,R20
0068 5041 SUBI R20,1
0069 4050 SBCI R21,0
006A E02A LDI R18,0xA
006B E030 LDI R19,0
006C 018B MOVW R16,R22
006D D290 RCALL mod16u
006E 01C8 MOVW R24,R16
006F 96C0 ADIW R24,0x30
0070 01F1 MOVW R30,R2
0071 8380 STD Z+0,R24
(0050) temp=data;
(0051) *uia--=(temp/10)%10+0x30;
0072 011A MOVW R2,R20
0073 5041 SUBI R20,1
0074 4050 SBCI R21,0
0075 E02A LDI R18,0xA
0076 E030 LDI R19,0
0077 018B MOVW R16,R22
0078 D287 RCALL div16u
0079 E02A LDI R18,0xA
007A E030 LDI R19,0
007B D282 RCALL mod16u
007C 01C8 MOVW R24,R16
007D 96C0 ADIW R24,0x30
007E 01F1 MOVW R30,R2
007F 8380 STD Z+0,R24
(0052) temp=data;
(0053) *uia--=(temp/100)%10+0x30;
0080 011A MOVW R2,R20
0081 5041 SUBI R20,1
0082 4050 SBCI R21,0
0083 E624 LDI R18,0x64
0084 E030 LDI R19,0
0085 018B MOVW R16,R22
0086 D279 RCALL div16u
0087 E02A LDI R18,0xA
0088 E030 LDI R19,0
0089 D274 RCALL mod16u
008A 01C8 MOVW R24,R16
008B 96C0 ADIW R24,0x30
008C 01F1 MOVW R30,R2
008D 8380 STD Z+0,R24
(0054) temp=data;
(0055) *uia--=(temp/1000)%10+0x30;
008E 011A MOVW R2,R20
008F 5041 SUBI R20,1
0090 4050 SBCI R21,0
0091 EE28 LDI R18,0xE8
0092 E033 LDI R19,3
0093 018B MOVW R16,R22
0094 D26B RCALL div16u
0095 E02A LDI R18,0xA
0096 E030 LDI R19,0
0097 D266 RCALL mod16u
0098 01C8 MOVW R24,R16
0099 96C0 ADIW R24,0x30
009A 01F1 MOVW R30,R2
009B 8380 STD Z+0,R24
(0056) *uia=temp/10000+0x30;
009C E120 LDI R18,0x10
009D E237 LDI R19,0x27
009E 018B MOVW R16,R22
009F D260 RCALL div16u
00A0 01C8 MOVW R24,R16
00A1 96C0 ADIW R24,0x30
00A2 01FA MOVW R30,R20
00A3 8380 STD Z+0,R24
(0057) uia=uia_data;
00A4 E747 LDI R20,0x77
00A5 E050 LDI R21,0
(0058) return(uia);
00A6 018A MOVW R16,R20
00A7 D284 RCALL pop_gset3
00A8 9508 RET
(0059) }
(0060)
(0061) /* 字符输出函数 */
(0062) void putchar(unsigned char c)
(0063) {
(0064) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
00A9 9B5D SBIS 0x0B,5
00AA CFFE RJMP _putchar
(0065) UDR=c;
00AB B90C OUT 0x0C,R16
00AC 9508 RET
_puts:
s --> R20
00AD D288 RCALL push_gset1
00AE 01A8 MOVW R20,R16
(0066) }
(0067)
(0068) /* 字符串输出函数 */
(0069) int puts(char *s)
(0070) {
00AF C005 RJMP 0x00B5
(0071) while (*s)
(0072) {
(0073) putchar(*s);
00B0 01FA MOVW R30,R20
00B1 8100 LDD R16,Z+0
00B2 DFF6 RCALL _putchar
(0074) s++;
00B3 5F4F SUBI R20,0xFF
00B4 4F5F SBCI R21,0xFF
00B5 01FA MOVW R30,R20
00B6 8020 LDD R2,Z+0
00B7 2022 TST R2
00B8 F7B9 BNE 0x00B0
(0075) }
(0076) return 1;
00B9 E001 LDI R16,1
00BA E010 LDI R17,0
00BB D27D RCALL pop_gset1
00BC 9508 RET
_puts_hh:
s --> R20
00BD D278 RCALL push_gset1
00BE 01A8 MOVW R20,R16
(0077) }
(0078) /* 含回车换行的字符串输出函数 */
(0079) void puts_hh(char *s)
(0080) {
00BF C005 RJMP 0x00C5
(0081) while (*s)
(0082) {
(0083) putchar(*s);
00C0 01FA MOVW R30,R20
00C1 8100 LDD R16,Z+0
00C2 DFE6 RCALL _putchar
(0084) s++;
00C3 5F4F SUBI R20,0xFF
00C4 4F5F SBCI R21,0xFF
00C5 01FA MOVW R30,R20
00C6 8020 LDD R2,Z+0
00C7 2022 TST R2
00C8 F7B9 BNE 0x00C0
(0085) }
(0086) putchar(0x0a);//换行
00C9 E00A LDI R16,0xA
00CA DFDE RCALL _putchar
(0087) putchar(0x0d);//回车
00CB E00D LDI R16,0xD
00CC DFDC RCALL _putchar
00CD D26B RCALL pop_gset1
00CE 9508 RET
(0088) }
(0089) /* UART初始化 */
(0090) void uart_init(void)
(0091) {
(0092) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
_uart_init:
00CF E188 LDI R24,0x18
00D0 B98A OUT 0x0A,R24
(0093) UBRRL=(fosc/16/(baud+1))%256;
00D1 E384 LDI R24,0x34
00D2 B989 OUT 0x09,R24
(0094) UBRRH=(fosc/16/(baud+1))/256;
00D3 2422 CLR R2
00D4 BC20 OUT 0x20,R2
(0095) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位停止位
00D5 E886 LDI R24,0x86
00D6 BD80 OUT 0x20,R24
00D7 9508 RET
(0096) }
(0097)
(0098) void main(void)
(0099) {
(0100) unsigned char i;
(0101)
(0102) uart_init();
_main:
i --> Y+1
00D8 DFF6 RCALL _uart_init
(0103) init_infr();
00D9 D07E RCALL _init_infr
00DA C07B RJMP 0x0156
(0104)
(0105) while(1)
(0106) {
(0107) puts("请按键: ");
00DB E60D LDI R16,0x6D
00DC E010 LDI R17,0
00DD DFCF RCALL _puts
(0108)
(0109) while(rece_flag==0);
00DE 90200116 LDS R2,rece_flag
00E0 2022 TST R2
00E1 F3E1 BEQ 0x00DE
(0110)
(0111) putchar(0x0a);//换行
00E2 E00A LDI R16,0xA
00E3 DFC5 RCALL _putchar
(0112) putchar(0x0d);//回车
00E4 E00D LDI R16,0xD
00E5 DFC3 RCALL _putchar
(0113) puts("您输入的是:");
00E6 E600 LDI R16,0x60
00E7 E010 LDI R17,0
00E8 DFC4 RCALL _puts
(0114) if((infra_data[0]==infra_data[1])&&
00E9 90200118 LDS R2,infra_data+1
00EB 90300117 LDS R3,infra_data
00ED 1432 CP R3,R2
00EE F009 BEQ 0x00F0
00EF C061 RJMP 0x0151
00F0 9020011A LDS R2,infra_data+3
00F2 9420 COM R2
00F3 90300119 LDS R3,infra_data+2
00F5 1432 CP R3,R2
00F6 F009 BEQ 0x00F8
00F7 C059 RJMP 0x0151
(0115) (infra_data[2]==(~infra_data[3])))
(0116) {
(0117) //如果是有效数据
(0118) switch(infra_data[2])
00F8 2D43 MOV R20,R3
00F9 2755 CLR R21
00FA 3040 CPI R20,0
00FB 0745 CPC R20,R21
00FC F129 BEQ 0x0122
00FD 3041 CPI R20,1
00FE E0E0 LDI R30,0
00FF 075E CPC R21,R30
0100 F121 BEQ 0x0125
0101 3042 CPI R20,2
0102 E0E0 LDI R30,0
0103 075E CPC R21,R30
0104 F119 BEQ 0x0128
0105 3043 CPI R20,3
0106 E0E0 LDI R30,0
0107 075E CPC R21,R30
0108 F111 BEQ 0x012B
0109 3044 CPI R20,4
010A E0E0 LDI R30,0
010B 075E CPC R21,R30
010C F109 BEQ 0x012E
010D 3045 CPI R20,5
010E E0E0 LDI R30,0
010F 075E CPC R21,R30
0110 F101 BEQ 0x0131
0111 3046 CPI R20,6
0112 E0E0 LDI R30,0
0113 075E CPC R21,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -