📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\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、进行此实验请插上SPI短路块。
0004 ; 4、此实验具有一定参考价值,可作为项目的参考方案。
0004 ;
0004 ; AVR mega16学习板
0004 ; www.iccavr.com
0004 ; 2007-10-10
0004 ; */
0004 ;
0004 ; #include "iom128v.h"
0004 ; extern unsigned char led_buf[];
0004 ; extern void disp_init(void);
0004 ;
0004 ; /*延时函数*/
0004 ; void delay_ms(unsigned char i) {
0004 .dbline 22
0004 41E0 ldi R20,1
0006 06C0 xjmp L5
0008 L2:
0008 .dbline 22
0008 ;
0008 ; unsigned char a, b;
0008 ; for (a = 1; a < i; a++) {
0008 .dbline 23
0008 61E0 ldi R22,1
000A 01C0 xjmp L9
000C L6:
000C .dbline 23
000C .dbline 24
000C .dbline 25
000C L7:
000C .dbline 23
000C 6395 inc R22
000E L9:
000E .dbline 23
000E 6623 tst R22
0010 E9F7 brne L6
0012 .dbline 26
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 30
001E ; for (b = 1; b; b++) {
001E ; ;
001E ; }
001E ; }
001E ; }
001E ;
001E ; /*IO口初始化函数*/
001E ; void io_init(void) {
001E .dbline 32
001E ;
001E ; DDRA = 0x00; /*方向输入*/
001E 2224 clr R2
0020 2ABA out 0x1a,R2
0022 .dbline 33
0022 ; PORTA = 0xFF; /*打开上拉*/
0022 8FEF ldi R24,255
0024 8BBB out 0x1b,R24
0026 .dbline 34
0026 ; DDRB = 0xF0; /*设置高4位为输出,控制4位数码管*/
0026 80EF ldi R24,240
0028 87BB out 0x17,R24
002A .dbline 35
002A ; PORTB = 0x0F; /*高4位输出低电平,点亮4位数码管*/
002A 8FE0 ldi R24,15
002C 88BB out 0x18,R24
002E .dbline 36
002E ; DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
002E 24BA out 0x14,R2
0030 .dbline 37
0030 ; PORTC = 0xFF;
0030 8FEF ldi R24,255
0032 85BB out 0x15,R24
0034 .dbline 38
0034 ; DDRD = 0x00;
0034 21BA out 0x11,R2
0036 .dbline 39
0036 ; PORTD = 0xFF;
0036 82BB out 0x12,R24
0038 .dbline 40
0038 ; DDRE = 0x00;
0038 22B8 out 0x2,R2
003A .dbline 41
003A ; PORTE = 0xFF;
003A 83B9 out 0x3,R24
003C .dbline 42
003C ; DDRF = 0x00;
003C 20926100 sts 97,R2
0040 .dbline 43
0040 ; PORTF = 0xFF;
0040 80936200 sts 98,R24
0044 .dbline 44
0044 ; DDRG = 0x00;
0044 20926400 sts 100,R2
0048 .dbline 45
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 int_to_bcd _int_to_bcd fV
004E ; i -> R20
004E ; temp -> R22,R23
.even
004E _int_to_bcd::
004E 0E940000 xcall push_gset2
0052 B801 movw R22,R16
0054 .dbline -1
0054 .dbline 49
0054 ; }
0054 ;
0054 ; /*十六进制转十进制函数*/
0054 ; void int_to_bcd(unsigned int temp) {
0054 .dbline 52
0054 4427 clr R20
0056 13C0 xjmp L15
0058 L12:
0058 .dbline 52
0058 .dbline 53
0058 2AE0 ldi R18,10
005A 30E0 ldi R19,0
005C 8B01 movw R16,R22
005E 0E940000 xcall mod16u
0062 80E0 ldi R24,<_led_buf
0064 90E0 ldi R25,>_led_buf
0066 E42F mov R30,R20
0068 FF27 clr R31
006A E80F add R30,R24
006C F91F adc R31,R25
006E 0083 std z+0,R16
0070 .dbline 54
0070 2AE0 ldi R18,10
0072 30E0 ldi R19,0
0074 8B01 movw R16,R22
0076 0E940000 xcall div16u
007A B801 movw R22,R16
007C .dbline 55
007C L13:
007C .dbline 52
007C 4395 inc R20
007E L15:
007E .dbline 52
007E ; unsigned char i;
007E ;
007E ; for (i = 0; i < 4; i++) {
007E 4430 cpi R20,4
0080 58F3 brlo L12
0082 .dbline -2
0082 L11:
0082 0E940000 xcall pop_gset2
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r i 20 c
0088 .dbsym r temp 22 i
0088 .dbend
0088 .dbfunc e main _main fV
0088 ; i -> R20,R21
.even
0088 _main::
0088 .dbline -1
0088 .dbline 58
0088 ; led_buf[i] = temp % 10; /*提取当前变量最低位*/
0088 ; temp = temp / 10; /*去掉当前最低位值*/
0088 ; }
0088 ; }
0088 ;
0088 ; void main(void) {
0088 .dbline 60
0088 ;
0088 ; unsigned int i = 0;
0088 4427 clr R20
008A 5527 clr R21
008C .dbline 62
008C ;
008C ; delay_ms(200); /*200mS启动延时*/
008C 08EC ldi R16,200
008E B8DF xcall _delay_ms
0090 .dbline 63
0090 ; io_init(); /*初始化IO口*/
0090 C6DF xcall _io_init
0092 .dbline 64
0092 ; disp_init(); /*初始显示部*/
0092 0E940000 xcall _disp_init
0096 0DC0 xjmp L18
0098 L17:
0098 .dbline 65
0098 ; while (1) {
0098 .dbline 66
0098 ; i ++;
0098 4F5F subi R20,255 ; offset = 1
009A 5F4F sbci R21,255
009C .dbline 67
009C ; if (i > 9999) {
009C 8FE0 ldi R24,9999
009E 97E2 ldi R25,39
00A0 8417 cp R24,R20
00A2 9507 cpc R25,R21
00A4 10F4 brsh L20
00A6 .dbline 67
00A6 .dbline 68
00A6 ; i = 0x00;
00A6 4427 clr R20
00A8 5527 clr R21
00AA .dbline 69
00AA ; }
00AA L20:
00AA .dbline 70
00AA 04E6 ldi R16,100
00AC A9DF xcall _delay_ms
00AE .dbline 71
00AE 8A01 movw R16,R20
00B0 CEDF xcall _int_to_bcd
00B2 .dbline 72
00B2 L18:
00B2 .dbline 65
00B2 F2CF xjmp L17
00B4 X0:
00B4 .dbline -2
00B4 L16:
00B4 .dbline 0 ; func end
00B4 0895 ret
00B6 .dbsym r i 20 i
00B6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -