📄 disp_2.s
字号:
.module disp_2.c
.area data(ram, con, rel)
_disp::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 192,192
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 192,192
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 192,192
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.dbsym e disp _disp A[16:16]c
_led_buf::
.blkb 2
.area idata
.byte 1,2
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.blkb 2
.area idata
.byte 3,4
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.dbsym e led_buf _led_buf A[5:5]c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.dbfunc e Disp_Init _Disp_Init fV
.even
_Disp_Init::
.dbline -1
.dbline 24
; /*
; 模块说明:
;
; LED数码管中断动态显示程序。
; 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
; 2、动态调度由片内定时器1中断产生,中断周期为5mS。
; 3、内部1 M晶振,程序采用单任务方式,软件延时。
; 4、此模块文件为使用文件,可直接用于项目中。
; www.iccavr.com
; */
; #include "iom16v.h"
; #include <macros.h>
;
; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
;
; unsigned char led_buf[] = {1, 2, 3, 4, 0}; /*显示信息*/
;
; /*------------------------------------------------------------------*-
;
; Disp_Init()
; 显示初始化
;
; -*------------------------------------------------------------------*/
; void Disp_Init(void) {
.dbline 27
;
; /*初始化定时器*/
; OCR1A = 625; /*计数周期为5mS,F=1M*/
ldi R24,625
ldi R25,2
out 0x2b,R25
out 0x2a,R24
.dbline 28
; TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
in R24,0x39
ori R24,16
out 0x39,R24
.dbline 29
; SREG = 0x80;
ldi R24,128
out 0x3f,R24
.dbline 30
; TCCR1A = 0x00;
clr R2
out 0x2f,R2
.dbline 31
; TCCR1B = 0x08; /*定时器工作在CTC计数器模式*/
ldi R24,8
out 0x2e,R24
.dbline 32
; TCCR1B |= 0x02; /*设置定时器的分频值为8分频*/
in R24,0x2e
ori R24,2
out 0x2e,R24
.dbline 35
;
; /*SPI接口初始化*/
; DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
in R24,0x17
ori R24,160
out 0x17,R24
.dbline 36
; SPCR = (1<<SPE) | (1<<MSTR)
ldi R24,83
out 0xd,R24
.dbline 40
; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,时钟为fck/128 */
;
; /*中断使能*/
; SEI();
sei
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 24
jmp _Int_TCCR1A
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.area bss(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
L3:
.blkb 1
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\005-LED4\disp_2.c
.dbfunc e Int_TCCR1A _Int_TCCR1A fV
.dbsym s i L3 c
; temp -> R20
.even
_Int_TCCR1A::
st -y,R2
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
xcall push_gset1
.dbline -1
.dbline 53
; }
;
; /*------------------------------------------------------------------*-
;
; Int_TCCR1A()
; LED数码管动态显示函数
;
; 定时器'T1',A组比较中断产生5mS周期性中断
; 在中断里刷新显示
;
; -*------------------------------------------------------------------*/
; #pragma interrupt_handler Int_TCCR1A: 7
; void Int_TCCR1A(void) {
.dbline 58
;
; unsigned char temp;
; static unsigned char i;
;
; PORTB &= ~(1 << 4); /*准备锁存*/
cbi 0x18,4
.dbline 59
; PORTB |= 0x0F;
in R24,0x18
ori R24,15
out 0x18,R24
.dbline 60
; PORTB |= (1 << 4); /*锁存数据*/
sbi 0x18,4
.dbline 61
; if (i == 3) {
lds R24,L3
cpi R24,3
brne L4
.dbline 61
.dbline 62
; PORTB &= ~(1 << 2);
cbi 0x18,2
.dbline 63
; }
L4:
.dbline 64
; if (i == 2) {
lds R24,L3
cpi R24,2
brne L6
.dbline 64
.dbline 65
; PORTB &= ~(1 << 1);
cbi 0x18,1
.dbline 66
; }
L6:
.dbline 67
; if (i == 1) {
lds R24,L3
cpi R24,1
brne L8
.dbline 67
.dbline 68
; PORTB &= ~(1 << 0);
cbi 0x18,0
.dbline 69
; }
L8:
.dbline 70
; if (i == 0) {
lds R2,L3
tst R2
brne L10
.dbline 70
.dbline 71
; PORTB &= ~(1 << 3);
cbi 0x18,3
.dbline 72
; }
L10:
.dbline 74
;
; temp = led_buf[i] % 16; /**/
ldi R24,<_led_buf
ldi R25,>_led_buf
lds R30,L3
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
ldi R17,16
xcall mod8u
mov R20,R16
.dbline 75
; temp = disp[temp]; /**/
ldi R24,<_disp
ldi R25,>_disp
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R20,z+0
.dbline 76
; SPDR = temp;
out 0xf,R20
.dbline 78
;
; if (i > 3) {
ldi R24,3
lds R2,L3
cp R24,R2
brsh L12
.dbline 78
.dbline 79
; i = 0;
clr R2
sts L3,R2
.dbline 80
; }
xjmp L13
L12:
.dbline 81
.dbline 82
lds R24,L3
subi R24,255 ; addi 1
sts L3,R24
.dbline 83
L13:
.dbline -2
L2:
xcall pop_gset1
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r temp 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -