📄 main.lis
字号:
.module main.c
.area data(ram, con, rel)
0000 _disp::
0000 .blkb 2
.area idata
0000 C0F9 .byte 192,249
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 A4B0 .byte 164,176
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 9992 .byte 153,146
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 82F8 .byte 130,248
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 8090 .byte 128,144
.area data(ram, con, rel)
000A .dbfile D:\Backup\我的文档\MYDESG~1\AVR\ICC\AVRMEG~1\SPI接口实验LED显示\main.c
000A .dbsym e disp _disp A[10:10]c
.area text(rom, con, rel)
0000 .dbfile D:\Backup\我的文档\MYDESG~1\AVR\ICC\AVRMEG~1\SPI接口实验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 18
0004 ; /*
0004 ; 实验四:
0004 ; SPI接口实险,LED数据管显示。
0004 ; 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0004 ; 3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
0004 ;
0004 ; AVR mega16学习板
0004 ; www.iccavr.com
0004 ; 2006-01-10
0004 ; */
0004 ;
0004 ; #include "iom16v.h"
0004 ;
0004 ; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 21
0004 41E0 ldi R20,1
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 21
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 1; a < i; a++) {
0008 .dbline 22
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 22
000C .dbline 23
000C .dbline 24
000C L7:
000C .dbline 22
000C 6395 inc R22
000E L9:
000E .dbline 22
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 25
0012 L3:
0012 .dbline 21
0012 4395 inc R20
0014 L5:
0014 .dbline 21
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 SPI_MasterInit _SPI_MasterInit fV
.even
001E _SPI_MasterInit::
001E .dbline -1
001E .dbline 29
001E ; for (b = 1; b; b++) {
001E ; ;
001E ; }
001E ; }
001E ; }
001E ;
001E ; /*SPI接口初始化*/
001E ; void SPI_MasterInit(void) {
001E .dbline 31
001E ;
001E ; DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
001E 87B3 in R24,0x17
0020 806A ori R24,160
0022 87BB out 0x17,R24
0024 .dbline 32
0024 ; SPCR = (1<<SPE) | (1<<MSTR)
0024 83E5 ldi R24,83
0026 8DB9 out 0xd,R24
0028 .dbline -2
0028 L10:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e SPI_MasterTransmit _SPI_MasterTransmit fV
002A ; i -> R16
.even
002A _SPI_MasterTransmit::
002A .dbline -1
002A .dbline 37
002A ; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
002A ; }
002A ;
002A ; /*SPI数据发送*/
002A ; void SPI_MasterTransmit(unsigned char i) {
002A .dbline 39
002A ;
002A ; SPDR = i; /* 启动数据传输 */
002A 0FB9 out 0xf,R16
002C L12:
002C .dbline 40
002C .dbline 41
002C .dbline 42
002C L13:
002C .dbline 40
002C ; while (!(SPSR & (1<<SPIF))) { /* 等待传输结束 */
002C 779B sbis 0xe,7
002E FECF rjmp L12
0030 .dbline -2
0030 L11:
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r i 16 c
0032 .dbend
0032 .dbfunc e SPI_595_Out _SPI_595_Out fV
0032 ; i -> R20
.even
0032 _SPI_595_Out::
0032 0E940000 xcall push_gset1
0036 402F mov R20,R16
0038 .dbline -1
0038 .dbline 46
0038 ; ;
0038 ; }
0038 ; }
0038 ;
0038 ; /*595数据输出*/
0038 ; void SPI_595_Out(unsigned char i) {
0038 .dbline 47
0038 ; PORTB &= ~(1 << 4); /*准备锁存*/
0038 C498 cbi 0x18,4
003A .dbline 48
003A ; SPI_MasterTransmit(i);
003A 042F mov R16,R20
003C F6DF xcall _SPI_MasterTransmit
003E .dbline 49
003E ; PORTB |= (1 << 4); /*锁存数据*/
003E C49A sbi 0x18,4
0040 .dbline -2
0040 L15:
0040 0E940000 xcall pop_gset1
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbsym r i 20 c
0046 .dbend
0046 .dbfunc e main _main fV
0046 ; i -> R20,R21
.even
0046 _main::
0046 .dbline -1
0046 .dbline 52
0046 ; }
0046 ;
0046 ; void main(void) {
0046 .dbline 54
0046 ;
0046 ; unsigned int i = 0;
0046 4427 clr R20
0048 5527 clr R21
004A .dbline 56
004A ;
004A ; DDRA = 0x00; /*方向输入*/
004A 2224 clr R2
004C 2ABA out 0x1a,R2
004E .dbline 57
004E ; PORTA = 0xFF; /*打开上拉*/
004E 8FEF ldi R24,255
0050 8BBB out 0x1b,R24
0052 .dbline 58
0052 ; DDRB = 0xFF; /*方向输出*/
0052 87BB out 0x17,R24
0054 .dbline 59
0054 ; PORTB = 0xFF; /*电平设置*/
0054 88BB out 0x18,R24
0056 .dbline 60
0056 ; DDRC = 0x00;
0056 24BA out 0x14,R2
0058 .dbline 61
0058 ; PORTC = 0xFF;
0058 85BB out 0x15,R24
005A .dbline 62
005A ; DDRD = 0xFF;
005A 81BB out 0x11,R24
005C .dbline 63
005C ; PORTD = 0xFF;
005C 82BB out 0x12,R24
005E .dbline 65
005E ;
005E ; SPI_MasterInit();
005E DFDF xcall _SPI_MasterInit
0060 55C0 xjmp L18
0062 L17:
0062 .dbline 67
0062 ; while (1)
0062 ; {
0062 .dbline 68
0062 ; i ++;
0062 4F5F subi R20,255 ; offset = 1
0064 5F4F sbci R21,255
0066 .dbline 69
0066 ; if (i > 9999)
0066 8FE0 ldi R24,9999
0068 97E2 ldi R25,39
006A 8417 cp R24,R20
006C 9507 cpc R25,R21
006E 10F4 brsh L20
0070 .dbline 70
0070 ; {
0070 .dbline 71
0070 ; i = 0;
0070 4427 clr R20
0072 5527 clr R21
0074 .dbline 72
0074 ; }
0074 L20:
0074 .dbline 75
0074 28EE ldi R18,1000
0076 33E0 ldi R19,3
0078 8A01 movw R16,R20
007A 0E940000 xcall div16u
007E 2AE0 ldi R18,10
0080 30E0 ldi R19,0
0082 0E940000 xcall mod16u
0086 F801 movw R30,R16
0088 80E0 ldi R24,<_disp
008A 90E0 ldi R25,>_disp
008C E80F add R30,R24
008E F91F adc R31,R25
0090 0081 ldd R16,z+0
0092 CFDF xcall _SPI_595_Out
0094 .dbline 76
0094 C398 cbi 0x18,3
0096 .dbline 77
0096 02E3 ldi R16,50
0098 B3DF xcall _delay_ms
009A .dbline 79
009A C39A sbi 0x18,3
009C .dbline 81
009C 24E6 ldi R18,100
009E 30E0 ldi R19,0
00A0 8A01 movw R16,R20
00A2 0E940000 xcall div16u
00A6 2AE0 ldi R18,10
00A8 30E0 ldi R19,0
00AA 0E940000 xcall mod16u
00AE F801 movw R30,R16
00B0 80E0 ldi R24,<_disp
00B2 90E0 ldi R25,>_disp
00B4 E80F add R30,R24
00B6 F91F adc R31,R25
00B8 0081 ldd R16,z+0
00BA BBDF xcall _SPI_595_Out
00BC .dbline 82
00BC C298 cbi 0x18,2
00BE .dbline 83
00BE 02E3 ldi R16,50
00C0 9FDF xcall _delay_ms
00C2 .dbline 85
00C2 C29A sbi 0x18,2
00C4 .dbline 87
00C4 2AE0 ldi R18,10
00C6 30E0 ldi R19,0
00C8 8A01 movw R16,R20
00CA 0E940000 xcall div16u
00CE 2AE0 ldi R18,10
00D0 30E0 ldi R19,0
00D2 0E940000 xcall mod16u
00D6 F801 movw R30,R16
00D8 80E0 ldi R24,<_disp
00DA 90E0 ldi R25,>_disp
00DC E80F add R30,R24
00DE F91F adc R31,R25
00E0 0081 ldd R16,z+0
00E2 A7DF xcall _SPI_595_Out
00E4 .dbline 88
00E4 C198 cbi 0x18,1
00E6 .dbline 89
00E6 02E3 ldi R16,50
00E8 8BDF xcall _delay_ms
00EA .dbline 91
00EA C19A sbi 0x18,1
00EC .dbline 93
00EC 2AE0 ldi R18,10
00EE 30E0 ldi R19,0
00F0 8A01 movw R16,R20
00F2 0E940000 xcall mod16u
00F6 F801 movw R30,R16
00F8 80E0 ldi R24,<_disp
00FA 90E0 ldi R25,>_disp
00FC E80F add R30,R24
00FE F91F adc R31,R25
0100 0081 ldd R16,z+0
0102 97DF xcall _SPI_595_Out
0104 .dbline 94
0104 C098 cbi 0x18,0
0106 .dbline 95
0106 02E3 ldi R16,50
0108 7BDF xcall _delay_ms
010A .dbline 96
010A C09A sbi 0x18,0
010C .dbline 98
010C L18:
010C .dbline 66
010C AACF xjmp L17
010E X0:
010E .dbline -2
010E L16:
010E .dbline 0 ; func end
010E 0895 ret
0110 .dbsym r i 20 i
0110 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -