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

📄 led8.lst

📁 AVR单片机(MEGA16L)LED数码管实验程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
FILE: F:\job\M16学习板\LED数码管程序(实验四)\LED8Disp.c
(0001) /*******************************************************************
(0002)                       实验四
(0003) 实验名称: SPI接口实险,LED数据管显示。
(0004) 实验目的: 学习AVR单片机的SPI功能
(0005) 实验现象: 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 		  2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 环	  境: ICCAVR6.31A
(0008) 设 计 者: shinea8868
(0009) 说    明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
(0010) 	  	  作商业用途请保留本段文字
(0011) 完成日期: 2007年4月9日
(0012) *******************************************************************/
(0013) #include "iom16v.h"
(0014) #include "macros.h"
(0015) #include "..\ICC_H\SOFTWARE.h"
(0016) 
(0017) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0018) 
(0019) /*-----------------------------------------------------------------
(0020)     延时程序计算方法
(0021) 	计数个数j = 延时时间/6*晶振频率 - 1
(0022) 函数名称: void DelayMs(uchar i)
(0023) 函数功能: 毫秒延时
(0024) 参    数: 
(0025) 返 回 值: 无
(0026) -----------------------------------------------------------------*/
(0027) void DelayMs(uchar i)
(0028) {
    007F C006      RJMP	0x0086
(0029)  	uchar j;
(0030) 	while(i--)
(0031) 	{
(0032) 	 	j = 167;//1mhz 1ms延时
    0080 EA47      LDI	R20,0xA7
(0033) 	    while(j--);
    0081 2E24      MOV	R2,R20
    0082 2433      CLR	R3
    0083 5041      SUBI	R20,1
    0084 2022      TST	R2
    0085 F7D9      BNE	0x0081
    0086 2E20      MOV	R2,R16
    0087 2433      CLR	R3
    0088 5001      SUBI	R16,1
    0089 2022      TST	R2
    008A F7A9      BNE	0x0080
    008B 940E00E7  CALL	pop_gset1
    008D 9508      RET
(0034) 	}
(0035) }
(0036) 
(0037) /*-----------------------------------------------------------------
(0038) 函数名称: void SPIMasterInit(void) 
(0039) 函数功能: SPI初始化为主机
(0040) 参    数: 
(0041) 返 回 值: 无
(0042) -----------------------------------------------------------------*/
(0043) void SPIMasterInit(void) 
(0044) {
(0045) // 	MOSI,MISO,SCK等都需要设计的数据方向定义
(0046) 	DDRB |= (1<<PB5) | (1<<PB7);		// 设置MOSI 和SCK 为输出,其他为输入 M16
_SPIMasterInit:
    008E B387      IN	R24,0x17
    008F 6A80      ORI	R24,0xA0
    0090 BB87      OUT	0x17,R24
(0047) //	DDRB |= (1<<PB2) | (1<<PB3);		// 设置MOSI 和SCK 为输出,其他为输入 M64
(0048) //	SPI控制寄存器
(0049) //	SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
(0050) //	SPIE  中断使能  SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
(0051) //	MSTR  主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
(0052) //  SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
(0053) //	MSTR 进入主机模式。
(0054) //	CPOL: 时钟极性见ATMEGA16L(中文)P130
(0055) //	CPHA: 时钟相位
(0056) //	SPR1, SPR0: SPI 时钟速率选择1 与0  SPR1 和SPR0 对从机没有影响。
(0057) //  使能SPI 主机模式,设置时钟速率为fck/128 */
(0058) 	SPCR  = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);		
    0091 E583      LDI	R24,0x53
    0092 B98D      OUT	0x0D,R24
    0093 9508      RET
(0059) }
(0060) /*-----------------------------------------------------------------
(0061) 函数名称: void SPIMasterTransmit(unsigned char i) 
(0062) 函数功能: SPI数据发送
(0063) 参    数: 
(0064) 返 回 值: 无
(0065) -----------------------------------------------------------------*/
(0066) void SPIMasterTransmit(uchar TranData) 
(0067) {	
(0068) 	SPDR = TranData;					// 启动数据传输 
_SPIMasterTransmit:
  TranData             --> R16
    0094 B90F      OUT	0x0F,R16
(0069) 	while (!(SPSR & (1<<SPIF)));		// 等待传输结束 
    0095 9B77      SBIS	0x0E,7
    0096 CFFE      RJMP	0x0095
    0097 9508      RET
_SPI595Out:
  i                    --> R20
    0098 940E00E4  CALL	push_gset1
    009A 2F40      MOV	R20,R16
(0070) }
(0071) /*-----------------------------------------------------------------
(0072) 函数名称: void SPISlaveInit(void)
(0073) 函数功能: SPI初始化为从机
(0074) 参    数: 
(0075) 返 回 值: 无
(0076) -----------------------------------------------------------------/
(0077) void SPISlaveInit(void)
(0078) {
(0079)  	DDR_SPI = (1<<DD_MISO);            		// 设置MISO 为输出,其他为输入 
(0080) 	SPCR = (1<<SPE);// 使能 SPI 
(0081) }
(0082) /*-----------------------------------------------------------------
(0083) 函数名称: SPISlaveReceive(uchar & RecvData) 
(0084) 函数功能: SPI从机接收数据
(0085) 参    数: 
(0086) 返 回 值: 无
(0087) -----------------------------------------------------------------
(0088) void SPISlaveReceive(uchar & RecvData)
(0089) {
(0090)  	while(!(SPSR & (1<<SPIF)));// 等待接收结束
(0091) 	RecvData = SPDR;//返回接收到的数据
(0092) }*/
(0093) /*-----------------------------------------------------------------
(0094) 函数名称: void SPI595Out(unsigned char i)
(0095) 函数功能: 595数据输出显示
(0096) 参    数: 
(0097) 返 回 值: 无
(0098) -----------------------------------------------------------------*/
(0099) void SPI595Out(unsigned char i) 
(0100) {
(0101) 	PORTB &= ~(1 << 4);					/*准备锁存*/
    009B 98C4      CBI	0x18,4
(0102) 	SPIMasterTransmit(i);
    009C 2F04      MOV	R16,R20
    009D DFF6      RCALL	_SPIMasterTransmit
(0103) 	PORTB |= (1 << 4);					/*锁存数据*/
    009E 9AC4      SBI	0x18,4
    009F 940E00E7  CALL	pop_gset1
    00A1 9508      RET
(0104) }
(0105) 
(0106) void main(void) {
(0107) 
(0108) 	unsigned char i = 0;
_main:
  i                    --> R20
    00A2 2744      CLR	R20
(0109) 
(0110) 	DDRA = 0x00;						/*方向输入*/
    00A3 2422      CLR	R2
    00A4 BA2A      OUT	0x1A,R2
(0111) 	PORTA = 0xFF;						/*打开上拉*/
    00A5 EF8F      LDI	R24,0xFF
    00A6 BB8B      OUT	0x1B,R24
(0112) 	DDRB = 0xFF;						/*方向输出*/
    00A7 BB87      OUT	0x17,R24
(0113) 	PORTB = 0xF0;						/*电平设置*/
    00A8 EF80      LDI	R24,0xF0
    00A9 BB88      OUT	0x18,R24
(0114) 	DDRC = 0x00;
    00AA BA24      OUT	0x14,R2
(0115) 	PORTC = 0xFF;
    00AB EF8F      LDI	R24,0xFF
    00AC BB85      OUT	0x15,R24
(0116) 	DDRD = 0xFF;
    00AD BB81      OUT	0x11,R24
(0117) 	PORTD = 0xFF;
    00AE BB82      OUT	0x12,R24
(0118) 
(0119) 	SPIMasterInit();
    00AF DFDE      RCALL	_SPIMasterInit
    00B0 C011      RJMP	0x00C2
(0120) 	while (1) 
(0121) 	{
(0122) 		i ++;
    00B1 9543      INC	R20
(0123) 		if (i > 9) 
    00B2 E089      LDI	R24,0x9
    00B3 1784      CP	R24,R20
    00B4 F408      BCC	0x00B6
(0124) 		{
(0125) 			i = 0;
    00B5 2744      CLR	R20
(0126) 		}
(0127) 		DelayMs(250);
    00B6 EF0A      LDI	R16,0xFA
    00B7 DFC5      RCALL	_DelayMs
(0128) 		DelayMs(250);
    00B8 EF0A      LDI	R16,0xFA
    00B9 DFC3      RCALL	_DelayMs
(0129) 		SPI595Out(disp[i]);
FILE: <library>
    00BA E680      LDI	R24,0x60
    00BB E090      LDI	R25,0
    00BC 2FE4      MOV	R30,R20
    00BD 27FF      CLR	R31
    00BE 0FE8      ADD	R30,R24
    00BF 1FF9      ADC	R31,R25
    00C0 8100      LDD	R16,Z+0
    00C1 DFD6      RCALL	_SPI595Out
    00C2 CFEE      RJMP	0x00B1
    00C3 9508      RET
mod8u:
    00C4 9468      BSET	6
    00C5 C001      RJMP	xdiv8u
div8u:
    00C6 94E8      BCLR	6
xdiv8u:
    00C7 932A      ST	R18,-Y
    00C8 92FA      ST	R15,-Y
    00C9 92EA      ST	R14,-Y
    00CA 24FF      CLR	R15
    00CB 24EE      CLR	R14
    00CC E120      LDI	R18,0x10
    00CD 0F00      LSL	R16
    00CE 1CFF      ROL	R15
    00CF 1CEE      ROL	R14
    00D0 16E1      CP	R14,R17
    00D1 F010      BCS	0x00D4
    00D2 1AE1      SUB	R14,R17
    00D3 9503      INC	R16
    00D4 952A      DEC	R18
    00D5 F7B9      BNE	0x00CD
    00D6 F40E      BRTC	0x00D8
    00D7 2D0E      MOV	R16,R14
    00D8 90E9      LD	R14,Y+
    00D9 90F9      LD	R15,Y+
    00DA 9129      LD	R18,Y+
    00DB 9508      RET
push_gset5:
    00DC 92FA      ST	R15,-Y
    00DD 92EA      ST	R14,-Y
push_gset4:
    00DE 92DA      ST	R13,-Y
    00DF 92CA      ST	R12,-Y
push_gset3:
    00E0 92BA      ST	R11,-Y
    00E1 92AA      ST	R10,-Y
push_gset2:
    00E2 937A      ST	R23,-Y
    00E3 936A      ST	R22,-Y
push_gset1:
    00E4 935A      ST	R21,-Y
    00E5 934A      ST	R20,-Y
    00E6 9508      RET
pop_gset1:
    00E7 E0E1      LDI	R30,1
pop:
    00E8 9149      LD	R20,Y+
    00E9 9159      LD	R21,Y+
    00EA FDE0      SBRC	R30,0
    00EB 9508      RET
    00EC 9169      LD	R22,Y+
    00ED 9179      LD	R23,Y+
    00EE FDE1      SBRC	R30,1
    00EF 9508      RET
    00F0 90A9      LD	R10,Y+
    00F1 90B9      LD	R11,Y+
    00F2 FDE2      SBRC	R30,2
    00F3 9508      RET
    00F4 90C9      LD	R12,Y+
    00F5 90D9      LD	R13,Y+
    00F6 FDE3      SBRC	R30,3
    00F7 9508      RET
    00F8 90E9      LD	R14,Y+
    00F9 90F9      LD	R15,Y+
    00FA 9508      RET

⌨️ 快捷键说明

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