📄 avr.lst
字号:
__start:
__text_start:
0F06 EFCF LDI R28,0xFF
0F07 E1D0 LDI R29,0x10
0F08 BFCD OUT 0x3D,R28
0F09 BFDE OUT 0x3E,R29
0F0A 54C0 SUBI R28,0x40
0F0B 40D0 SBCI R29,0
0F0C EA0A LDI R16,0xAA
0F0D 8308 STD Y+0,R16
0F0E 2400 CLR R0
0F0F EDE8 LDI R30,0xD8
0F10 E0F6 LDI R31,6
0F11 E01B LDI R17,0xB
0F12 3BE8 CPI R30,0xB8
0F13 07F1 CPC R31,R17
0F14 F011 BEQ 0x0F17
0F15 9201 ST R0,Z+
0F16 CFFB RJMP 0x0F12
0F17 8300 STD Z+0,R16
0F18 E3E3 LDI R30,0x33
0F19 E1F8 LDI R31,0x18
0F1A E0A0 LDI R26,0
0F1B E0B1 LDI R27,1
0F1C E11E LDI R17,0x1E
0F1D 30EB CPI R30,0xB
0F1E 07F1 CPC R31,R17
0F1F F021 BEQ 0x0F24
0F20 95C8 LPM
0F21 9631 ADIW R30,1
0F22 920D ST R0,X+
0F23 CFF9 RJMP 0x0F1D
0F24 D012 RCALL _main
_exit:
0F25 CFFF RJMP _exit
__StackOverflowed:
c --> R20
0F26 940E43BD CALL push_gset1
0F28 2F40 MOV R20,R16
FILE: E:\电子制作\FAT_SD_MENU\Main\main.c
(0001) #include "SYS_Config.h"
(0002) #include "GUI_Config.h"
(0003) #include "FS_Config.h"
(0004) #include "time.h"
(0005) #include "KeyScan.h"
(0006)
(0007) #include "SD_Config.h"
(0008)
(0009) #include "GUI.h"
(0010) #include "Picture.h"
(0011)
(0012) #include "SD_EEPROM.h"
(0013) #include "SD_Drive.h"
(0014) #include "USART1.h"
(0015) #include "TEST_SD.h"
(0016)
(0017) #include "fat.h"
(0018)
(0019) INT8U Data_Buf[SD_BLOCKSIZE];
(0020) INT8U WritFileData[]="File system test!!!\n";
(0021)
(0022) //注明:堆在设为64,设为32会出现硬件堆在溢出的情况!!!
(0023) extern void MenuMainLoop(void);
(0024) //编译时间
(0025) extern void DispBuildTime(void);
(0026)
(0027) void _StackOverflowed(char c)
(0028) {
(0029) if (c == 1)
0F29 3041 CPI R20,1
0F2A F429 BNE 0x0F30
(0030) Uart1_SendString("\ntrashed HW stack\n");
0F2B E800 LDI R16,0x80
0F2C E011 LDI R17,1
0F2D 940E413C CALL _Uart1_SendString
0F2F C004 RJMP 0x0F34
(0031) else
(0032) Uart1_SendString("\ntrashed SW stack\n");
0F30 E60D LDI R16,0x6D
0F31 E011 LDI R17,1
0F32 940E413C CALL _Uart1_SendString
0F34 940E43C0 CALL pop_gset1
0F36 9508 RET
_main:
i --> Y+4
0F37 9723 SBIW R28,3
(0033) }
(0034)
(0035)
(0036) HANDLE FHandle;//文件系统句柄
(0037) void main(void)
(0038) {
(0039) INT8U i;
(0040)
(0041) GUI_Delay(500);//等待系统稳定,再作初始化
0F38 EF04 LDI R16,0xF4
0F39 E011 LDI R17,1
0F3A 940E3AAF CALL _GUI_Delay
(0042)
(0043) CLI();//关中断,对模块函数进行初始化
0F3C 94F8 BCLR 7
(0044) timer0_init();
0F3D D055 RCALL _timer0_init
(0045) timer2_init();
0F3E 940E327B CALL _timer2_init
(0046)
(0047) #if USART1_EN
(0048) Uart1_Init();
0F40 940E412D CALL _Uart1_Init
(0049) #endif
(0050)
(0051) #if (USART1_EN==1&&SD_MMC_TEST_EN==1)
(0052) Test_SD_Initialize(); //SD卡初始化(带串口输出功能)
(0053) #else
(0054) SD_Initialize();
0F42 940E33BB CALL _SD_Initialize
(0055) #endif
(0056)
(0057) GUI_Init();
0F44 940E3A98 CALL _GUI_Init
(0058) //编译时间
(0059) DispBuildTime();
0F46 940E164A CALL _DispBuildTime
0F48 940E4AA8 CALL 0x4AA8
(0060) GUI_Delay(10000);
(0061)
(0062) SEI();//开中断
0F4A 9478 BSET 7
(0063)
(0064) //GUI_Display_Image(PIC_FAT);
(0065)
(0066) #if SD_MMC_TEST_EN
(0067) SD_MMC_TEST(); //测试SD卡各项功能函数,正常使用时使SD_MMC_TEST_EN=0
(0068) #endif
(0069)
(0070) DiskInit(); //初始化磁盘管理模块
0F4B 940E1986 CALL _DiskInit
(0071) AddFileDriver( SD_Command );//加载SD卡驱动程序
0F4D E80C LDI R16,0x8C
0F4E E010 LDI R17,0
0F4F 940E19C8 CALL _AddFileDriver
(0072) FileInit();
0F51 940E2872 CALL _FileInit
(0073)
(0074) Uart1_SendString("\n\nMakeDir:");
0F53 E602 LDI R16,0x62
0F54 E011 LDI R17,1
0F55 940E413C CALL _Uart1_SendString
(0075) MakeDir("a:\\蒋金雄");
0F57 E508 LDI R16,0x58
0F58 E011 LDI R17,1
0F59 940E1828 CALL _MakeDir
(0076)
(0077) //Uart1_SendString("\n\nFileOpen_W:");
(0078) //FHandle = FileOpen("a:\\蒋金雄\\JJX.txt","w");
(0079)
(0080) //Uart1_SendString("\n\nFileWrite:");
(0081) //FileWrite(WritFileData,sizeof(WritFileData), FHandle);
(0082)
(0083) //Uart1_SendString("\n\nFileClose:");
(0084) //FileClose(FHandle);
(0085)
(0086) Uart1_SendString("\n\nFileOpen:");
0F5B E40C LDI R16,0x4C
0F5C E011 LDI R17,1
0F5D 940E413C CALL _Uart1_SendString
(0087) FHandle = FileOpen("a:\\蒋金雄\\JJX.txt","r");
0F5F E328 LDI R18,0x38
0F60 E031 LDI R19,1
0F61 E30A LDI R16,0x3A
0F62 E011 LDI R17,1
0F63 940E2B35 CALL _FileOpen
0F65 930006D8 STS FHandle,R16
(0088)
(0089) Uart1_SendString("\n\nFileRead:");
0F67 E20C LDI R16,0x2C
0F68 E011 LDI R17,1
0F69 940E413C CALL _Uart1_SendString
(0090) FileRead(Data_Buf,512,FHandle);
0F6B 902006D8 LDS R2,FHandle
0F6D 822A STD Y+2,R2
0F6E E040 LDI R20,0
0F6F E052 LDI R21,2
0F70 940E48FD CALL 0x48FD
0F72 ED09 LDI R16,0xD9
0F73 E016 LDI R17,6
0F74 940E2CE8 CALL _FileRead
(0091)
(0092) Uart1_SendString("\n\nFileClose:");
0F76 E10F LDI R16,0x1F
0F77 E011 LDI R17,1
0F78 940E413C CALL _Uart1_SendString
(0093) FileClose(FHandle);
0F7A 910006D8 LDS R16,FHandle
0F7C 940E2B62 CALL _FileClose
(0094)
(0095) Uart1_SendString("\n\nOUTPUT:");
0F7E E105 LDI R16,0x15
0F7F E011 LDI R17,1
0F80 940E413C CALL _Uart1_SendString
(0096) Uart1_SendString(Data_Buf);
0F82 ED09 LDI R16,0xD9
0F83 E016 LDI R17,6
0F84 940E413C CALL _Uart1_SendString
(0097)
(0098)
(0099) AllCacheWriteBack();
0F86 940E30D5 CALL _AllCacheWriteBack
(0100) RemoveFileDriver(0);
0F88 2700 CLR R16
0F89 940E1C1C CALL _RemoveFileDriver
0F8B C004 RJMP 0x0F90
(0101)
(0102) while(1)
(0103) {
(0104) _StackCheck();//堆在检查函数
0F8C 940E44AC CALL __StackCheck
(0105)
(0106) MenuMainLoop();
0F8E 940E1664 CALL _MenuMainLoop
0F90 CFFB RJMP 0x0F8C
0F91 9623 ADIW R28,3
0F92 9508 RET
FILE: E:\电子制作\FAT_SD_MENU\MENU\KeyScan.C
(0001) #include "SYS_Config.h"
(0002) #include "KeyScan.h"
(0003)
(0004) /****************************************************************************
(0005) * KeyScan - 键盘扫描函数
(0006) * 判4个按键那个有按下
(0007) * @Return :有按键 返回键值 无按键 返回FALSE 因此键值定义不能为FALSE
(0008) *****************************************************************************/
(0009) //ICC-AVR application builder : 2008-5-20 上午 09:01:00
(0010) // Target : M64
(0011) // Crystal: 16.000Mhz
(0012) // TIMER0 initialize - prescale:1024
(0013) // WGM: Normal
(0014) // desired value: 10mSec
(0015) // actual value: 9.984mSec (0.2%)
(0016) void timer0_init(void)
(0017) {
(0018) Key0_IN();
_timer0_init:
0F93 91800061 LDS R24,0x61
0F95 7F8E ANDI R24,0xFE
0F96 940E4B92 CALL 0x4B92
0F98 6081 ORI R24,1
0F99 940E4CA3 CALL 0x4CA3
(0019) Key1_IN();
0F9B 7F8D ANDI R24,0xFD
0F9C 940E4B92 CALL 0x4B92
0F9E 6082 ORI R24,2
0F9F 940E4CA3 CALL 0x4CA3
(0020) Key2_IN();
0FA1 7F8B ANDI R24,0xFB
0FA2 940E4B92 CALL 0x4B92
0FA4 6084 ORI R24,4
0FA5 940E4CA3 CALL 0x4CA3
(0021) Key3_IN();
0FA7 7F87 ANDI R24,0xF7
0FA8 940E4B92 CALL 0x4B92
0FAA 6088 ORI R24,0x8
0FAB 93800062 STS 0x62,R24
(0022)
(0023) TCCR0 = 0x00; //stop
0FAD 2422 CLR R2
0FAE BE23 OUT 0x33,R2
(0024) ASSR = 0x00; //set async mode
0FAF BE20 OUT 0x30,R2
(0025) TCNT0 = 0x64; //set count
0FB0 E684 LDI R24,0x64
0FB1 BF82 OUT 0x32,R24
(0026) OCR0 = 0x9C;
0FB2 E98C LDI R24,0x9C
0FB3 BF81 OUT 0x31,R24
(0027) TCCR0 = 0x07; //start timer
0FB4 E087 LDI R24,7
0FB5 BF83 OUT 0x33,R24
(0028)
(0029) TIMSK|= 0x01; //timer interrupt sources
0FB6 B787 IN R24,0x37
0FB7 6081 ORI R24,1
0FB8 BF87 OUT 0x37,R24
0FB9 9508 RET
_timer0_ovf_isr:
0FBA 922A ST R2,-Y
0FBB 923A ST R3,-Y
0FBC 930A ST R16,-Y
0FBD 931A ST R17,-Y
0FBE 938A ST R24,-Y
0FBF 939A ST R25,-Y
0FC0 93EA ST R30,-Y
0FC1 B62F IN R2,0x3F
0FC2 922A ST R2,-Y
(0030) }
(0031)
(0032) INT8U Keyvalue=0;
(0033) INT8U Key_Deal_Flag=0;
(0034) INT8U Keyvalue_first,Keyvalue_second;
(0035) INT8U Count0=0,Key_time=0;
(0036)
(0037) #pragma interrupt_handler timer0_ovf_isr:17
(0038) void timer0_ovf_isr(void)
(0039) {
(0040) TCNT0 = 0x64; //reload counter value
0FC3 E684 LDI R24,0x64
0FC4 BF82 OUT 0x32,R24
(0041)
(0042) Count0++;
0FC5 91800195 LDS R24,Count0
0FC7 5F8F SUBI R24,0xFF
0FC8 93800195 STS Count0,R24
(0043) if(Count0==1)
0FCA 3081 CPI R24,1
0FCB F449 BNE 0x0FD5
(0044) {
(0045) Keyvalue_first=Key_STATUS();
0FCC B180 IN R24,0x00
0FCD 708F ANDI R24,0xF
0FCE 938008DA STS Keyvalue_first,R24
(0046) if(Keyvalue_first==0x0F)
0FD0 308F CPI R24,0xF
0FD1 F419 BNE 0x0FD5
(0047) Count0=0;
0FD2 2422 CLR R2
0FD3 92200195 STS Count0,R2
(0048) }
(0049) if(Count0>=15)//隔140ms再来检测一次
0FD5 91800195 LDS R24,Count0
0FD7 308F CPI R24,0xF
0FD8 F1A0 BCS 0x100D
(0050) {
(0051) Count0=0;
0FD9 2422 CLR R2
0FDA 92200195 STS Count0,R2
(0052) Keyvalue_second=Key_STATUS();
0FDC B180 IN R24,0x00
0FDD 708F ANDI R24,0xF
0FDE 938008D9 STS Keyvalue_second,R24
(0053) if(Keyvalue_first==Keyvalue_second)//如果相等,则为有效按键
0FE0 903008DA LDS R3,Keyvalue_first
0FE2 1638 CP R3,R24
0FE3 F549 BNE 0x100D
(0054) {
(0055) Key_Deal_Flag=1;
0FE4 E081 LDI R24,1
0FE5 93800194 STS Key_Deal_Flag,R24
(0056) switch(Keyvalue_first)
0FE7 2D03 MOV R16,R3
0FE8 2711 CLR R17
0FE9 3007 CPI R16,7
0FEA E0E0 LDI R30,0
0FEB 071E CPC R17,R30
0FEC F0C9 BEQ 0x1006
0FED 300B CPI R16,0xB
0FEE E0E0 LDI R30,0
0FEF 071E CPC R17,R30
0FF0 F089 BEQ 0x1002
0FF1 300D CPI R16,0xD
0FF2 E0E0 LDI R30,0
0FF3 071E CPC R17,R30
0FF4 F049 BEQ 0x0FFE
0FF5 300E CPI R16,0xE
0FF6 E0E0 LDI R30,0
0FF7 071E CPC R17,R30
0FF8 F009 BEQ 0x0FFA
0FF9 C010 RJMP 0x100A
(0057) {
(0058) case 0x0E:Keyvalue=Key_Up; break;
0FFA E182 LDI R24,0x12
0FFB 93800193 STS Keyvalue,R24
0FFD C00F RJMP 0x100D
(0059) case 0x0D:Keyvalue=Key_Right;break;
0FFE E184 LDI R24,0x14
0FFF 93800193 STS Keyvalue,R24
1001 C00B RJMP 0x100D
(0060) case 0x0B:Keyvalue=Key_Left; break;
1002 E183 LDI R24,0x13
1003 93800193 STS Keyvalue,R24
1005 C007 RJMP 0x100D
(0061) case 0x07:Keyvalue=Key_Down; break;
1006 E181 LDI R24,0x11
1007 93800193 STS Keyvalue,R24
1009 C003 RJMP 0x100D
(0062) default: Keyvalue=FALSE ; break;//同时有两个以上按键,视为无效
100A 2422 CLR R2
100B 92200193 STS Keyvalue,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -