⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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 + -