📄 05led4.lst
字号:
__start:
__text_start:
0051 EFCF LDI R28,0xFF
0052 E1D0 LDI R29,0x10
0053 BFCD OUT 0x3D,R28
0054 BFDE OUT 0x3E,R29
0055 51C0 SUBI R28,0x10
0056 40D0 SBCI R29,0
0057 EA0A LDI R16,0xAA
0058 8308 STD Y+0,R16
0059 2400 CLR R0
005A E1E5 LDI R30,0x15
005B E0F1 LDI R31,1
005C E011 LDI R17,1
005D 31E6 CPI R30,0x16
005E 07F1 CPC R31,R17
005F F011 BEQ 0x0062
0060 9201 ST R0,Z+
0061 CFFB RJMP 0x005D
0062 8300 STD Z+0,R16
0063 E8EC LDI R30,0x8C
0064 E0F0 LDI R31,0
0065 E0A0 LDI R26,0
0066 E0B1 LDI R27,1
0067 E010 LDI R17,0
0068 3AE1 CPI R30,0xA1
0069 07F1 CPC R31,R17
006A F021 BEQ 0x006F
006B 95C8 LPM
006C 9631 ADIW R30,1
006D 920D ST R0,X+
006E CFF9 RJMP 0x0068
006F 940E00B6 CALL _main
_exit:
0071 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0072 940E017B CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\main.c
(0001) /*
(0002) 实验五:
(0003) SPI接口实险,LED数据管显示。
(0004) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、进行此实验请插上SPI短路块。
(0007) 4、此实验具有一定参考价值,可作为项目的参考方案。
(0008)
(0009) AVR mega16学习板
(0010) www.iccavr.com
(0011) 2007-10-10
(0012) */
(0013)
(0014) #include "iom128v.h"
(0015) extern unsigned char led_buf[];
(0016) extern void disp_init(void);
(0017)
(0018) /*延时函数*/
(0019) void delay_ms(unsigned char i) {
(0020)
(0021) unsigned char a, b;
(0022) for (a = 1; a < i; a++) {
0074 E041 LDI R20,1
0075 C006 RJMP 0x007C
(0023) for (b = 1; b; b++) {
0076 E061 LDI R22,1
0077 C001 RJMP 0x0079
0078 9563 INC R22
0079 2366 TST R22
007A F7E9 BNE 0x0078
007B 9543 INC R20
007C 1740 CP R20,R16
007D F3C0 BCS 0x0076
007E 940E0172 CALL pop_gset2
0080 9508 RET
(0024) ;
(0025) }
(0026) }
(0027) }
(0028)
(0029) /*IO口初始化函数*/
(0030) void io_init(void) {
(0031)
(0032) DDRA = 0x00; /*方向输入*/
_io_init:
0081 2422 CLR R2
0082 BA2A OUT 0x1A,R2
(0033) PORTA = 0xFF; /*打开上拉*/
0083 EF8F LDI R24,0xFF
0084 BB8B OUT 0x1B,R24
(0034) DDRB = 0xF0; /*设置高4位为输出,控制4位数码管*/
0085 EF80 LDI R24,0xF0
0086 BB87 OUT 0x17,R24
(0035) PORTB = 0x0F; /*高4位输出低电平,点亮4位数码管*/
0087 E08F LDI R24,0xF
0088 BB88 OUT 0x18,R24
(0036) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
0089 BA24 OUT 0x14,R2
(0037) PORTC = 0xFF;
008A EF8F LDI R24,0xFF
008B BB85 OUT 0x15,R24
(0038) DDRD = 0x00;
008C BA21 OUT 0x11,R2
(0039) PORTD = 0xFF;
008D BB82 OUT 0x12,R24
(0040) DDRE = 0x00;
008E B822 OUT 0x02,R2
(0041) PORTE = 0xFF;
008F B983 OUT 0x03,R24
(0042) DDRF = 0x00;
0090 92200061 STS 0x61,R2
(0043) PORTF = 0xFF;
0092 93800062 STS 0x62,R24
(0044) DDRG = 0x00;
0094 92200064 STS 0x64,R2
(0045) PORTG = 0xFF;
0096 93800065 STS 0x65,R24
0098 9508 RET
_int_to_bcd:
i --> R20
temp --> R22
0099 940E017B CALL push_gset2
009B 01B8 MOVW R22,R16
(0046) }
(0047)
(0048) /*十六进制转十进制函数*/
(0049) void int_to_bcd(unsigned int temp) {
(0050) unsigned char i;
(0051)
(0052) for (i = 0; i < 4; i++) {
009C 2744 CLR R20
009D C013 RJMP 0x00B1
(0053) led_buf[i] = temp % 10; /*提取当前变量最低位*/
009E E02A LDI R18,0xA
009F E030 LDI R19,0
00A0 018B MOVW R16,R22
00A1 940E013E CALL mod16u
00A3 E180 LDI R24,0x10
00A4 E091 LDI R25,1
00A5 2FE4 MOV R30,R20
00A6 27FF CLR R31
00A7 0FE8 ADD R30,R24
00A8 1FF9 ADC R31,R25
00A9 8300 STD Z+0,R16
(0054) temp = temp / 10; /*去掉当前最低位值*/
00AA E02A LDI R18,0xA
00AB E030 LDI R19,0
00AC 018B MOVW R16,R22
00AD 940E0140 CALL div16u
00AF 01B8 MOVW R22,R16
00B0 9543 INC R20
00B1 3044 CPI R20,4
00B2 F358 BCS 0x009E
00B3 940E0172 CALL pop_gset2
00B5 9508 RET
(0055) }
(0056) }
(0057)
(0058) void main(void) {
(0059)
(0060) unsigned int i = 0;
_main:
i --> R20
00B6 2744 CLR R20
00B7 2755 CLR R21
(0061)
(0062) delay_ms(200); /*200mS启动延时*/
00B8 EC08 LDI R16,0xC8
00B9 DFB8 RCALL _delay_ms
(0063) io_init(); /*初始化IO口*/
00BA DFC6 RCALL _io_init
(0064) disp_init(); /*初始显示部*/
00BB 940E00CD CALL _disp_init
00BD C00D RJMP 0x00CB
(0065) while (1) {
(0066) i ++;
00BE 5F4F SUBI R20,0xFF
00BF 4F5F SBCI R21,0xFF
(0067) if (i > 9999) {
00C0 E08F LDI R24,0xF
00C1 E297 LDI R25,0x27
00C2 1784 CP R24,R20
00C3 0795 CPC R25,R21
00C4 F410 BCC 0x00C7
(0068) i = 0x00;
00C5 2744 CLR R20
00C6 2755 CLR R21
(0069) }
(0070) delay_ms(100);
00C7 E604 LDI R16,0x64
00C8 DFA9 RCALL _delay_ms
(0071) int_to_bcd(i); /*数值转换*/
00C9 018A MOVW R16,R20
00CA DFCE RCALL _int_to_bcd
00CB CFF2 RJMP 0x00BE
00CC 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\005-LED4\led4.c
(0001) /*
(0002) 模块说明:
(0003)
(0004) LED数码管中断动态显示程序。
(0005) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 4、此模块文件为使用文件,可直接用于项目中。
(0009) www.iccavr.com 阿发
(0010)
(0011) */
(0012) #include "iom128v.h"
(0013) #include <macros.h>
(0014)
(0015) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
(0016)
(0017) /*
(0018) 前4位为显示数值。
(0019) 最后一位为小数点显示位置。
(0020) */
(0021) unsigned char led_buf[] = {0, 0, 0, 0, 1}; /*显示信息*/
(0022)
(0023) /*------------------------------------------------------------------*-
(0024)
(0025) Disp_Init()
(0026) 显示初始化
(0027)
(0028) -*------------------------------------------------------------------*/
(0029) void disp_init(void) {
(0030)
(0031) /*初始化定时器*/
(0032) OCR1A = 625; /*计数周期为5mS,F=1M*/
_disp_init:
00CD E781 LDI R24,0x71
00CE E092 LDI R25,2
00CF BD9B OUT 0x2B,R25
00D0 BD8A OUT 0x2A,R24
(0033) TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
00D1 B787 IN R24,0x37
00D2 6180 ORI R24,0x10
00D3 BF87 OUT 0x37,R24
(0034) TCCR1A = 0x00;
00D4 2422 CLR R2
00D5 BC2F OUT 0x2F,R2
(0035) TCCR1B = (1 << WGM12); /*定时器工作在CTC计数器模式*/
00D6 E088 LDI R24,0x8
00D7 BD8E OUT 0x2E,R24
(0036) TCCR1B |= (1 << CS11); /*设置定时器的分频值为8分频*/
00D8 B58E IN R24,0x2E
00D9 6082 ORI R24,2
00DA BD8E OUT 0x2E,R24
(0037)
(0038) /*SPI接口初始化*/
(0039)
(0040) DDRB = 0xFF; /* 设置PB口为输出*/
00DB EF8F LDI R24,0xFF
00DC BB87 OUT 0x17,R24
(0041) SPCR = (1<<SPE) | (1<<MSTR)
00DD E583 LDI R24,0x53
00DE B98D OUT 0x0D,R24
(0042) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0043)
(0044) /*中断使能*/
(0045) SEI();
00DF 9478 BSET 7
00E0 9508 RET
_Int_TCCR1A:
temp --> R20
00E1 922A ST R2,-Y
00E2 923A ST R3,-Y
00E3 930A ST R16,-Y
00E4 931A ST R17,-Y
00E5 938A ST R24,-Y
00E6 939A ST R25,-Y
00E7 93EA ST R30,-Y
00E8 93FA ST R31,-Y
00E9 B62F IN R2,0x3F
00EA 922A ST R2,-Y
00EB 940E017D CALL push_gset1
(0046) }
(0047)
(0048) /*------------------------------------------------------------------*-
(0049)
(0050) Int_TCCR1A()
(0051) LED数码管动态显示函数
(0052)
(0053) 定时器'T1',A组比较中断产生5mS周期性中断
(0054) 在中断里刷新显示
(0055)
(0056) -*------------------------------------------------------------------*/
(0057) #pragma interrupt_handler Int_TCCR1A: 13
(0058) void Int_TCCR1A(void) {
(0059)
(0060) unsigned char temp;
(0061) static unsigned char i;
(0062)
(0063) PORTB &= ~(1 << PB0); /*准备锁存*/
00ED 98C0 CBI 0x18,0
(0064) PORTB |= 0xF0; /*复位段选择口*/
00EE B388 IN R24,0x18
00EF 6F80 ORI R24,0xF0
00F0 BB88 OUT 0x18,R24
(0065) PORTB |= (1 << PB0); /*锁存数据*/
00F1 9AC0 SBI 0x18,0
(0066) if (i == 3) {
00F2 91800115 LDS R24,i
00F4 3083 CPI R24,3
00F5 F409 BNE 0x00F7
(0067) PORTB &= ~(1 << PB6); /*由于此处显示数值滞后一个周期所以显示位也要修改*/
00F6 98C6 CBI 0x18,6
(0068) } /*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
(0069) if (i == 2) {
00F7 91800115 LDS R24,i
00F9 3082 CPI R24,2
00FA F409 BNE 0x00FC
(0070) PORTB &= ~(1 << PB5);
00FB 98C5 CBI 0x18,5
(0071) }
(0072) if (i == 1) {
00FC 91800115 LDS R24,i
00FE 3081 CPI R24,1
00FF F409 BNE 0x0101
(0073) PORTB &= ~(1 << PB4);
0100 98C4 CBI 0x18,4
(0074) }
(0075) if (i == 0) {
0101 90200115 LDS R2,i
0103 2022 TST R2
0104 F409 BNE 0x0106
(0076) PORTB &= ~(1 << PB7);
0105 98C7 CBI 0x18,7
(0077) }
(0078) temp = led_buf[i] % 16; /*滤除溢出的数值*/
0106 E180 LDI R24,0x10
0107 E091 LDI R25,1
0108 91E00115 LDS R30,i
010A 27FF CLR R31
010B 0FE8 ADD R30,R24
010C 1FF9 ADC R31,R25
010D 8100 LDD R16,Z+0
010E E110 LDI R17,0x10
010F 940E015A CALL mod8u
0111 2F40 MOV R20,R16
(0079) temp = disp[temp]; /*取出当前显示信息*/
0112 E080 LDI R24,0
0113 E091 LDI R25,1
0114 2FE4 MOV R30,R20
0115 27FF CLR R31
0116 0FE8 ADD R30,R24
0117 1FF9 ADC R31,R25
0118 8140 LDD R20,Z+0
(0080) if (led_buf[4] == i) { /*显示小数点*/
0119 90200115 LDS R2,i
011B 90300114 LDS R3,0x114
011D 1432 CP R3,R2
011E F421 BNE 0x0123
(0081) SPDR = temp & 0x7F;
011F 2F84 MOV R24,R20
0120 778F ANDI R24,0x7F
0121 B98F OUT 0x0F,R24
(0082) }
0122 C001 RJMP 0x0124
(0083) else {
(0084) SPDR = temp;
0123 B94F OUT 0x0F,R20
(0085) }
(0086)
(0087) i ++;
0124 91800115 LDS R24,i
0126 5F8F SUBI R24,0xFF
0127 93800115 STS i,R24
(0088) if (i > 3) { /*溢出处理*/
0129 E083 LDI R24,3
012A 90200115 LDS R2,i
012C 1582 CP R24,R2
012D F418 BCC 0x0131
(0089) i = 0;
012E 2422 CLR R2
012F 92200115 STS i,R2
(0090) }
FILE: <library>
0131 940E0180 CALL pop_gset1
0133 9029 LD R2,Y+
0134 BE2F OUT 0x3F,R2
0135 91F9 LD R31,Y+
0136 91E9 LD R30,Y+
0137 9199 LD R25,Y+
0138 9189 LD R24,Y+
0139 9119 LD R17,Y+
013A 9109 LD R16,Y+
013B 9039 LD R3,Y+
013C 9029 LD R2,Y+
013D 9518 RETI
mod16u:
013E 9468 BSET 6
013F C001 RJMP xdiv16u
div16u:
0140 94E8 BCLR 6
xdiv16u:
0141 92EA ST R14,-Y
0142 92FA ST R15,-Y
0143 938A ST R24,-Y
0144 24EE CLR R14
0145 24FF CLR R15
0146 E180 LDI R24,0x10
0147 0F00 LSL R16
0148 1F11 ROL R17
0149 1CEE ROL R14
014A 1CFF ROL R15
014B 16E2 CP R14,R18
014C 06F3 CPC R15,R19
014D F018 BCS 0x0151
014E 1AE2 SUB R14,R18
014F 0AF3 SBC R15,R19
0150 9503 INC R16
0151 958A DEC R24
0152 F7A1 BNE 0x0147
0153 F416 BRTC 0x0156
0154 2D0E MOV R16,R14
0155 2D1F MOV R17,R15
0156 9189 LD R24,Y+
0157 90F9 LD R15,Y+
0158 90E9 LD R14,Y+
0159 9508 RET
mod8u:
015A 9468 BSET 6
015B C001 RJMP xdiv8u
div8u:
015C 94E8 BCLR 6
xdiv8u:
015D 932A ST R18,-Y
015E 92FA ST R15,-Y
015F 92EA ST R14,-Y
0160 24FF CLR R15
0161 24EE CLR R14
0162 E120 LDI R18,0x10
0163 0F00 LSL R16
0164 1CFF ROL R15
0165 1CEE ROL R14
0166 16E1 CP R14,R17
0167 F010 BCS 0x016A
0168 1AE1 SUB R14,R17
0169 9503 INC R16
016A 952A DEC R18
016B F7B9 BNE 0x0163
016C F40E BRTC 0x016E
016D 2D0E MOV R16,R14
016E 90E9 LD R14,Y+
016F 90F9 LD R15,Y+
0170 9129 LD R18,Y+
0171 9508 RET
pop_gset2:
0172 E0E2 LDI R30,2
0173 940C0181 JMP pop
push_gset5:
0175 92FA ST R15,-Y
0176 92EA ST R14,-Y
push_gset4:
0177 92DA ST R13,-Y
0178 92CA ST R12,-Y
push_gset3:
0179 92BA ST R11,-Y
017A 92AA ST R10,-Y
push_gset2:
017B 937A ST R23,-Y
017C 936A ST R22,-Y
push_gset1:
017D 935A ST R21,-Y
017E 934A ST R20,-Y
017F 9508 RET
pop_gset1:
0180 E0E1 LDI R30,1
pop:
0181 9149 LD R20,Y+
0182 9159 LD R21,Y+
0183 FDE0 SBRC R30,0
0184 9508 RET
0185 9169 LD R22,Y+
0186 9179 LD R23,Y+
0187 FDE1 SBRC R30,1
0188 9508 RET
0189 90A9 LD R10,Y+
018A 90B9 LD R11,Y+
018B FDE2 SBRC R30,2
018C 9508 RET
018D 90C9 LD R12,Y+
018E 90D9 LD R13,Y+
018F FDE3 SBRC R30,3
0190 9508 RET
0191 90E9 LD R14,Y+
0192 90F9 LD R15,Y+
0193 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -