📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\012-WATCHDOG\main.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; a -> R20
0000 ; b -> R22
0000 ; i -> R16
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 26
0004 ; /*
0004 ; 实验十二:
0004 ; AVR内部看门口实验。
0004 ; 1、看门口实验。在主程序中周期喂狗,通过按下按键让程序无限循环,从而启动看门狗。
0004 ; 程序在启动时会检查启动方式,上电复位、掉电复位、外部复位、看门狗复位,显示出来。
0004 ; 上电复位: PB0 正常的通电复位。
0004 ; 外部复位: PB1 外部按键复位。
0004 ; 掉电复位: PB2 工作过程中电压瞬间跌落,硬件保护,这个对系统可靠性非常重要。
0004 ; 需要打开熔丝位里面的BOD功能才有效。
0004 ; 看门狗复位: PB3 看门狗定时器复位,用于程序死机保护,软件保护。
0004 ; JTAG复位: PB4 这个是仿真器复位,没什么大用外。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0004 ; 3、进行此实验请插上LED短路块。
0004 ; 4、通过此实验可了解看门狗的设置及看门狗的喂狗等,通过这个实验可以让你认识到复位功能和重要性。
0004 ; 5、看门狗复位的输入信号是按键7,当它长时间按下时,就会产生看门狗复位。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 16:20 2007-10-19
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ; #include <macros.h>
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 29
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 29
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 30
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 30
000C L7:
000C .dbline 30
000C 6395 inc R22
000E L9:
000E .dbline 30
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 31
0012 L3:
0012 .dbline 29
0012 4395 inc R20
0014 L5:
0014 .dbline 29
0014 4017 cp R20,R16
0016 C0F3 brlo L2
0018 .dbline -2
0018 L1:
0018 0E940000 xcall pop_gset2
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r a 20 c
001E .dbsym r b 22 c
001E .dbsym r i 16 c
001E .dbend
001E .dbfunc e io_init _io_init fV
.even
001E _io_init::
001E .dbline -1
001E .dbline 35
001E ; for (b = 1; b; b++);
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 37
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 38
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 39
0026 ; DDRB = 0xFF; /*方向输出*/
0026 87BB out 0x17,R24
0028 .dbline 40
0028 ; PORTB = 0xFF; /*输出高电平*/
0028 88BB out 0x18,R24
002A .dbline 41
002A ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002A 24BA out 0x14,R2
002C .dbline 42
002C ; PORTC = 0xFF;
002C 85BB out 0x15,R24
002E .dbline 43
002E ; DDRD = 0x00;
002E 21BA out 0x11,R2
0030 .dbline 44
0030 ; PORTD = 0xFF;
0030 82BB out 0x12,R24
0032 .dbline 45
0032 ; DDRE = 0x00;
0032 22B8 out 0x2,R2
0034 .dbline 46
0034 ; PORTE = 0xFF;
0034 83B9 out 0x3,R24
0036 .dbline 47
0036 ; DDRF = 0x00;
0036 20926100 sts 97,R2
003A .dbline 48
003A ; PORTF = 0xFF;
003A 80936200 sts 98,R24
003E .dbline 49
003E ; DDRG = 0x00;
003E 20926400 sts 100,R2
0042 .dbline 50
0042 ; PORTG = 0xFF;
0042 80936500 sts 101,R24
0046 .dbline -2
0046 L10:
0046 .dbline 0 ; func end
0046 0895 ret
0048 .dbend
0048 .dbfunc e main _main fV
.even
0048 _main::
0048 .dbline -1
0048 .dbline 53
0048 ; }
0048 ;
0048 ; void main(void) {
0048 .dbline 55
0048 ;
0048 ; io_init();
0048 EADF xcall _io_init
004A 06C0 xjmp L13
004C L12:
004C .dbline 56
004C .dbline 58
004C A895 wdr
004E .dbline 59
004E 28B2 in R2,0x18
0050 220C lsl R2
0052 28BA out 0x18,R2
0054 .dbline 60
0054 0AEF ldi R16,250
0056 D4DF xcall _delay_ms
0058 .dbline 61
0058 L13:
0058 .dbline 56
0058 ; while (PORTB) { /*启动指示*/
0058 28B2 in R2,0x18
005A 2220 tst R2
005C B9F7 brne L12
005E .dbline 63
005E ; /*喂狗,看门狗复位时不会清除看门狗时间,所以这里要喂狗*/
005E ; WDR();
005E ; PORTB <<= 1;
005E ; delay_ms(250);
005E ; }
005E ;
005E ; PORTB = ~(MCUCSR & 0x1F); /*指示复位类型*/
005E 84B7 in R24,0x34
0060 8F71 andi R24,31
0062 8095 com R24
0064 88BB out 0x18,R24
0066 .dbline 64
0066 ; MCUCSR = 0x00; /*清除复位标志*/
0066 2224 clr R2
0068 24BE out 0x34,R2
006A .dbline 66
006A ;
006A ; WDTCR |= ((1 << WDCE) | (1 << WDE)); /*启动时序*/
006A 81B5 in R24,0x21
006C 8861 ori R24,24
006E 81BD out 0x21,R24
0070 .dbline 67
0070 ; WDTCR = ((1<< WDE) | (1 << WDP2) | (1 <<WDP1)); /*设定周期为1S*/
0070 8EE0 ldi R24,14
0072 81BD out 0x21,R24
0074 0CC0 xjmp L16
0076 L15:
0076 .dbline 69
0076 ;
0076 ; while (1) {
0076 .dbline 70
0076 ; delay_ms(250);
0076 0AEF ldi R16,250
0078 C3DF xcall _delay_ms
007A .dbline 71
007A ; WDR(); /*喂狗*/
007A A895 wdr
007C .dbline 72
007C ; PORTB ^= (1 << PB7); /*PB7电平取反*/
007C 80E8 ldi R24,128
007E 90E0 ldi R25,0
0080 28B2 in R2,0x18
0082 3324 clr R3
0084 2826 eor R2,R24
0086 3926 eor R3,R25
0088 28BA out 0x18,R2
008A L18:
008A .dbline 73
008A L19:
008A .dbline 73
008A 0F9B sbis 0x1,7
008C FECF rjmp L18
008E .dbline 74
008E L16:
008E .dbline 69
008E F3CF xjmp L15
0090 X0:
0090 .dbline -2
0090 L11:
0090 .dbline 0 ; func end
0090 0895 ret
0092 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -