📄 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 E:\ICCAVR\project\AVRMEG~2\icc\004-SPI\main.c
000A .dbsym e disp _disp A[10:10]c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\004-SPI\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
.even
0046 _main::
0046 .dbline -1
0046 .dbline 52
0046 ; }
0046 ;
0046 ; void main(void) {
0046 .dbline 54
0046 ;
0046 ; unsigned char i = 0;
0046 4427 clr R20
0048 .dbline 56
0048 ;
0048 ; DDRA = 0x00; /*方向输入*/
0048 2224 clr R2
004A 2ABA out 0x1a,R2
004C .dbline 57
004C ; PORTA = 0xFF; /*打开上拉*/
004C 8FEF ldi R24,255
004E 8BBB out 0x1b,R24
0050 .dbline 58
0050 ; DDRB = 0xFF; /*方向输出*/
0050 87BB out 0x17,R24
0052 .dbline 59
0052 ; PORTB = 0xF0; /*电平设置*/
0052 80EF ldi R24,240
0054 88BB out 0x18,R24
0056 .dbline 60
0056 ; DDRC = 0x00;
0056 24BA out 0x14,R2
0058 .dbline 61
0058 ; PORTC = 0xFF;
0058 8FEF ldi R24,255
005A 85BB out 0x15,R24
005C .dbline 62
005C ; DDRD = 0xFF;
005C 81BB out 0x11,R24
005E .dbline 63
005E ; PORTD = 0xFF;
005E 82BB out 0x12,R24
0060 .dbline 65
0060 ;
0060 ; SPI_MasterInit();
0060 DEDF xcall _SPI_MasterInit
0062 11C0 xjmp L18
0064 L17:
0064 .dbline 66
0064 ; while (1) {
0064 .dbline 67
0064 ; i ++;
0064 4395 inc R20
0066 .dbline 68
0066 ; if (i > 9) {
0066 89E0 ldi R24,9
0068 8417 cp R24,R20
006A 08F4 brsh L20
006C .dbline 68
006C .dbline 69
006C ; i = 0;
006C 4427 clr R20
006E .dbline 70
006E ; }
006E L20:
006E .dbline 71
006E 0AEF ldi R16,250
0070 C7DF xcall _delay_ms
0072 .dbline 72
0072 0AEF ldi R16,250
0074 C5DF xcall _delay_ms
0076 .dbline 73
0076 80E0 ldi R24,<_disp
0078 90E0 ldi R25,>_disp
007A E42F mov R30,R20
007C FF27 clr R31
007E E80F add R30,R24
0080 F91F adc R31,R25
0082 0081 ldd R16,z+0
0084 D6DF xcall _SPI_595_Out
0086 .dbline 74
0086 L18:
0086 .dbline 66
0086 EECF xjmp L17
0088 X0:
0088 .dbline -2
0088 L16:
0088 .dbline 0 ; func end
0088 0895 ret
008A .dbsym r i 20 c
008A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -