⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 05led4.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 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 + -