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

📄 main.lis

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LIS
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\ICCAVR\project\AVRMEG~3\icc\013-EEPROM-LED\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 20
 0004           ; /*
 0004           ; 实验十三:
 0004           ; 
 0004           ;       片内EEPROM读写实险。
 0004           ;       1、用内部EEPROM记录CPU启动次数,并在PB口上显示出来。
 0004           ;       2、内部1 M晶振,程序采用单任务方式,软件延时。
 0004           ;       3、进行此实验请插上LED短路块。
 0004           ;       4、通过此实验,可以对对内部EEPROM有个初步认识,了解EEPROM函数的操作。
 0004           ;       5、可过复位键让系统重启,这样就可以更新显示了。
 0004           ;       6、EEPORM读写函数可以嵌入到项目当中直接使用。
 0004           ; 
 0004           ;       AVR  mega128学习板
 0004           ;       www.iccavr.com 阿发
 0004           ;       14:42 2007-10-19
 0004           ; */
 0004           ; 
 0004           ; #include "iom128v.h"
 0004           ; 
 0004           ; /*延时函数*/
 0004           ; void delay_ms(unsigned char i) {
 0004                   .dbline 23
 0004 4427              clr R20
 0006 06C0              xjmp L5
 0008           L2:
 0008                   .dbline 23
 0008           ; 
 0008           ;       unsigned char a, b;
 0008           ;       for (a = 0; a < i; a++) {
 0008                   .dbline 24
 0008 61E0              ldi R22,1
 000A 01C0              xjmp L9
 000C           L6:
 000C                   .dbline 24
 000C           L7:
 000C                   .dbline 24
 000C 6395              inc R22
 000E           L9:
 000E                   .dbline 24
 000E 6623              tst R22
 0010 E9F7              brne L6
 0012                   .dbline 25
 0012           L3:
 0012                   .dbline 23
 0012 4395              inc R20
 0014           L5:
 0014                   .dbline 23
 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 eprom_read _eprom_read fV
 001E           ;         p_buff -> R20,R21
 001E           ;         number -> R18
 001E           ;           addr -> R16,R17
                        .even
 001E           _eprom_read::
 001E 0E940000          xcall push_gset1
 0022 4A81              ldd R20,y+2
 0024 5B81              ldd R21,y+3
 0026                   .dbline -1
 0026                   .dbline 30
 0026           ;               for (b = 1; b; b++);
 0026           ;               }
 0026           ; }
 0026           ; 
 0026           ; /*EEPROM读取函数*/
 0026           ; /*addr:地址;number:长度;p_buff:读出数据存放指针*/
 0026           ; void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {
 0026           L11:
 0026                   .dbline 32
 0026           L12:
 0026                   .dbline 32
 0026           ; 
 0026           ;       while(EECR & (1 << EEWE));                                                      /* 等待上一次写操作结束 */
 0026 E199              sbic 0x1c,1
 0028 FECF              rjmp L11
 002A 0AC0              xjmp L15
 002C           L14:
 002C                   .dbline 34
 002C                   .dbline 35
 002C 1801              movw R2,R16
 002E 0F5F              subi R16,255  ; offset = 1
 0030 1F4F              sbci R17,255
 0032 3FBA              out 0x1f,R3
 0034 2EBA              out 0x1e,R2
 0036                   .dbline 36
 0036 E09A              sbi 0x1c,0
 0038                   .dbline 37
 0038 2DB2              in R2,0x1d
 003A FA01              movw R30,R20
 003C 2192              st Z+,R2
 003E AF01              movw R20,R30
 0040                   .dbline 38
 0040           L15:
 0040                   .dbline 34
 0040           ; 
 0040           ;       while(number --) {
 0040 222E              mov R2,R18
 0042 3324              clr R3
 0044 2150              subi R18,1
 0046 2220              tst R2
 0048 89F7              brne L14
 004A                   .dbline -2
 004A           L10:
 004A 0E940000          xcall pop_gset1
 004E                   .dbline 0 ; func end
 004E 0895              ret
 0050                   .dbsym r p_buff 20 pc
 0050                   .dbsym r number 18 c
 0050                   .dbsym r addr 16 i
 0050                   .dbend
 0050                   .dbfunc e eprom_write _eprom_write fV
 0050           ;         p_buff -> R20,R21
 0050           ;         number -> R18
 0050           ;           addr -> R16,R17
                        .even
 0050           _eprom_write::
 0050 0E940000          xcall push_gset1
 0054 4A81              ldd R20,y+2
 0056 5B81              ldd R21,y+3
 0058                   .dbline -1
 0058                   .dbline 43
 0058           ;               EEAR = addr ++;                                                                 /* 设置地址寄存器 */
 0058           ;               EECR |= (1 << EERE);                                                    /* 置位EERE 读使能 */
 0058           ;               *p_buff++ = EEDR;
 0058           ;               }
 0058           ; }
 0058           ; 
 0058           ; /*EEPROM写入函数*/
 0058           ; /*addr:地址;number:长度;p_buff:写入数据存放指针*/
 0058           ; void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {
 0058 0DC0              xjmp L19
 005A           X0:
 005A                   .dbline 45
 005A           ; 
 005A           ;       while(number --) {
 005A           L21:
 005A                   .dbline 46
 005A           L22:
 005A                   .dbline 46
 005A E199              sbic 0x1c,1
 005C FECF              rjmp L21
 005E                   .dbline 47
 005E 1801              movw R2,R16
 0060 0F5F              subi R16,255  ; offset = 1
 0062 1F4F              sbci R17,255
 0064 3FBA              out 0x1f,R3
 0066 2EBA              out 0x1e,R2
 0068                   .dbline 48
 0068 FA01              movw R30,R20
 006A 2190              ld R2,Z+
 006C AF01              movw R20,R30
 006E 2DBA              out 0x1d,R2
 0070                   .dbline 49
 0070 E29A              sbi 0x1c,2
 0072                   .dbline 50
 0072 E19A              sbi 0x1c,1
 0074                   .dbline 51
 0074           L19:
 0074                   .dbline 45
 0074 222E              mov R2,R18
 0076 3324              clr R3
 0078 2150              subi R18,1
 007A 2220              tst R2
 007C 71F7              brne L22
 007E                   .dbline -2
 007E           L17:
 007E 0E940000          xcall pop_gset1
 0082                   .dbline 0 ; func end
 0082 0895              ret
 0084                   .dbsym r p_buff 20 pc
 0084                   .dbsym r number 18 c
 0084                   .dbsym r addr 16 i
 0084                   .dbend
 0084                   .dbfunc e io_init _io_init fV
                        .even
 0084           _io_init::
 0084                   .dbline -1
 0084                   .dbline 55
 0084           ;               while(EECR & (1 << EEWE));                                              /* 等待上一次写操作结束 */
 0084           ;               EEAR = addr ++;                                                                 /* 设置地址寄存器 */
 0084           ;               EEDR = *p_buff ++;                                                              /* 设置数据寄存器 */
 0084           ;               EECR |= (1 << EEMWE);                                                   /* 置位EEMWE 主机写使能*/
 0084           ;               EECR |= (1 << EEWE);                                                    /* 置位EEWE 写使能*/
 0084           ;               }
 0084           ; }
 0084           ; 
 0084           ; /*IO口初始化函数*/
 0084           ; void io_init(void) {
 0084                   .dbline 57
 0084           ; 
 0084           ;       DDRA = 0x00;                                                                            /*方向输入*/
 0084 2224              clr R2
 0086 2ABA              out 0x1a,R2
 0088                   .dbline 58
 0088           ;       PORTA = 0xFF;                                                                           /*打开上拉*/
 0088 8FEF              ldi R24,255
 008A 8BBB              out 0x1b,R24
 008C                   .dbline 59
 008C           ;       DDRB = 0xFF;                                                                            /*方向输出*/
 008C 87BB              out 0x17,R24
 008E                   .dbline 60
 008E           ;       PORTB = 0xFF;                                                                           /*输出高电平*/
 008E 88BB              out 0x18,R24
 0090                   .dbline 61
 0090           ;       DDRC = 0x00;                                                                            /*不用的IO口建议设置为输入带上拉*/
 0090 24BA              out 0x14,R2
 0092                   .dbline 62
 0092           ;       PORTC = 0xFF;
 0092 85BB              out 0x15,R24
 0094                   .dbline 63
 0094           ;       DDRD = 0x00;
 0094 21BA              out 0x11,R2
 0096                   .dbline 64
 0096           ;       PORTD = 0xFF;
 0096 82BB              out 0x12,R24
 0098                   .dbline 65
 0098           ;       DDRE = 0x00;
 0098 22B8              out 0x2,R2
 009A                   .dbline 66
 009A           ;       PORTE = 0xFF;
 009A 83B9              out 0x3,R24
 009C                   .dbline 67
 009C           ;       DDRF = 0x00;
 009C 20926100          sts 97,R2
 00A0                   .dbline 68
 00A0           ;       PORTF = 0xFF;
 00A0 80936200          sts 98,R24
 00A4                   .dbline 69
 00A4           ;       DDRG = 0x00;
 00A4 20926400          sts 100,R2
 00A8                   .dbline 70
 00A8           ;       PORTG = 0xFF;
 00A8 80936500          sts 101,R24
 00AC                   .dbline -2
 00AC           L24:
 00AC                   .dbline 0 ; func end
 00AC 0895              ret
 00AE                   .dbend
 00AE                   .dbfunc e main _main fV
 00AE           ;           temp -> y+2
                        .even
 00AE           _main::
 00AE 2397              sbiw R28,3
 00B0                   .dbline -1
 00B0                   .dbline 74
 00B0           ; }
 00B0           ; 
 00B0           ; /*主函数*/
 00B0           ; void main(void) {
 00B0                   .dbline 78
 00B0           ; 
 00B0           ;       unsigned char temp;
 00B0           ; 
 00B0           ;       io_init();
 00B0 E9DF              xcall _io_init
 00B2                   .dbline 79
 00B2           ;       delay_ms(250);                                                                          /*启动延时*/
 00B2 0AEF              ldi R16,250
 00B4 A5DF              xcall _delay_ms
 00B6                   .dbline 80
 00B6           ;       eprom_read(0x10, 0x01, &temp);                                          /*读出记录*/
 00B6 CE01              movw R24,R28
 00B8 0296              adiw R24,2
 00BA 9983              std y+1,R25
 00BC 8883              std y+0,R24
 00BE 21E0              ldi R18,1
 00C0 00E1              ldi R16,16
 00C2 10E0              ldi R17,0
 00C4 ACDF              xcall _eprom_read
 00C6                   .dbline 81
 00C6           ;       PORTB = ~temp;                                                                          /*显示记录*/
 00C6 2A80              ldd R2,y+2
 00C8 2094              com R2
 00CA 28BA              out 0x18,R2
 00CC                   .dbline 82
 00CC           ;       temp ++;                                                                                        /*刷新记录*/
 00CC 8A81              ldd R24,y+2
 00CE 8F5F              subi R24,255    ; addi 1
 00D0 8A83              std y+2,R24
 00D2                   .dbline 83
 00D2           ;       eprom_write(0x10, 0x01, &temp);                                         /*写入记录*/
 00D2 CE01              movw R24,R28
 00D4 0296              adiw R24,2
 00D6 9983              std y+1,R25
 00D8 8883              std y+0,R24
 00DA 21E0              ldi R18,1
 00DC 00E1              ldi R16,16
 00DE 10E0              ldi R17,0
 00E0 B7DF              xcall _eprom_write
 00E2           L26:
 00E2                   .dbline 85
 00E2                   .dbline 86
 00E2                   .dbline 87
 00E2           L27:
 00E2                   .dbline 85
 00E2 FFCF              xjmp L26
 00E4           X1:
 00E4                   .dbline -2
 00E4           L25:
 00E4 2396              adiw R28,3
 00E6                   .dbline 0 ; func end
 00E6 0895              ret
 00E8                   .dbsym l temp 2 c
 00E8                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -