segdisp-16sn.s
来自「大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多」· S 代码 · 共 800 行
S
800 行
.module SegDisp-16sn.c
.area text(rom, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.area lit(rom, con, rel)
_dig0::
.byte 64
.dbsym e dig0 _dig0 kc
_dig1::
.byte 128
.dbsym e dig1 _dig1 kc
_dig2::
.byte 16
.dbsym e dig2 _dig2 kc
_dig3::
.byte 8
.dbsym e dig3 _dig3 kc
_dot::
.byte 32
.dbsym e dot _dot kc
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
_segconv::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e segconv _segconv A[10:10]c
_led_index::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e led_index _led_index I
_time_over::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e time_over _time_over I
_pattern1::
.blkb 2
.area idata
.byte 1,3
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 7,15
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 31,63
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 127,255
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 127,63
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 31,15
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 7,3
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e pattern1 _pattern1 A[15:15]c
_pattern2::
.blkb 2
.area idata
.byte 1,2
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 4,8
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 16,32
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 64,128
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 64,32
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 16,8
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 4,2
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 1
.area idata
.byte 1
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e pattern2 _pattern2 A[15:15]c
_pattern3::
.blkb 2
.area idata
.byte 1,128
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 2,64
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 4,32
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 8,16
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 16,8
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 32,4
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 64,2
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 1
.area idata
.byte 128
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e pattern3 _pattern3 A[15:15]c
_pattern4::
.blkb 2
.area idata
.byte 17,34
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 'D,136
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 'D,34
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 17,34
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 'D,136
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 'D,34
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 2
.area idata
.byte 17,0
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbsym e pattern4 _pattern4 A[15:15]c
.area text(rom, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
.dbfunc e delay _delay fV
; i -> R20,R21
; j -> R22,R23
; count -> R16,R17
.even
_delay::
xcall push_xgsetF000
.dbline -1
.dbline 25
; // Title: SegDisp-16sn.c
; // Function program for DEMOA-16sm utilizing 4x7-segment display
;
; #include <iom16v.h>
; #include <macros.h>
;
; extern void port_init(void);
; const char dig0 = 0x40, dig1 = 0x80, dig2=0x10, dig3=0x08, dot=0x20;
; char segconv[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
; unsigned char BCD0, BCD1, BCD2, BCD3;
; int count;
; int led_index=0, time_over=0;
; unsigned char swin3;
;
; char pattern1[]= {0x01, 0x03, 0x07, 0x0F, 0x1f, 0x3f, 0x7f, 0xff, 0x7f,
; 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01};
; char pattern2[]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40,
; 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
; char pattern3[]= {0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, 0x10, 0x10,
; 0x08, 0x20, 0x04, 0x40, 0x02, 0x80};
; char pattern4[]= {0x11, 0x22, 0x44, 0x88, 0x44, 0x22, 0x11, 0x22, 0x44,
; 0x88, 0x44, 0x22, 0x11, 0x00, 0x00};
;
; void delay(int count)
; {
.dbline 27
; int i, j;
; for(i=count; i>0; i--)
movw R20,R16
xjmp L5
L2:
.dbline 28
; for(j=3; j>0; j--)
ldi R22,3
ldi R23,0
L6:
.dbline 29
; ;
L7:
.dbline 28
subi R22,1
sbci R23,0
.dbline 28
clr R2
clr R3
cp R2,R22
cpc R3,R23
brlt L6
X0:
L3:
.dbline 27
subi R20,1
sbci R21,0
L5:
.dbline 27
clr R2
clr R3
cp R2,R20
cpc R3,R21
brlt L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
xjmp pop_xgsetF000
.dbsym r i 20 I
.dbsym r j 22 I
.dbsym r count 16 I
.dbend
.dbfunc e led_disp _led_disp fV
.even
_led_disp::
.dbline -1
.dbline 35
; }
;
; //*****************************************************************
;
; void led_disp(void)
; {
.dbline 36
; if(time_over>=10)
lds R24,_time_over
lds R25,_time_over+1
cpi R24,10
ldi R30,0
cpc R25,R30
brge X7
xjmp L11
X7:
X2:
.dbline 37
; {
.dbline 38
; swin3=PINC&0xc0;
in R24,0x13
andi R24,192
sts _swin3,R24
.dbline 39
; swin3=swin3>>6;
mov R2,R24
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
lsr R2
sts _swin3,R2
.dbline 41
;
; if(swin3==0)
tst R2
brne L13
X3:
.dbline 42
; {
.dbline 43
; PORTD=pattern1[led_index];
ldi R24,<_pattern1
ldi R25,>_pattern1
lds R30,_led_index
lds R31,_led_index+1
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x12,R2
.dbline 44
; }
xjmp L14
L13:
.dbline 45
; else if(swin3==0x01)
lds R24,_swin3
cpi R24,1
brne L15
X4:
.dbline 46
; {
.dbline 47
; PORTD=pattern2[led_index];
ldi R24,<_pattern2
ldi R25,>_pattern2
lds R30,_led_index
lds R31,_led_index+1
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x12,R2
.dbline 48
; }
xjmp L16
L15:
.dbline 49
; else if(swin3==0x02)
lds R24,_swin3
cpi R24,2
brne L17
X5:
.dbline 50
; {
.dbline 51
; PORTD=pattern3[led_index];
ldi R24,<_pattern3
ldi R25,>_pattern3
lds R30,_led_index
lds R31,_led_index+1
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x12,R2
.dbline 52
; }
xjmp L18
L17:
.dbline 54
; else
; {
.dbline 55
; PORTD=pattern4[led_index];
ldi R24,<_pattern4
ldi R25,>_pattern4
lds R30,_led_index
lds R31,_led_index+1
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x12,R2
.dbline 56
; }
L18:
L16:
L14:
.dbline 57
; led_index++;
lds R24,_led_index
lds R25,_led_index+1
adiw R24,1
sts _led_index+1,R25
sts _led_index,R24
.dbline 58
; if(led_index>14)
ldi R24,14
ldi R25,0
lds R2,_led_index
lds R3,_led_index+1
cp R24,R2
cpc R25,R3
brge L19
X6:
.dbline 59
; led_index=0;
clr R2
clr R3
sts _led_index+1,R3
sts _led_index,R2
L19:
.dbline 60
; }
L11:
.dbline 61
; swin3=~PINC&0x0f;
in R24,0x13
com R24
andi R24,15
sts _swin3,R24
.dbline 62
; delay(100+50*swin3);
mov R2,R24
ldi R24,50
mul R24,R2
movw R16,R0
subi R16,156 ; offset = 100
sbci R17,255
xcall _delay
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e BinToBCD _BinToBCD fV
; data -> R20,R21
.even
_BinToBCD::
st -y,R20
st -y,R21
movw R20,R16
.dbline -1
.dbline 66
; }
;
; void BinToBCD(int data)
; {
.dbline 67
; BCD0=0;
clr R2
sts _BCD0,R2
.dbline 68
; BCD1=0;
sts _BCD1,R2
.dbline 69
; BCD2=0;
sts _BCD2,R2
.dbline 70
; BCD3=0;
sts _BCD3,R2
.dbline 71
; if(data>=10000)
cpi R20,16
ldi R30,39
cpc R21,R30
brlt L22
X8:
.dbline 72
; data=0;
clr R20
clr R21
L22:
.dbline 73
; if(data>=1000)
cpi R20,232
ldi R30,3
cpc R21,R30
brlt L24
X9:
.dbline 74
; {
.dbline 75
; BCD3=data/1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall div16s
sts _BCD3,R16
.dbline 76
; data=data%1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 77
; }
L24:
.dbline 78
; if(data>=100)
cpi R20,100
ldi R30,0
cpc R21,R30
brlt L26
X10:
.dbline 79
; {
.dbline 80
; BCD2=data/100;
ldi R18,100
ldi R19,0
movw R16,R20
xcall div16s
sts _BCD2,R16
.dbline 81
; data=data%100;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 82
; }
L26:
.dbline 84
;
; if(data>=10)
cpi R20,10
ldi R30,0
cpc R21,R30
brlt L28
X11:
.dbline 85
; {
.dbline 86
; BCD1=data/10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall div16s
sts _BCD1,R16
.dbline 87
; data=data%10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 88
; }
L28:
.dbline 89
; BCD0=data;
sts _BCD0,R20
.dbline -2
L21:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r data 20 I
.dbend
.dbfunc e dispseg _dispseg fV
.even
_dispseg::
.dbline -1
.dbline 93
; }
;
; void dispseg(void)
; {
.dbline 94
; PORTB=~segconv[BCD0];
ldi R24,<_segconv
ldi R25,>_segconv
lds R30,_BCD0
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
com R2
out 0x18,R2
.dbline 95
; PORTA=dig0;
ldi R30,<_dig0
ldi R31,>_dig0
elpm R2,Z
out 0x1b,R2
.dbline 96
; led_disp();
xcall _led_disp
.dbline 97
; PORTB=~segconv[BCD1];
ldi R24,<_segconv
ldi R25,>_segconv
lds R30,_BCD1
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
com R2
out 0x18,R2
.dbline 98
; PORTA=dig1;
ldi R30,<_dig1
ldi R31,>_dig1
elpm R2,Z
out 0x1b,R2
.dbline 99
; led_disp();
xcall _led_disp
.dbline 100
; PORTB=~segconv[BCD2];
ldi R24,<_segconv
ldi R25,>_segconv
lds R30,_BCD2
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
com R2
out 0x18,R2
.dbline 101
; PORTA=dig2;
ldi R30,<_dig2
ldi R31,>_dig2
elpm R2,Z
out 0x1b,R2
.dbline 102
; led_disp();
xcall _led_disp
.dbline 103
; PORTB=~segconv[BCD3];
ldi R24,<_segconv
ldi R25,>_segconv
lds R30,_BCD3
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
com R2
out 0x18,R2
.dbline 104
; PORTA=dig3;
ldi R30,<_dig3
ldi R31,>_dig3
elpm R2,Z
out 0x1b,R2
.dbline 105
; led_disp();
xcall _led_disp
.dbline 106
; time_over++;
lds R24,_time_over
lds R25,_time_over+1
adiw R24,1
sts _time_over+1,R25
sts _time_over,R24
.dbline 107
; if(time_over>10)
ldi R24,10
ldi R25,0
lds R2,_time_over
lds R3,_time_over+1
cp R24,R2
cpc R25,R3
brge L31
X12:
.dbline 108
; time_over=0;
clr R2
clr R3
sts _time_over+1,R3
sts _time_over,R2
L31:
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e dot_on _dot_on fV
.even
_dot_on::
.dbline -1
.dbline 112
; }
;
; void dot_on(void)
; {
.dbline 113
; PORTB=~0x80;
ldi R24,-129
ldi R25,-1
out 0x18,R24
.dbline 114
; PORTA=dot;
ldi R30,<_dot
ldi R31,>_dot
elpm R2,Z
out 0x1b,R2
.dbline 115
; delay(20);
ldi R16,20
ldi R17,0
xcall _delay
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\+samples-16small\DEMOA-16sm\SegDisp-16sn.c
_swin3::
.blkb 1
.dbsym e swin3 _swin3 c
_count::
.blkb 2
.dbsym e count _count I
_BCD3::
.blkb 1
.dbsym e BCD3 _BCD3 c
_BCD2::
.blkb 1
.dbsym e BCD2 _BCD2 c
_BCD1::
.blkb 1
.dbsym e BCD1 _BCD1 c
_BCD0::
.blkb 1
.dbsym e BCD0 _BCD0 c
; }
;
;
; //*****************************************************************
; /*
; void main(void)
; {
; unsigned char outa=0x00, outb=0x00, outc=0x00, outd=0x00;
; unsigned char dswin;
; port_init();
; while(1)
; {
; WDR(); //Watchdog reset
; dswin=PINC;
; //dswin=1234;
; BinToBCD(dswin);
; dispseg();
; dot_on();
; PORTD=0x55;
; //PORTB=dswin;
; delay(5);
; }
; }*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?