📄 测试.s
字号:
xjmp L80
L84:
.dbline 27
; case 0x7B:key=11;break;//*
ldi R20,11
.dbline 27
xjmp L80
L85:
.dbline 28
; case 0x77:key=15;break;//=
ldi R20,15
.dbline 28
xjmp L80
L86:
.dbline 29
; case 0xBE:key=1;break;//1
ldi R20,1
.dbline 29
xjmp L80
L87:
.dbline 30
; case 0xBD:key=2;break;//2
ldi R20,2
.dbline 30
xjmp L80
L88:
.dbline 31
; case 0xBB:key=3;break;//3
ldi R20,3
.dbline 31
xjmp L80
L89:
.dbline 32
; case 0xB7:key=14;break;//-
ldi R20,14
.dbline 32
xjmp L80
L90:
.dbline 33
; case 0xDE:key=4;break;//4
ldi R20,4
.dbline 33
xjmp L80
L91:
.dbline 34
; case 0xDD:key=5;break;//5
ldi R20,5
.dbline 34
xjmp L80
L92:
.dbline 35
; case 0xDB:key=6;break;//6
ldi R20,6
.dbline 35
xjmp L80
L93:
.dbline 36
; case 0xD7:key=13;break;//+
ldi R20,13
.dbline 36
xjmp L80
L94:
.dbline 37
; case 0xEE:key=7;break;//7
ldi R20,7
.dbline 37
xjmp L80
L95:
.dbline 38
; case 0xED:key=8;break;//8
ldi R20,8
.dbline 38
xjmp L80
L96:
.dbline 39
; case 0xEB:key=9;break;//9
ldi R20,9
.dbline 39
xjmp L80
L97:
.dbline 40
; case 0xE7:key=12;break;//C
ldi R20,12
.dbline 40
xjmp L80
L79:
.dbline 41
; default:key=16;
ldi R20,16
.dbline 42
; }
L80:
.dbline 43
; return key;}
mov R16,R20
.dbline -2
L75:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r j 10 c
.dbsym r key 20 c
.dbsym r i 22 c
.dbend
.dbfunc e key_press _key_press fc
; j -> R20
; i -> R20
.even
_key_press::
st -y,R20
.dbline -1
.dbline 46
;
; uchar key_press()
; { uchar i,j;
.dbline 47
; DDRD=0XFF;
ldi R24,255
out 0x11,R24
.dbline 48
; PORTD=0XF0;
ldi R24,240
out 0x12,R24
.dbline 49
; DDRD=0X0F;
ldi R24,15
out 0x11,R24
.dbline 50
; delay_ms(1);
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 51
; i=PIND;
in R20,0x10
.dbline 52
; if(i==0xF0) j = 0;
cpi R20,240
brne L102
X45:
.dbline 52
clr R20
xjmp L103
L102:
.dbline 53
; else j = 1;
ldi R20,1
L103:
.dbline 54
; return j;
mov R16,R20
.dbline -2
L101:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r j 20 c
.dbsym r i 20 c
.dbend
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\4X4键盘.c
_data_zi::
.blkb 27
.area idata
.byte 194,188,210,244,178,165,183,197,181,218,48,49,50,51,52,53
.byte 54,55,56,57,182,206,178,193,179,253,0
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\4X4键盘.c
.dbfile E:\写的程序\AVR(C)\测试.c
.dbsym e data_zi _data_zi A[27:27]c
_data_ziju::
.blkb 11
.area idata
.byte 194,188,210,244,181,218,48,49,182,206,0
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.dbsym e data_ziju _data_ziju A[11:11]c
_caToneAdd::
.blkb 2
.area idata
.word 16
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 19
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 20
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 23
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 24
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 27
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 28
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 31
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 32
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 35
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 36
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 39
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 40
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 43
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 44
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 47
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 48
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 51
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 52
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 55
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 56
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 59
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 60
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 63
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 64
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.blkb 2
.area idata
.word 67
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.dbsym e caToneAdd _caToneAdd A[52:26]i
_APCL::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.dbsym e APCL _APCL c
_APCH::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.dbsym e APCH _APCH c
.area text(rom, con, rel)
.dbfile E:\写的程序\AVR(C)\测试.c
.dbfunc e spi_sent_init _spi_sent_init fV
.even
_spi_sent_init::
.dbline -1
.dbline 52
; #include <iom16v.h>
; #include <macros.h>
; #include "12864显示.c"
; #include"4X4键盘.c"
; //#include "延时子程序.c"
; #define uchar unsigned char
; #define uint unsigned int
; /*****************************************************
; / 要播放或要录音的开始与结果地址
; **********************************************************/
; uchar data_zi[]={"录音播放第0123456789段擦除"};
; uchar data_ziju[]={"录音第01段"};
; uint caToneAdd[]={0x0010,0x0013,0x0014,0x0017,0x0018,0x001b,0x001c,0x001f,
; 0x0020,0x0023,0x0024,0x0027,0x0028,0x002b,0x002c,0x002f,
; 0x0030,0x0033,0x0034,0x0037,0x0038,0x003b,0x003c,0x003f,
; 0x0040,0x0043};
;
; #define PU 0x11 //POWER UP 01
; #define STOP 0x12 //停止 02
; #define RESET 0x13 //复位 03
; #define CLI_INT 0x14 //清除中断和EOM位 04
; #define RD_STATUS 0x15 //读取状态寄存器,当前地址 05
; #define RD_PLAY_PTR 0x16 //读取状态寄存器,当前地址和播放指针 06
; #define PD 0x17 //POWER DOWN 07
; #define RD_REC_PTR 0x18 //读取状态寄存器,当前地址和录音指针 08
; #define RD_DEVID 0x19 //读取器件ID 09
; #define PLAY 0x50 //播放
; #define REC 0x51 //录音
; #define FWD 0x58 //下一曲
; #define ERASE 0X52 //擦除当前曲目
; #define G_ERASE 0x53 //擦除全部曲目除了提示音 43
; #define RD_APC 0x54 //读取状态寄存器,当前地址和APC寄存器 44
; #define WR_APC1 0x55 //将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
; #define WR_APC2 0x75 //将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
; #define WR_NVCFG 0x56 //将APC的内容写到NVCFG中 46
; #define CHK_MEM 0x59 //检查环形存储结构 49
; #define SET_PLAY 0x90 //从<S10:S0>开始播放,直到<E10:E0>或EOM 80
; #define SET_REC 0x91 //从<S10:S0>开始录音,直到<E10:E0> 81
; #define SET_ERASE 0x92 //擦除<S10:S0>到<E10:E0>的内容 82
;
; #define SS_1 PORTB|=(1<<PB4) //停止SPI
;
; uchar SR0_L; //SR0的低位
; uchar SR0_H; //SR0的高位
; uchar SR1; //SR1寄存器
; uchar ID,APCL=0,APCH=0;//ID和APC寄存器
; /**************************************************************************
; * 函数原型: ISD_SendData(unsigned int Data)
; * 功 能: SPI发送数据
; **************************************************************************/
; void spi_sent_init(void)
; { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
.dbline 52
in R24,0x18
ori R24,240
out 0x18,R24
.dbline 53
; DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
in R24,0x17
ori R24,176
out 0x17,R24
.dbline 54
; SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
ldi R24,115
out 0xd,R24
.dbline 55
; SPSR = 0x00; //预分频为128
clr R2
out 0xe,R2
.dbline -2
L104:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ISD_SendData _ISD_SendData fc
; sign -> R10
; Data -> R16,R17
.even
_ISD_SendData::
st -y,R10
.dbline -1
.dbline 59
; }
;
; unsigned char ISD_SendData(unsigned int Data)
; {
.dbline 61
; unsigned char sign;
; PORTB &=~ (1<<PB4); //强制接收方进入从模式
cbi 0x18,4
.dbline 62
; SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
sbi 0xd,4
.dbline 63
; SPDR = Data; //启动数据传输
out 0xf,R16
L106:
.dbline 64
; while(!(SPSR&(1<<SPIF))); //等待传输结束
L107:
.dbline 64
sbis 0xe,7
rjmp L106
X46:
.dbline 65
; sign=SPSR;
in R10,0xe
.dbline 66
; sign=SPDR;
in R10,0xf
.dbline 68
; //PORTB |= (1<<PB4);
; return sign;
mov R16,R10
.dbline -2
L105:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r sign 10 c
.dbsym r Data 16 i
.dbend
.dbfunc e GetToneAdd _GetToneAdd fV
; ipEndAdd -> y+0
; ipStartAdd -> R18,R19
; cNum -> R16
.even
_GetToneAdd::
.dbline -1
.dbline 75
; }
; /**************************************************************************
; * 函数原型: void GetToneAdd(uchar cNum, Uint ipStartAdd, Uint ipEndAdd);
; * 功 能: 取出当前语音的首末地址
; **************************************************************************/
;
; void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){
.dbline 77
;
; *ipStartAdd=caToneAdd[cNum*2];
ldi R24,<_caToneAdd
ldi R25,>_caToneAdd
mov R30,R16
clr R31
lsl R30
rol R31
lsl R30
rol R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
movw R30,R18
std z+1,R3
std z+0,R2
.dbline 78
; *ipEndAdd=caToneAdd[cNum*2+1];
mov R30,R16
clr R31
lsl R30
rol R31
adiw R30,1
lsl R30
rol R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldd R30,y+0
ldd R31,y+1
std z+1,R3
std z+0,R2
.dbline -2
L109:
.dbline 0 ; func end
ret
.dbsym l ipEndAdd 0 pi
.dbsym r ipStartAdd 18 pi
.dbsym r cNum 16 c
.dbend
.dbfunc e ISD_PU _ISD_PU fV
.even
_ISD_PU::
.dbline -1
.dbline 85
; }
;
; /**************************************************************************
; * 函数原型: void ISD_PU(void);
; * 功 能: 上电
; **************************************************************************/
; void ISD_PU(void){
.dbline 86
; ISD_SendData(PU);
ldi R16,17
ldi R17,0
xcall _ISD_SendData
.dbline 87
; ISD_SendData(0x00);
clr R16
clr R17
xcall _ISD_SendData
.dbline 88
; SS_1;
sbi 0x18,4
.dbline 89
; delay_ms(50);
ldi R16,50
ldi R17,0
xcall _delay_ms
.dbline -2
L110:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ISD_CHK_MEM _ISD_CHK_MEM fV
.even
_ISD_CHK_MEM::
.dbline -1
.dbline 95
; }
; /**************************************************************************
; * 函数原型: void ISD_CHK_MEM(void);
; * 功 能: 空间检查
; **************************************************************************/
; void ISD_CHK_MEM(void){
.dbline 96
; ISD_SendData(CHK_MEM);
ldi R16,89
ldi R17,0
xcall _ISD_SendData
.dbline 97
; ISD_SendData(0x00);
clr R16
clr R17
xcall _ISD_SendData
.dbline 98
; SS_1;
sbi 0x18,4
.dbline 99
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline -2
L111:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ISD_Play _ISD_Play fV
.even
_ISD_Play::
.dbline -1
.dbline 106
; }
;
; /**************************************************************************
; * 函数原型: void ISD_Play(void);
; * 功 能: 播放
; **************************************************************************/
; void ISD_Play(void){
.dbline 107
; ISD_SendData(PLAY);
ldi R16,80
ldi R17,0
xcall _ISD_SendData
.dbline 108
; ISD_SendData(0x00);
clr R16
clr R17
xcall _ISD_SendData
.dbline 109
; SS_1;
sbi 0x18,4
.dbline 110
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline -2
L112:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ISD_Stop _ISD_Stop fV
.even
_ISD_Stop::
.dbline -1
.dbline 117
; }
; /**************************************************************************
; * 函数原型: void ISD_Stop(void);
; * 功 能: 停止
; **************************************************************************/
;
; void ISD_Stop(void){
.dbline 118
; ISD_SendData(STOP);
ldi R16,18
ldi R17,0
xcall _ISD_SendData
.dbline 119
; ISD_SendData(0x00);
clr R16
clr R17
xcall _ISD_SendData
.dbline 120
; SS_1;
sbi 0x18,4
.dbline 121
; delay_ms(50);
ldi R16,50
ldi R17,0
xcall _delay_ms
.dbline -2
L113:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ISD_FWD _ISD_FWD fV
.even
_ISD_FWD::
.dbline -1
.dbline 129
; }
;
; /**************************************************************************
; * 函数原型: void ISD_FWD(void);
; * 功 能: 下一曲
; **************************************************************************/
;
; void ISD_FWD(void){
.dbline 130
; ISD_SendData(FWD);
ldi R16,88
ldi R17,0
xcall _ISD_SendData
.dbline 131
; ISD_SendData(0x00);
clr R16
clr R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -