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

📄 led8disp.s

📁 AVR单片机(MEGA16L)LED数码管实验程序
💻 S
字号:
	.module LED8Disp.c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\LED8Disp.c
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.dbfunc e ChangeIntToHex _ChangeIntToHex fV
;            dec -> R20,R21
	.even
_ChangeIntToHex::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 136
; /*******************************************************************
;                       实验四
; 实验名称: SPI接口实险,LED数据管显示。
; 实验目的: 学习AVR单片机的SPI功能
; 实验现象: 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
; 		  2、内部1 M晶振,程序采用单任务方式,软件延时。
; 环	  境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 	  	  作商业用途请保留本段文字
; 完成日期: 2007年4月9日
; *******************************************************************/
; #include "iom16v.h"
; #include "macros.h"
; #include "..\ICC_H\SOFTWARE.h"
; 
; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
; 
; /*-----------------------------------------------------------------
;     延时程序计算方法
; 	计数个数j = 延时时间/6*晶振频率 - 1
; 函数名称: void DelayMs(uchar i)
; 函数功能: 毫秒延时
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void DelayMs(uchar i)
; {
;  	uchar j;
; 	while(i--)
; 	{
; 	 	j = 167;//1mhz 1ms延时
; 	    while(j--);
; 	}
; }
; 
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterInit(void) 
; 函数功能: SPI初始化为主机
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterInit(void) 
; {
; // 	MOSI,MISO,SCK等都需要设计的数据方向定义
; 	DDRB |= (1<<PB5) | (1<<PB7);		// 设置MOSI 和SCK 为输出,其他为输入 M16
; //	DDRB |= (1<<PB2) | (1<<PB3);		// 设置MOSI 和SCK 为输出,其他为输入 M64
; //	SPI控制寄存器
; //	SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
; //	SPIE  中断使能  SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
; //	MSTR  主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
; //  SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
; //	MSTR 进入主机模式。
; //	CPOL: 时钟极性见ATMEGA16L(中文)P130
; //	CPHA: 时钟相位
; //	SPR1, SPR0: SPI 时钟速率选择1 与0  SPR1 和SPR0 对从机没有影响。
; //  使能SPI 主机模式,设置时钟速率为fck/128 */
; 	SPCR  = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);		
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPIMasterTransmit(unsigned char i) 
; 函数功能: SPI数据发送
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPIMasterTransmit(uchar TranData) 
; {	
; 	SPDR = TranData;					// 启动数据传输 
; 	while (!(SPSR & (1<<SPIF)));		// 等待传输结束 
; }
; /*-----------------------------------------------------------------
; 函数名称: void SPISlaveInit(void)
; 函数功能: SPI初始化为从机
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------/
; void SPISlaveInit(void)
; {
;  	DDR_SPI = (1<<DD_MISO);            		// 设置MISO 为输出,其他为输入 
; 	SPCR = (1<<SPE);// 使能 SPI 
; }
; /*-----------------------------------------------------------------
; 函数名称: SPISlaveReceive(uchar & RecvData) 
; 函数功能: SPI从机接收数据
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------
; void SPISlaveReceive(uchar & RecvData)
; {
;  	while(!(SPSR & (1<<SPIF)));// 等待接收结束
; 	RecvData = SPDR;//返回接收到的数据
; }*/
; /*-----------------------------------------------------------------
; 函数名称: void SPI595Out(unsigned char i)
; 函数功能: 595数据输出显示
; 参    数: 
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void SPI595Out(unsigned char i) 
; {
; 	PORTB &= ~(1 << 4);					/*准备锁存*/
; 	SPIMasterTransmit(i);
; 	PORTB |= (1 << 4);					/*锁存数据*/
; }
; 
; void main(void) {
; 
; 	unsigned char i = 0;
; 
; 	DDRA = 0x00;						/*方向输入*/
; 	PORTA = 0xFF;						/*打开上拉*/
; 	DDRB = 0xFF;						/*方向输出*/
; 	PORTB = 0xF0;						/*电平设置*/
; 	DDRC = 0x00;
; 	PORTC = 0xFF;
; 	DDRD = 0xFF;
; 	PORTD = 0xFF;
; 
; 	SPIMasterInit();
; 	while (1) 
; 	{
; 		i ++;
; 		if (i > 9) 
; 		{
; 			i = 0;
; 		}
; 		DelayMs(250);
; 		DelayMs(250);
; 		SPI595Out(disp[i]);
; 	}
; }
; }
; }
; }
; }
; }
	.dbline 137
