📄 led4.s
字号:
.module led4.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~3\icc\009-AD-LED4\led4.c
.dbsym e disp _disp A[16:16]c
_led_buf::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.blkb 1
.area idata
.byte 3
.area data(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.dbsym e led_buf _led_buf A[5:5]c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.dbfunc e disp_init _disp_init fV
.even
_disp_init::
.dbline -1
.dbline 29
; /*
; 模块说明:
;
; LED数码管中断动态显示程序。
; 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
; 2、动态调度由片内定时器1中断产生,中断周期为5mS。
; 3、内部1 M晶振,程序采用单任务方式,软件延时。
; 4、此模块文件为使用文件,可直接用于项目中。
; www.iccavr.com 阿发
;
; */
; #include "iom128v.h"
; #include <macros.h>
;
; unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};
;
; /*
; 前4位为显示数值。
; 最后一位为小数点显示位置。
; */
; unsigned char led_buf[] = {0, 0, 0, 0, 3}; /*显示信息*/
;
; /*------------------------------------------------------------------*-
;
; Disp_Init()
; 显示初始化
;
; -*------------------------------------------------------------------*/
; void disp_init(void) {
.dbline 32
;
; /*初始化定时器*/
; OCR1A = 625; /*计数周期为5mS,F=1M*/
ldi R24,625
ldi R25,2
out 0x2b,R25
out 0x2a,R24
.dbline 33
; TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
in R24,0x37
ori R24,16
out 0x37,R24
.dbline 34
; TCCR1A = 0x00;
clr R2
out 0x2f,R2
.dbline 35
; TCCR1B = (1 << WGM12); /*定时器工作在CTC计数器模式*/
ldi R24,8
out 0x2e,R24
.dbline 36
; TCCR1B |= (1 << CS11); /*设置定时器的分频值为8分频*/
in R24,0x2e
ori R24,2
out 0x2e,R24
.dbline 40
;
; /*SPI接口初始化*/
;
; DDRB = 0xFF; /* 设置PB口为输出*/
ldi R24,255
out 0x17,R24
.dbline 41
; SPCR = (1<<SPE) | (1<<MSTR)
ldi R24,83
out 0xd,R24
.dbline 45
; | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
;
; /*中断使能*/
; SEI();
sei
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 48
jmp _Int_TCCR1A
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.area bss(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
L3:
.blkb 1
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\009-AD-LED4\led4.c
.dbfunc e Int_TCCR1A _Int_TCCR1A fV
.dbsym s i L3 c
; temp -> R20
.even
_Int_TCCR1A::
st -y,R2
st -y,R3
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 58
; }
;
; /*------------------------------------------------------------------*-
;
; Int_TCCR1A()
; LED数码管动态显示函数
;
; 定时器'T1',A组比较中断产生5mS周期性中断
; 在中断里刷新显示
;
; -*------------------------------------------------------------------*/
; #pragma interrupt_handler Int_TCCR1A: 13
; void Int_TCCR1A(void) {
.dbline 63
;
; unsigned char temp;
; static unsigned char i;
;
; PORTB &= ~(1 << PB0); /*准备锁存*/
cbi 0x18,0
.dbline 64
; PORTB |= 0xF0; /*复位段选择口*/
in R24,0x18
ori R24,240
out 0x18,R24
.dbline 65
; PORTB |= (1 << PB0); /*锁存数据*/
sbi 0x18,0
.dbline 66
; if (i == 3) {
lds R24,L3
cpi R24,3
brne L4
.dbline 66
.dbline 67
; PORTB &= ~(1 << PB6); /*由于此处显示数值滞后一个周期所以显示位也要修改*/
cbi 0x18,6
.dbline 68
; } /*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
L4:
.dbline 69
; if (i == 2) {
lds R24,L3
cpi R24,2
brne L6
.dbline 69
.dbline 70
; PORTB &= ~(1 << PB5);
cbi 0x18,5
.dbline 71
; }
L6:
.dbline 72
; if (i == 1) {
lds R24,L3
cpi R24,1
brne L8
.dbline 72
.dbline 73
; PORTB &= ~(1 << PB4);
cbi 0x18,4
.dbline 74
; }
L8:
.dbline 75
; if (i == 0) {
lds R2,L3
tst R2
brne L10
.dbline 75
.dbline 76
; PORTB &= ~(1 << PB7);
cbi 0x18,7
.dbline 77
; }
L10:
.dbline 78
; 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 79
; 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 80
; if (led_buf[4] == i) { /*显示小数点*/
lds R2,L3
lds R3,_led_buf+4
cp R3,R2
brne L12
.dbline 80
.dbline 81
; SPDR = temp & 0x7F;
mov R24,R20
andi R24,127
out 0xf,R24
.dbline 82
; }
xjmp L13
L12:
.dbline 83
; else {
.dbline 84
; SPDR = temp;
out 0xf,R20
.dbline 85
; }
L13:
.dbline 87
lds R24,L3
subi R24,255 ; addi 1
sts L3,R24
.dbline 88
ldi R24,3
lds R2,L3
cp R24,R2
brsh L15
.dbline 88
.dbline 89
clr R2
sts L3,R2
.dbline 90
L15:
.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 R3,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 + -