📄 main.lst
字号:
__start:
__text_start:
003C E5CF LDI R28,0x5F
003D E0D4 LDI R29,4
003E BFCD OUT 0x3D,R28
003F BFDE OUT 0x3E,R29
0040 51C0 SUBI R28,0x10
0041 40D0 SBCI R29,0
0042 EA0A LDI R16,0xAA
0043 8308 STD Y+0,R16
0044 2400 CLR R0
0045 E6E2 LDI R30,0x62
0046 E0F0 LDI R31,0
0047 E010 LDI R17,0
0048 36E6 CPI R30,0x66
0049 07F1 CPC R31,R17
004A F011 BEQ 0x004D
004B 9201 ST R0,Z+
004C CFFB RJMP 0x0048
004D 8300 STD Z+0,R16
004E E7E5 LDI R30,0x75
004F E0F0 LDI R31,0
0050 E6A0 LDI R26,0x60
0051 E0B0 LDI R27,0
0052 E010 LDI R17,0
0053 37E7 CPI R30,0x77
0054 07F1 CPC R31,R17
0055 F021 BEQ 0x005A
0056 95C8 LPM
0057 9631 ADIW R30,1
0058 920D ST R0,X+
0059 CFF9 RJMP 0x0053
005A 940E0196 CALL _main
_exit:
005C CFFF RJMP _exit
_Delay100us:
i --> R20
n --> R16
005D 940E01EC CALL push_gset1
FILE: D:\avrvi\democode\key_4\source\lib\delay.c
(0001) /************************************************************
(0002) 文 件:delay.c
(0003) 用 途:delay100us和delay10ms软件延时函数
(0004) Target : 任意AVR
(0005) Crystal: #define F_CPU 进行设置
(0006) 说 明:请与delay.h配合使用
(0007) 请根据实际定义 #define F_CPU 为晶振大小
(0008) 有中断时,延时将不再准确
(0009) 创 建:2008.1.29
(0010) 修 改:2008.1.29
(0011) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0012) ************************************************************/
(0013)
(0014) #include "..\config.h"
(0015)
(0016)
(0017)
(0018) //需要根据频率调整循环变量
(0019) #ifndef F_CPU
(0020) #define F_CPU 1000000 //晶振频率
(0021) #endif
(0022)
(0023)
(0024) /*******************************************
(0025) ** 函数名称: void Delay100us(uint8 n)
(0026) ** 功能描述: 100us延时函数
(0027) ** 输 入: 延时的时间
(0028) ** 输出 : 无
(0029) ** 全局变量: 无
(0030) ** 调用模块:
(0031) ** 说明:最大参数为255
(0032) ** 注意:如果中途有中断发生,延时将不只100us
(0033) ********************************************/
(0034) #define CONT_DELAY100US_COUNT F_CPU/100000
(0035) void Delay100us(uint8 n) //最大255
(0036) {
005F C00A RJMP 0x006A
(0037) uint8 i;
(0038) while(n--) //5 clk
(0039) {
(0040) i=CONT_DELAY100US_COUNT; //1 clk
0060 E04A LDI R20,0xA
0061 C003 RJMP 0x0065
(0041) while(--i)
(0042) {
(0043) NOP();
0062 0000 NOP
(0044) NOP();
0063 0000 NOP
(0045) NOP();
0064 0000 NOP
0065 2F84 MOV R24,R20
0066 5081 SUBI R24,1
0067 2F48 MOV R20,R24
0068 2388 TST R24
0069 F7C1 BNE 0x0062
006A 2E20 MOV R2,R16
006B 2433 CLR R3
006C 5001 SUBI R16,1
006D 2022 TST R2
006E F789 BNE 0x0060
006F 940E01EF CALL pop_gset1
0071 9508 RET
_Delay10ms:
i --> R20
n --> R16
0072 940E01EC CALL push_gset1
(0046) } //10 clk
(0047) }
(0048) }
(0049)
(0050) /*******************************************
(0051) ** 函数名称: void Delay10ms(uint8 n)
(0052) ** 功能描述: 10ms延时函数
(0053) ** 输 入: 延时的时间
(0054) ** 输出 : 无
(0055) ** 全局变量: 无
(0056) ** 调用模块:
(0057) ** 说明:最大参数为255
(0058) ** 注意:如果中途有中断发生,延时将不只10ms
(0059) ********************************************/
(0060) #define CONT_DELAY10MS_COUNT F_CPU/1000
(0061) void Delay10ms(uint8 n) //最大255
(0062) {
0074 C00C RJMP 0x0081
(0063) uint16 i;
(0064) while(n--) //5 clk
(0065) {
(0066) i=CONT_DELAY10MS_COUNT; //1 clk
0075 EE48 LDI R20,0xE8
0076 E053 LDI R21,3
0077 C003 RJMP 0x007B
(0067) while(--i)
(0068) {
(0069) NOP();
0078 0000 NOP
(0070) NOP();
0079 0000 NOP
(0071) NOP();
007A 0000 NOP
007B 01CA MOVW R24,R20
007C 9701 SBIW R24,1
007D 01AC MOVW R20,R24
007E 3040 CPI R20,0
007F 0745 CPC R20,R21
0080 F7B9 BNE 0x0078
0081 2E20 MOV R2,R16
0082 2433 CLR R3
0083 5001 SUBI R16,1
0084 2022 TST R2
0085 F779 BNE 0x0075
0086 940E01EF CALL pop_gset1
0088 9508 RET
FILE: D:\avrvi\democode\key_4\source\lib\7segled.c
(0001) /************************************************
(0002) 文件:7segled.c
(0003) 用途:七段数码管驱动程序
(0004) 注意:外部7.3728M晶振
(0005) 创建:2008.1.26
(0006) 修改:2008.1.26
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) #pragma data:code
(0011) const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,4
(0012) 0x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9
(0013) 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f
(0014) #pragma data:data
(0015) volatile unsigned char Seg7_Led_Buf[4];
(0016) void Seg7_Led_Init(void)
(0017) {
(0018) Seg7_Data_Ddr=0xff;
_Seg7_Led_Init:
0089 EF8F LDI R24,0xFF
008A BB87 OUT 0x17,R24
(0019) Seg7_Data_Port=0x00;
008B 2422 CLR R2
008C BA28 OUT 0x18,R2
(0020) Seg7_Bitselect_Port&=~((1<<Seg7_Bit0)|(1<<Seg7_Bit1)|(1<<Seg7_Bit2)|(1<<Seg7_Bit3));
008D B385 IN R24,0x15
008E 738C ANDI R24,0x3C
008F BB85 OUT 0x15,R24
(0021) Seg7_Bitselect_Ddr|=((1<<Seg7_Bit0)|(1<<Seg7_Bit1)|(1<<Seg7_Bit2)|(1<<Seg7_Bit3));
0090 B384 IN R24,0x14
0091 6C83 ORI R24,0xC3
0092 BB84 OUT 0x14,R24
(0022) Seg7_Led_Buf[0]=16;
0093 E180 LDI R24,0x10
0094 93800062 STS Seg7_Led_Buf,R24
(0023) Seg7_Led_Buf[1]=16;
0096 93800063 STS Seg7_Led_Buf+1,R24
(0024) Seg7_Led_Buf[2]=16;
0098 93800064 STS Seg7_Led_Buf+2,R24
(0025) Seg7_Led_Buf[3]=16;
009A 93800065 STS Seg7_Led_Buf+3,R24
009C 9508 RET
(0026) }
(0027)
(0028) void Seg7_Led_Update(void)
(0029) {
(0030) Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[0]];
_Seg7_Led_Update:
009D E584 LDI R24,0x54
009E E090 LDI R25,0
009F 91E00062 LDS R30,Seg7_Led_Buf
00A1 27FF CLR R31
00A2 0FE8 ADD R30,R24
00A3 1FF9 ADC R31,R25
00A4 91E4 LPM R30,0(Z)
00A5 BBE8 OUT 0x18,R30
(0031) Seg7_Bit0_En();
00A6 9AA7 SBI 0x14,7
00A7 9AAF SBI 0x15,7
(0032) Delay100us(60);
00A8 E30C LDI R16,0x3C
00A9 940E005D CALL _Delay100us
(0033) Seg7_Bit0_Dis();
00AB 9AA7 SBI 0x14,7
00AC 98AF CBI 0x15,7
(0034) Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[1]];
00AD E584 LDI R24,0x54
00AE E090 LDI R25,0
00AF 91E00063 LDS R30,Seg7_Led_Buf+1
00B1 27FF CLR R31
00B2 0FE8 ADD R30,R24
00B3 1FF9 ADC R31,R25
00B4 91E4 LPM R30,0(Z)
00B5 BBE8 OUT 0x18,R30
(0035) Seg7_Bit1_En();
00B6 9AA6 SBI 0x14,6
00B7 9AAE SBI 0x15,6
(0036) Delay100us(60);
00B8 E30C LDI R16,0x3C
00B9 940E005D CALL _Delay100us
(0037) Seg7_Bit1_Dis();
00BB 9AA6 SBI 0x14,6
00BC 98AE CBI 0x15,6
(0038) Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[2]];
00BD E584 LDI R24,0x54
00BE E090 LDI R25,0
00BF 91E00064 LDS R30,Seg7_Led_Buf+2
00C1 27FF CLR R31
00C2 0FE8 ADD R30,R24
00C3 1FF9 ADC R31,R25
00C4 91E4 LPM R30,0(Z)
00C5 BBE8 OUT 0x18,R30
(0039) Seg7_Bit2_En();
00C6 9AA1 SBI 0x14,1
00C7 9AA9 SBI 0x15,1
(0040) Delay100us(60);
00C8 E30C LDI R16,0x3C
00C9 940E005D CALL _Delay100us
(0041) Seg7_Bit2_Dis();
00CB 9AA1 SBI 0x14,1
00CC 98A9 CBI 0x15,1
(0042) Seg7_Data_Port=Seg7_Data[Seg7_Led_Buf[3]];
00CD E584 LDI R24,0x54
00CE E090 LDI R25,0
00CF 91E00065 LDS R30,Seg7_Led_Buf+3
00D1 27FF CLR R31
00D2 0FE8 ADD R30,R24
00D3 1FF9 ADC R31,R25
00D4 91E4 LPM R30,0(Z)
00D5 BBE8 OUT 0x18,R30
(0043) Seg7_Bit3_En();
00D6 9AA0 SBI 0x14,0
00D7 9AA8 SBI 0x15,0
(0044) Delay100us(60);
00D8 E30C LDI R16,0x3C
00D9 940E005D CALL _Delay100us
(0045) Seg7_Bit3_Dis();
00DB 9AA0 SBI 0x14,0
00DC 98A8 CBI 0x15,0
00DD 9508 RET
_Seg7_Led_display:
data --> R20
00DE 940E01EC CALL push_gset1
00E0 01A8 MOVW R20,R16
(0046) }
(0047)
(0048) void Seg7_Led_display(unsigned int data)
(0049) {
(0050) Seg7_Led_Buf[3]=data/1000;
00E1 EE28 LDI R18,0xE8
00E2 E033 LDI R19,3
00E3 018A MOVW R16,R20
00E4 940E01C7 CALL div16u
00E6 93000065 STS Seg7_Led_Buf+3,R16
(0051) Seg7_Led_Buf[2]=(data%1000)/100;
00E8 EE28 LDI R18,0xE8
00E9 E033 LDI R19,3
00EA 018A MOVW R16,R20
00EB 940E01C5 CALL mod16u
00ED E624 LDI R18,0x64
00EE E030 LDI R19,0
00EF 940E01C7 CALL div16u
00F1 93000064 STS Seg7_Led_Buf+2,R16
(0052) Seg7_Led_Buf[1]=(data%100)/10;
00F3 E624 LDI R18,0x64
00F4 E030 LDI R19,0
00F5 018A MOVW R16,R20
00F6 940E01C5 CALL mod16u
00F8 E02A LDI R18,0xA
00F9 E030 LDI R19,0
00FA 940E01C7 CALL div16u
00FC 93000063 STS Seg7_Led_Buf+1,R16
(0053) Seg7_Led_Buf[0]=data%10;
00FE E02A LDI R18,0xA
00FF E030 LDI R19,0
0100 018A MOVW R16,R20
0101 940E01C5 CALL mod16u
0103 93000062 STS Seg7_Led_Buf,R16
(0054) Seg7_Led_Update();
0105 DF97 RCALL _Seg7_Led_Update
0106 940E01EF CALL pop_gset1
0108 9508 RET
_int_isr:
0109 940E0203 CALL push_lset
FILE: D:\avrvi\democode\key_4\source\lib\key_board.c
(0001) /**************************************
(0002) ** Filename: key_board.c
(0003) ** Describe: 矩阵键盘程序
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time : 2007-2-15
(0006) **************************************/
(0007)
(0008) #include "..\config.h"
(0009)
(0010) const uint8 key_board_table[]={0,1,2,3,
(0011) 4,5,6,7,
(0012) 8,9,10,11,
(0013) 12,13,14,15};
(0014) //键值可以任意设定,请不要使用0xFF
(0015) //const uint8 key_board_table[]={0,1,2,3,4,5,6,7,8,9,10,11,'A','B','C','D'};
(0016)
(0017) //如果使用中断
(0018) #if KEY_USE_INT==1
(0019) volatile uint8 KEY_FLAG=0,key=0xff; //加 volatile 允许在中断中修改
(0020) #pragma interrupt_handler int_isr:IV_number
(0021) void int_isr(void)
(0022) {
(0023) KEY_FLAG = 1; //中断中标记已经产生按键中断,由于使用低电平触发方式,不用再考虑防抖问题
010B E081 LDI R24,1
010C 93800060 STS KEY_FLAG,R24
(0024) key = key_board_get_key(); //读取键值
010E D01A RCALL _key_board_get_key
010F 93000061 STS key,R16
0111 940E021A CALL pop_lset
0113 9518 RETI
(0025) }
(0026) #endif
(0027)
(0028) /***********************************************************
(0029) ** 函数名称: void key_board_int(void)
(0030) ** 功能描述: 中断脚初始化
(0031) ** 输 入: 无
(0032) ** 输出 : 无
(0033) ** 全局变量: 无
(0034) ** 调用模块:
(0035) ** 说明:输入,并使能内部上拉
(0036) ** 注意:
(0037) **********************************************************/
(0038) void key_int_init(void)
(0039) {
(0040) KEY_INT_DDR &=~ (1<<KEY_INT);
_key_int_init:
0114 988A CBI 0x11,2
(0041) KEY_INT_RORT |= (1<<KEY_INT);
0115 9A92 SBI 0x12,2
(0042) GICR |= (1<<INT_BIT); //中断允许位,如INT0
0116 B78B IN R24,0x3B
0117 6480 ORI R24,0x40
0118 BF8B OUT 0x3B,R24
0119 9508 RET
(0043) }
(0044)
(0045) /***********************************************************
(0046) ** 函数名称: void key_board_int(void)
(0047) ** 功能描述: 矩阵键盘扫描初始化
(0048) ** 输 入: 无
(0049) ** 输出 : 无
(0050) ** 全局变量: 无
(0051) ** 调用模块:
(0052) ** 说明:默认初始化为行输出低,列输入,并使能内部上拉
(0053) ** 注意:
(0054) **********************************************************/
(0055)
(0056) void key_board_int(void)
(0057) {
(0058) KEY_DDR_ROW |= KEY_ROW_ALL; //行输出,低
_key_board_int:
011A B38A IN R24,0x1A
011B 6F80 ORI R24,0xF0
011C BB8A OUT 0x1A,R24
(0059) KEY_PORT_ROW &=~ KEY_ROW_ALL;
011D B38B IN R24,0x1B
011E 708F ANDI R24,0xF
011F BB8B OUT 0x1B,R24
(0060) KEY_DDR_COL &=~ KEY_COL_ALL; //列输入,并使能内部上拉
0120 B38A IN R24,0x1A
0121 7F80 ANDI R24,0xF0
0122 BB8A OUT 0x1A,R24
(0061) KEY_PORT_COL |= KEY_COL_ALL;
0123 B38B IN R24,0x1B
0124 608F ORI R24,0xF
0125 BB8B OUT 0x1B,R24
(0062) #if BEEP_EN ==1
(0063) BEEP_DDR |= (1<<BEEP_BIT);
0126 9A88 SBI 0x11,0
(0064) BEEP_PORT &=~ (1<<BEEP_BIT);
0127 9890 CBI 0x12,0
0128 9508 RET
_key_board_get_key:
key_i --> R20
temp_key --> R22
0129 940E01E8 CALL push_gset3
(0065) #endif
(0066) }
(0067)
(0068) /***********************************************************
(0069) ** 函数名称: uint8 key_board_get_key(void)
(0070) ** 功能描述: 矩阵键盘扫描并读取键值
(0071) ** 输 入: 无
(0072) ** 输出 : 按键的键值,在key_board_table[]定义,无按键返回0xFF
(0073) ** 全局变量: 无
(0074) ** 调用模块: void key_board_int(void)
(0075) ** 说明:通过预定义#define WAIT_KEY_UP设置等待按键抬起(1),不等待按键抬起(0)
(0076) ** 注意:如果不等待按键抬起,很容易产生粘贴键,注意在程序中处理。
(0077) **********************************************************/
(0078)
(0079) uint8 key_board_get_key(void)
(0080) {
(0081) uint8 key_i=0,temp_key=0;
012B 2744 CLR R20
012C 2766 CLR R22
(0082) if(HAVE_KEY_DOWN)
012D B389 IN R24,0x19
012E 708F ANDI R24,0xF
012F 308F CPI R24,0xF
0130 F409 BNE 0x0132
0131 C060 RJMP 0x0192
(0083) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -