?? 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 + -