📄 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~3\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~3\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 19
0004 ; /*
0004 ; 实验四:
0004 ; SPI接口实险,LED数据管显示。
0004 ; 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
0004 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0004 ; 3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
0004 ; 4、此实验主要教大家如何使用SPI接口,让大家学会如何将SPI口设置为主机输出接口。
0004 ;
0004 ; AVR mega128学习板
0004 ; www.iccavr.com 阿发
0004 ; 0:45 2007-10-10
0004 ; */
0004 ;
0004 ; #include "iom128v.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 22
0004 4427 clr R20
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 22
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 0; a < i; a++) {
0008 .dbline 23
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 23
000C L7:
000C .dbline 23
000C 6395 inc R22
000E L9:
000E .dbline 23
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 24
0012 L3:
0012 .dbline 22
0012 4395 inc R20
0014 L5:
0014 .dbline 22
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 28
001E ; for (b = 1; b; b++);
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 30
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 31
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 32
0026 ; DDRB = 0xF0; /*设置高4位为输出,控制4位数码管*/
0026 80EF ldi R24,240
0028 87BB out 0x17,R24
002A .dbline 33
002A ; PORTB = 0x0F; /*高4位输出低电平,点亮4位数码管*/
002A 8FE0 ldi R24,15
002C 88BB out 0x18,R24
002E .dbline 34
002E ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002E 24BA out 0x14,R2
0030 .dbline 35
0030 ; PORTC = 0xFF;
0030 8FEF ldi R24,255
0032 85BB out 0x15,R24
0034 .dbline 36
0034 ; DDRD = 0x00;
0034 21BA out 0x11,R2
0036 .dbline 37
0036 ; PORTD = 0xFF;
0036 82BB out 0x12,R24
0038 .dbline 38
0038 ; DDRE = 0x00;
0038 22B8 out 0x2,R2
003A .dbline 39
003A ; PORTE = 0xFF;
003A 83B9 out 0x3,R24
003C .dbline 40
003C ; DDRF = 0x00;
003C 20926100 sts 97,R2
0040 .dbline 41
0040 ; PORTF = 0xFF;
0040 80936200 sts 98,R24
0044 .dbline 42
0044 ; DDRG = 0x00;
0044 20926400 sts 100,R2
0048 .dbline 43
0048 ; PORTG = 0xFF;
0048 80936500 sts 101,R24
004C .dbline -2
004C L10:
004C .dbline 0 ; func end
004C 0895 ret
004E .dbend
004E .dbfunc e SPI_MasterInit _SPI_MasterInit fV
.even
004E _SPI_MasterInit::
004E .dbline -1
004E .dbline 47
004E ; }
004E ;
004E ; /*SPI接口初始化*/
004E ; void SPI_MasterInit(void) {
004E .dbline 49
004E ;
004E ; DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); /* 设置PB0、SCK、MOSI为输出,其他为输入 */
004E 87B3 in R24,0x17
0050 8760 ori R24,7
0052 87BB out 0x17,R24
0054 .dbline 50
0054 ; SPCR = (1<<SPE) | (1<<MSTR)
0054 83E5 ldi R24,83
0056 8DB9 out 0xd,R24
0058 .dbline -2
0058 L11:
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbend
005A .dbfunc e SPI_MasterTransmit _SPI_MasterTransmit fV
005A ; i -> R16
.even
005A _SPI_MasterTransmit::
005A .dbline -1
005A .dbline 55
005A ; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
005A ; }
005A ;
005A ; /*SPI数据发送*/
005A ; void SPI_MasterTransmit(unsigned char i) {
005A .dbline 57
005A ;
005A ; SPDR = i; /* 启动数据传输 */
005A 0FB9 out 0xf,R16
005C L13:
005C .dbline 58
005C L14:
005C .dbline 58
005C ; while (!(SPSR & (1<<SPIF))); /* 等待传输结束 */
005C 779B sbis 0xe,7
005E FECF rjmp L13
0060 .dbline -2
0060 L12:
0060 .dbline 0 ; func end
0060 0895 ret
0062 .dbsym r i 16 c
0062 .dbend
0062 .dbfunc e SPI_595_Out _SPI_595_Out fV
0062 ; i -> R20
.even
0062 _SPI_595_Out::
0062 0E940000 xcall push_gset1
0066 402F mov R20,R16
0068 .dbline -1
0068 .dbline 62
0068 ; }
0068 ;
0068 ; /*595数据输出*/
0068 ; void SPI_595_Out(unsigned char i) {
0068 .dbline 63
0068 ; PORTB &= ~(1 << PB0); /*准备锁存*/
0068 C098 cbi 0x18,0
006A .dbline 64
006A ; SPI_MasterTransmit(i);
006A 042F mov R16,R20
006C F6DF xcall _SPI_MasterTransmit
006E .dbline 65
006E ; PORTB |= (1 << PB0); /*锁存数据*/
006E C09A sbi 0x18,0
0070 .dbline -2
0070 L16:
0070 0E940000 xcall pop_gset1
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r i 20 c
0076 .dbend
0076 .dbfunc e main _main fV
0076 ; i -> R20
.even
0076 _main::
0076 .dbline -1
0076 .dbline 68
0076 ; }
0076 ;
0076 ; void main(void) {
0076 .dbline 70
0076 ;
0076 ; unsigned char i = 0;
0076 4427 clr R20
0078 .dbline 72
0078 ;
0078 ; io_init();
0078 D2DF xcall _io_init
007A .dbline 73
007A ; SPI_MasterInit();
007A E9DF xcall _SPI_MasterInit
007C 11C0 xjmp L19
007E L18:
007E .dbline 74
007E ; while (1) {
007E .dbline 75
007E ; i ++;
007E 4395 inc R20
0080 .dbline 76
0080 ; if (i > 9) {
0080 89E0 ldi R24,9
0082 8417 cp R24,R20
0084 08F4 brsh L21
0086 .dbline 76
0086 .dbline 77
0086 ; i = 0;
0086 4427 clr R20
0088 .dbline 78
0088 ; }
0088 L21:
0088 .dbline 79
0088 0AEF ldi R16,250
008A BADF xcall _delay_ms
008C .dbline 80
008C 0AEF ldi R16,250
008E B8DF xcall _delay_ms
0090 .dbline 81
0090 80E0 ldi R24,<_disp
0092 90E0 ldi R25,>_disp
0094 E42F mov R30,R20
0096 FF27 clr R31
0098 E80F add R30,R24
009A F91F adc R31,R25
009C 0081 ldd R16,z+0
009E E1DF xcall _SPI_595_Out
00A0 .dbline 82
00A0 L19:
00A0 .dbline 74
00A0 EECF xjmp L18
00A2 X0:
00A2 .dbline -2
00A2 L17:
00A2 .dbline 0 ; func end
00A2 0895 ret
00A4 .dbsym r i 20 c
00A4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -