📄 led8disp.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 + -