; }
	movw R30,R20
	ldd R2,z+0
	clr R3
	ldi R17,10
	mov R16,R2
	xcall mod8u
	mov R4,R16
	ldi R17,10
	mov R16,R2
	xcall div8u
	mov R24,R16
	andi R24,#0x0F
	swap R24
	or R24,R4
	movw R30,R20
	std z+0,R24
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dec 20 pc
	.dbend
	.dbfunc e ChangeHexToInt _ChangeHexToInt fV
;            hex -> R16,R17
	.even
_ChangeHexToInt::
	.dbline -1
	.dbline 166
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 167
; }
	movw R30,R16
	ldd R2,z+0
	clr R3
	mov R24,R2
	swap R24
	andi R24,#0x0F
	ldi R25,10
	mul R25,R24
	mov R24,R2
	andi R24,15
	mov R2,R0
	add R2,R24
	std z+0,R2
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r hex 16 pc
	.dbend
	.dbfunc e Delay _Delay fV
;              i -> R16
	.even
_Delay::
	.dbline -1
	.dbline 180
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 182
; }
; }
	ldi R16,200
L4:
	.dbline 183
L5:
	.dbline 183
; }
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L4
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
_disp::
	.blkb 2
	.area idata
	.byte 192,249
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.blkb 2
	.area idata
	.byte 164,176
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.blkb 2
	.area idata
	.byte 153,146
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.blkb 2
	.area idata
	.byte 130,248
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.blkb 2
	.area idata
	.byte 128,144
	.area data(ram, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\..\ICC_H\SOFTWARE.h
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\LED8Disp.c
	.dbsym e disp _disp A[10:10]c
	.area text(rom, con, rel)
	.dbfile F:\job\M16学习板\LED数码管程序(实验四)\LED8Disp.c
	.dbfunc e DelayMs _DelayMs fV
;              j -> R20
;              i -> R16
	.even
_DelayMs::
	xcall push_gset1
	.dbline -1
	.dbline 28
	xjmp L9
L8:
	.dbline 31
	.dbline 32
	ldi R20,167
L11:
	.dbline 33
L12:
	.dbline 33
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L11
	.dbline 34
L9:
	.dbline 30
	mov R2,R16
	clr R3
	subi R16,1
	tst R2
	brne L8
	.dbline -2
L7:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e SPIMasterInit _SPIMasterInit fV
	.even
_SPIMasterInit::
	.dbline -1
	.dbline 44
	.dbline 46
	in R24,0x17
	ori R24,160
	out 0x17,R24
	.dbline 58
	ldi R24,83
	out 0xd,R24
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SPIMasterTransmit _SPIMasterTransmit fV
;       TranData -> R16
	.even
_SPIMasterTransmit::
	.dbline -1
	.dbline 67
	.dbline 68
	out 0xf,R16
L16:
	.dbline 69
L17:
	.dbline 69
	sbis 0xe,7
	rjmp L16
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r TranData 16 c
	.dbend
	.dbfunc e SPI595Out _SPI595Out fV
;              i -> R20
	.even
_SPI595Out::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 100
	.dbline 101
	cbi 0x18,4
	.dbline 102
	mov R16,R20
	xcall _SPIMasterTransmit
	.dbline 103
	sbi 0x18,4
	.dbline -2
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e main _main fV
;              i -> R20
	.even
_main::
	.dbline -1
	.dbline 106
	.dbline 108
	clr R20
	.dbline 110
	clr R2
	out 0x1a,R2
	.dbline 111
	ldi R24,255
	out 0x1b,R24
	.dbline 112
	out 0x17,R24
	.dbline 113
	ldi R24,240
	out 0x18,R24
	.dbline 114
	out 0x14,R2
	.dbline 115
	ldi R24,255
	out 0x15,R24
	.dbline 116
	out 0x11,R24
	.dbline 117
	out 0x12,R24
	.dbline 119
	xcall _SPIMasterInit
	xjmp L22
L21:
	.dbline 121
	.dbline 122
	inc R20
	.dbline 123
	ldi R24,9
	cp R24,R20
	brsh L24
	.dbline 124
	.dbline 125
	clr R20
	.dbline 126
L24:
	.dbline 127
	ldi R16,250
	xcall _DelayMs
	.dbline 128
	ldi R16,250
	xcall _DelayMs
	.dbline 129
	ldi R24,<_disp
	ldi R25,>_disp
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _SPI595Out
	.dbline 130
L22:
	.dbline 120
	xjmp L21
X0:
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -