📄 led8.lst
字号:
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 + -