📄 dianziqin.s
字号:
.module dianziqin.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\delay.h
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 7
; /* 1MHz 下延时程序*/
;
; #ifndef DELAY_H_H
; #define DELAY_H_H
;
; void delay_1ms(void) //1ms 延时
; {
.dbline 16
; unsigned int i;
; /*
; for(i=1;i<140;i++) //1MHz
; ;
;
; for(i=1331;i>0;i--) // 8MHz
; ;
; */
; for(i=0;i<2;i++) //1MHz,24us
clr R16
clr R17
xjmp L5
L2:
.dbline 17
; ;
L3:
.dbline 16
subi R16,255 ; offset = 1
sbci R17,255
L5:
.dbline 16
cpi R16,2
ldi R30,0
cpc R17,R30
brlo L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; n -> R10,R11
.even
_delay::
xcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 21
; }
;
; void delay(unsigned int n)
; {
.dbline 22
; unsigned int i=0;
clr R20
clr R21
.dbline 23
; for(i=0;i<n;i++)
xjmp L10
L7:
.dbline 24
; delay_1ms();
xcall _delay_1ms
L8:
.dbline 23
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 23
cp R20,R10
cpc R21,R11
brlo L7
X1:
.dbline -2
L6:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r n 10 i
.dbend
.dbfunc e delay_ms _delay_ms fV
; i -> R20,R21
; n -> R16,R17
.even
_delay_ms::
st -y,R20
st -y,R21
.dbline -1
.dbline 28
; }
;
; void delay_ms(int n)
; {
.dbline 30
; int i;
; for(i=0;i<n;i++)
clr R20
clr R21
xjmp L15
L12:
.dbline 31
; {
.dbline 32
; for(i=0;i<140;i++)
clr R20
clr R21
L16:
.dbline 33
; ;
L17:
.dbline 32
subi R20,255 ; offset = 1
sbci R21,255
.dbline 32
cpi R20,140
ldi R30,0
cpc R21,R30
brlt L16
X2:
.dbline 34
; }
L13:
.dbline 30
subi R20,255 ; offset = 1
sbci R21,255
L15:
.dbline 30
cp R20,R16
cpc R21,R17
brlt L12
X3:
.dbline -2
L11:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r i 20 I
.dbsym r n 16 I
.dbend
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\delay.h
_count::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\delay.h
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
.dbsym e count _count c
.area lit(rom, con, rel)
_music_key::
.byte 39,35
.byte 31,0
.byte 29,26
.byte 23,0
.byte 21
.dbsym e music_key _music_key A[9:9]kc
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
.dbfunc e scan_key _scan_key fc
; intKey -> R22
; i -> R20
; tmp -> R10
.even
_scan_key::
xcall push_xgsetF00C
.dbline -1
.dbline 12
; /*模拟电子琴,0、1、2、4、5、6、8 分别模拟do re mi fa so la xi*/
;
; #include <iom128v.h>
; #include <macros.h>
; #include "delay.h"
;
; char count=0x00;
; char sound_signal;//定义音符大小
; char sound_pace;//定义节拍大小
; const char music_key[]={0x27,0x23,0x1f,0x00,0x1d,0x1a,0x17,0x00,0x15};
; char scan_key()
; {
.dbline 13
; char i=0;
clr R20
.dbline 14
; char tmp=0x00;
clr R10
.dbline 15
; char intKey=0x00;
clr R22
.dbline 16
; DDRB=0x8f;
ldi R24,143
out 0x17,R24
.dbline 17
; PORTB=0xf8;
ldi R24,248
out 0x18,R24
.dbline 19
;
; for(i=0;i<3;i++)
xjmp L24
L21:
.dbline 20
; {
.dbline 21
; PORTB=~(1<<i);
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R16
com R2
out 0x18,R2
.dbline 22
; delay(10); //等待低电平稳定
ldi R16,10
ldi R17,0
xcall _delay
.dbline 23
; tmp=PINB&0xf0;
in R24,0x16
andi R24,240
mov R10,R24
.dbline 24
; if(tmp!=0xf0) //有键按下,延时10ms去抖
cpi R24,240
breq L25
X4:
.dbline 25
; {
.dbline 26
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 27
; tmp=PINB&0xf0;
in R24,0x16
andi R24,240
mov R10,R24
.dbline 28
; }
L25:
.dbline 29
; if(tmp!=0xf0) //确有键按下
mov R24,R10
cpi R24,240
brne X13
xjmp L27
X13:
X5:
.dbline 30
; {
.dbline 31
; tmp&=0xf0;
andi R24,240
mov R10,R24
.dbline 32
; switch(tmp)
clr R11
movw R24,R10
cpi R24,176
ldi R30,0
cpc R25,R30
breq L34
X6:
ldi R24,176
cp R24,R10
cpc R25,R11
brlt L37
X7:
L36:
movw R24,R10
cpi R24,112
ldi R30,0
cpc R25,R30
breq L35
X8:
xjmp L29
L37:
movw R24,R10
cpi R24,208
ldi R30,0
cpc R25,R30
breq L33
X9:
cpi R24,208
ldi R30,0
cpc R25,R30
brlt L29
X10:
L38:
movw R24,R10
cpi R24,224
ldi R30,0
cpc R25,R30
breq L32
X11:
xjmp L29
L32:
.dbline 35
; {
; case 0xe0:
; intKey=12-4*(3-i);
ldi R24,3
sub R24,R20
lsl R24
lsl R24
ldi R22,12
sub R22,R24
.dbline 36
; break;
xjmp L30
L33:
.dbline 38
; case 0xd0: //1 or 5
; intKey=13-4*(3-i);
ldi R24,3
sub R24,R20
lsl R24
lsl R24
ldi R22,13
sub R22,R24
.dbline 39
; break;
xjmp L30
L34:
.dbline 41
; case 0xb0:
; intKey=14-4*(3-i);
ldi R24,3
sub R24,R20
lsl R24
lsl R24
ldi R22,14
sub R22,R24
.dbline 42
; break;
xjmp L30
L35:
.dbline 44
; case 0x70:
; intKey=15-4*(3-i);
ldi R24,3
sub R24,R20
lsl R24
lsl R24
ldi R22,15
sub R22,R24
.dbline 45
; break;
xjmp L30
L29:
.dbline 47
; default:
; intKey=0xf0;
ldi R22,240
.dbline 48
; break;
L30:
.dbline 50
; }
; return intKey;
mov R16,R22
xjmp L20
L27:
.dbline 52
; }
; }
L22:
.dbline 19
inc R20
L24:
.dbline 19
cpi R20,3
brsh X14
xjmp L21
X14:
X12:
.dbline 53
; return 0xf0;
ldi R16,240
.dbline -2
L20:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r intKey 22 c
.dbsym r i 20 c
.dbsym r tmp 10 c
.dbend
.area vector(rom, abs)
.org 48
jmp _timer1_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
.dbfunc e timer1_isr _timer1_isr fV
.even
_timer1_isr::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 58
; }
;
; #pragma interrupt_handler timer1_isr:13
; void timer1_isr() // 50ms
; {
.dbline 59
; count=count+1;
lds R24,_count
subi R24,255 ; addi 1
sts _count,R24
.dbline 60
; TCNT1=0x00;
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline -2
L39:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
reti
.dbend
.dbfunc e main _main fV
; intKey -> R10
; key -> R20
.even
_main::
.dbline -1
.dbline 64
;
; }
; void main()
; {
.dbline 66
;
; char key=0x00;
clr R20
.dbline 67
; char intKey=0x00;
clr R10
.dbline 68
; DDRB=0x8f;
ldi R24,143
out 0x17,R24
.dbline 69
; PORTB=0xf8;
ldi R24,248
out 0x18,R24
.dbline 71
;
; TCNT1H=0x00;
clr R2
out 0x2d,R2
.dbline 72
; TCNT1L=0x00;
out 0x2c,R2
.dbline 73
; OCR1AH=0x00;
out 0x2b,R2
.dbline 74
; OCR1AL=0x30;
ldi R24,48
out 0x2a,R24
.dbline 75
; TIMSK=0x10;
ldi R24,16
out 0x37,R24
.dbline 76
; TCCR1A=0x00;
out 0x2f,R2
.dbline 77
; SEI();
sei
xjmp L42
L41:
.dbline 80
;
; while(1)
; {
.dbline 82
;
; key=scan_key();
xcall _scan_key
mov R20,R16
.dbline 83
; if(key!=0xf0) //有键按下
cpi R16,240
breq L44
X15:
.dbline 84
; {
.dbline 85
; TCCR1B=0x05;
ldi R24,5
out 0x2e,R24
xjmp L47
L46:
.dbline 86
; while(count!=4){
.dbline 88
;
; PORTB^=0x80;
ldi R24,128
ldi R25,0
in R2,0x18
clr R3
eor R2,R24
eor R3,R25
out 0x18,R2
.dbline 89
; delay(music_key[key]);}
ldi R24,<_music_key
ldi R25,>_music_key
mov R30,R20
clr R31
add R30,R24
adc R31,R25
elpm R16,Z
clr R17
xcall _delay
.dbline 89
L47:
.dbline 86
lds R24,_count
cpi R24,4
brne L46
X16:
.dbline 90
; }
L44:
.dbline 91
; TCCR1B=0x00;
clr R2
out 0x2e,R2
.dbline 92
; count=0;
sts _count,R2
.dbline 93
; }
L42:
.dbline 79
xjmp L41
X17:
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbsym r intKey 10 c
.dbsym r key 20 c
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
_sound_pace::
.blkb 1
.dbsym e sound_pace _sound_pace c
_sound_signal::
.blkb 1
.dbsym e sound_signal _sound_signal c
; /*
; char tmp;
; DDRB=0x0f;
; PORTB=0xfe;
; DDRA=0xff;
; PORTA=0xff;
; while(1){
; tmp=PINB&0xf0;
; if(tmp==0xd0)
; PORTA=0x00;
; }*/
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -