📄 numled.s
字号:
.module NumLED.c
.area code(ram, con, rel)
.area lit(rom, con, rel)
_seg_table::
.byte 192,249
.byte 164,176
.byte 153,146
.byte 130,248
.byte 128,144
.byte 136,131
.byte 198,161
.byte 134,142
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
.dbsym e seg_table _seg_table A[16:16]kc
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
_led_buff::
.blkb 2
.area idata
.byte 127,255
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
.blkb 2
.area idata
.byte 255,255
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
.dbsym e led_buff _led_buff A[4:4]c
L2:
.blkw 1
.area idata
.word _seg_table
.area data(ram, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
.area text(rom, con, rel)
.dbfile G:\Mega8程序\TCXO评估板\NumLED.c
.dbfunc e ADCtoBCD _ADCtoBCD fV
.dbsym s pStr L2 pkc
; i -> R10
; temp -> R12,R13
.even
_ADCtoBCD::
rcall push_gset4
movw R12,R16
.dbline -1
.dbline 21
; /* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ,该模块中使用了seg_table[16]数组
; 来表示LED的16个字符0~F,led_buff[4]表示4个LED的字符代码*/
; #include<iom8v.h>
; #include <macros.h>
; #define Vref 4995
;
; #pragma data:code
; const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,
; 0x99,0x92,0x82,0xf8,
; 0x80,0x90,0x88,0x83,
; 0xc6,0xa1,0x86,0x8e};
; /*LED Code:定义在Flash中 0,1,2,3,
; 4,5,6,7,
; 8,9,A,B,
; C,D,E,F
; */
;
; #pragma data:data
; unsigned char led_buff[4]={0x7F,0xFF,0xFF,0xFF};//首位为"."点,其他位没有显示
; void ADCtoBCD(unsigned int temp)//16进制数值转换为BCD码,12精度
; {
.dbline 24
; unsigned char i;
; static const unsigned char *pStr=seg_table;
; temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0xfff);
movw R2,R12
clr R4
clr R5
ldi R20,131
ldi R21,19
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
ldi R20,255
ldi R21,15
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
rcall div32u
movw R12,R16
.dbline 25
; for(i=0;i<4;i++)
clr R10
rjmp L6
L3:
.dbline 26
.dbline 27
ldi R18,10
ldi R19,0
movw R16,R12
rcall mod16u
movw R30,R16
lds R2,L2
lds R3,L2+1
add R30,R2
adc R31,R3
lpm R30,Z
ldi R24,<_led_buff
ldi R25,>_led_buff
mov R26,R10
clr R27
add R26,R24
adc R27,R25
st x,R30
.dbline 28
ldi R18,10
ldi R19,0
movw R16,R12
rcall div16u
movw R12,R16
.dbline 29
L4:
.dbline 25
inc R10
L6:
.dbline 25
mov R24,R10
cpi R24,4
brlo L3
.dbline 30
; {
; led_buff[i]=*(pStr+temp%10);
; temp=temp/10;
; }
; led_buff[3]&=0x7f;
lds R24,_led_buff+3
andi R24,127
sts _led_buff+3,R24
.dbline -2
L1:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbsym r temp 12 i
.dbend
.dbfunc e led_init _led_init fV
.even
_led_init::
.dbline -1
.dbline 33
; }
; void led_init(void)
; {
.dbline 34
; DDRB|=0xff;
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 36
; //方向:输出
; PORTB|=0xff;
in R24,0x18
ori R24,255
out 0x18,R24
.dbline 38
; //LED数据-
; DDRD|=0xf0;
in R24,0x11
ori R24,240
out 0x11,R24
.dbline 40
; //D口高位输出,单只选通4个LED功能
; PORTD|=0xf0;
in R24,0x12
ori R24,240
out 0x12,R24
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spark _spark fV
; num -> R20
.even
_spark::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 44
; //高位输出高电平,LED全部熄灭.低位输入,全部为高阻态,如果为1,则带上拉电阻
; }
; void spark(unsigned char num)
; {
.dbline 45
; PORTB=led_buff[num];
ldi R24,<_led_buff
ldi R25,>_led_buff
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 46
; PORTD=0xf0&(~(1<<(num+4)));
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
rcall lsl8
mov R24,R16
com R24
andi R24,240
out 0x12,R24
.dbline -2
L9:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r num 20 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -