📄 测试.lst
字号:
key --> R20
i --> R22
4D4 940E 09C2 CALL push_xgsetF00C
FILE: E:\写的程序\AVR(C)\4X4键盘.c
(0001) /*********************************************************************
(0002) 注意在调用时要初始化DDRA=0xff;
(0003) 这最好是用中断扫描键盘,在中断里先保存以前DDRA的数值;
(0004) 扫描完后再恢复以前的DDRA的值
(0005) ***********************************************************************/
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) //#include"延时子程序.c"
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012) uchar key_scan()
(0013) {
(0014) uchar i=0X7F,key,j=0;
4D6 E76F LDI R22,0x7F
4D7 24AA CLR R10
(0015) delay_ms(1);
4D8 E001 LDI R16,1
4D9 E010 LDI R17,0
4DA DEB5 RCALL _delay_ms
(0016) do
(0017) {
(0018) i=(i<<1|i>>7);
4DB 2E26 MOV R2,R22
4DC 9426 LSR R2
4DD 9426 LSR R2
4DE 9426 LSR R2
4DF 9426 LSR R2
4E0 9426 LSR R2
4E1 9426 LSR R2
4E2 9426 LSR R2
4E3 2E36 MOV R3,R22
4E4 0C33 LSL R3
4E5 2832 OR R3,R2
4E6 2D63 MOV R22,R3
(0019) PORTD=i;
4E7 BA32 OUT 0x12,R3
(0020) DDRD=0x0F;
4E8 E08F LDI R24,0xF
4E9 BB81 OUT 0x11,R24
(0021) key=PIND;
4EA B340 IN R20,0x10
(0022) j=key&0xF0;
4EB 2F84 MOV R24,R20
4EC 7F80 ANDI R24,0xF0
4ED 2EA8 MOV R10,R24
(0023) }while(j==0xF0);
4EE 2D8A MOV R24,R10
4EF 3F80 CPI R24,0xF0
4F0 F351 BEQ 0x04DB
(0024) switch(key)
4F1 2F64 MOV R22,R20
4F2 2777 CLR R23
4F3 3B67 CPI R22,0xB7
4F4 E0E0 LDI R30,0
4F5 077E CPC R23,R30
4F6 F409 BNE 0x04F8
4F7 C05C RJMP 0x0554
4F8 3B6B CPI R22,0xBB
4F9 E0E0 LDI R30,0
4FA 077E CPC R23,R30
4FB F409 BNE 0x04FD
4FC C055 RJMP 0x0552
4FD 3B6D CPI R22,0xBD
4FE E0E0 LDI R30,0
4FF 077E CPC R23,R30
500 F409 BNE 0x0502
501 C04E RJMP 0x0550
502 3B6E CPI R22,0xBE
503 E0E0 LDI R30,0
504 077E CPC R23,R30
505 F409 BNE 0x0507
506 C047 RJMP 0x054E
507 EB8E LDI R24,0xBE
508 E090 LDI R25,0
509 1786 CP R24,R22
50A 0797 CPC R25,R23
50B F094 BLT 0x051E
50C 3767 CPI R22,0x77
50D E0E0 LDI R30,0
50E 077E CPC R23,R30
50F F409 BNE 0x0511
510 C03B RJMP 0x054C
511 376B CPI R22,0x7B
512 E0E0 LDI R30,0
513 077E CPC R23,R30
514 F1A9 BEQ 0x054A
515 376D CPI R22,0x7D
516 E0E0 LDI R30,0
517 077E CPC R23,R30
518 F179 BEQ 0x0548
519 376E CPI R22,0x7E
51A E0E0 LDI R30,0
51B 077E CPC R23,R30
51C F149 BEQ 0x0546
51D C048 RJMP 0x0566
51E 3D67 CPI R22,0xD7
51F E0E0 LDI R30,0
520 077E CPC R23,R30
521 F409 BNE 0x0523
522 C039 RJMP 0x055C
523 3D6B CPI R22,0xDB
524 E0E0 LDI R30,0
525 077E CPC R23,R30
526 F409 BNE 0x0528
527 C032 RJMP 0x055A
528 3D6D CPI R22,0xDD
529 E0E0 LDI R30,0
52A 077E CPC R23,R30
52B F161 BEQ 0x0558
52C 3D6E CPI R22,0xDE
52D E0E0 LDI R30,0
52E 077E CPC R23,R30
52F F131 BEQ 0x0556
530 3D67 CPI R22,0xD7
531 E0E0 LDI R30,0
532 077E CPC R23,R30
533 F40C BGE 0x0535
534 C031 RJMP 0x0566
535 3E67 CPI R22,0xE7
536 E0E0 LDI R30,0
537 077E CPC R23,R30
538 F159 BEQ 0x0564
539 3E6B CPI R22,0xEB
53A E0E0 LDI R30,0
53B 077E CPC R23,R30
53C F129 BEQ 0x0562
53D 3E6D CPI R22,0xED
53E E0E0 LDI R30,0
53F 077E CPC R23,R30
540 F0F9 BEQ 0x0560
541 3E6E CPI R22,0xEE
542 E0E0 LDI R30,0
543 077E CPC R23,R30
544 F0C9 BEQ 0x055E
545 C020 RJMP 0x0566
(0025) { case 0x7E:key=0;break;//0
546 2744 CLR R20
547 C01F RJMP 0x0567
(0026) case 0x7D:key=10;break;//.
548 E04A LDI R20,0xA
549 C01D RJMP 0x0567
(0027) case 0x7B:key=11;break;//*
54A E04B LDI R20,0xB
54B C01B RJMP 0x0567
(0028) case 0x77:key=15;break;//=
54C E04F LDI R20,0xF
54D C019 RJMP 0x0567
(0029) case 0xBE:key=1;break;//1
54E E041 LDI R20,1
54F C017 RJMP 0x0567
(0030) case 0xBD:key=2;break;//2
550 E042 LDI R20,2
551 C015 RJMP 0x0567
(0031) case 0xBB:key=3;break;//3
552 E043 LDI R20,3
553 C013 RJMP 0x0567
(0032) case 0xB7:key=14;break;//-
554 E04E LDI R20,0xE
555 C011 RJMP 0x0567
(0033) case 0xDE:key=4;break;//4
556 E044 LDI R20,4
557 C00F RJMP 0x0567
(0034) case 0xDD:key=5;break;//5
558 E045 LDI R20,5
559 C00D RJMP 0x0567
(0035) case 0xDB:key=6;break;//6
55A E046 LDI R20,6
55B C00B RJMP 0x0567
(0036) case 0xD7:key=13;break;//+
55C E04D LDI R20,0xD
55D C009 RJMP 0x0567
(0037) case 0xEE:key=7;break;//7
55E E047 LDI R20,7
55F C007 RJMP 0x0567
(0038) case 0xED:key=8;break;//8
560 E048 LDI R20,0x8
561 C005 RJMP 0x0567
(0039) case 0xEB:key=9;break;//9
562 E049 LDI R20,0x9
563 C003 RJMP 0x0567
(0040) case 0xE7:key=12;break;//C
564 E04C LDI R20,0xC
565 C001 RJMP 0x0567
(0041) default:key=16;
566 E140 LDI R20,0x10
(0042) }
(0043) return key;}
567 2F04 MOV R16,R20
568 940C 09C9 JMP pop_xgsetF00C
_key_press:
j --> R20
i --> R20
56A 934A ST R20,-Y
(0044)
(0045) uchar key_press()
(0046) { uchar i,j;
(0047) DDRD=0XFF;
56B EF8F LDI R24,0xFF
56C BB81 OUT 0x11,R24
(0048) PORTD=0XF0;
56D EF80 LDI R24,0xF0
56E BB82 OUT 0x12,R24
(0049) DDRD=0X0F;
56F E08F LDI R24,0xF
570 BB81 OUT 0x11,R24
(0050) delay_ms(1);
571 E001 LDI R16,1
572 E010 LDI R17,0
573 DE1C RCALL _delay_ms
(0051) i=PIND;
574 B340 IN R20,0x10
(0052) if(i==0xF0) j = 0;
575 3F40 CPI R20,0xF0
576 F411 BNE 0x0579
577 2744 CLR R20
578 C001 RJMP 0x057A
(0053) else j = 1;
579 E041 LDI R20,1
(0054) return j;
57A 2F04 MOV R16,R20
57B 9149 LD R20,Y+
57C 9508 RET
FILE: E:\写的程序\AVR(C)\测试.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "12864显示.c"
(0004) #include"4X4键盘.c"
(0005) //#include "延时子程序.c"
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) /*****************************************************
(0009) / 要播放或要录音的开始与结果地址
(0010) **********************************************************/
(0011) uchar data_zi[]={"录音播放第0123456789段擦除"};
(0012) uchar data_ziju[]={"录音第01段"};
(0013) uint caToneAdd[]={0x0010,0x0013,0x0014,0x0017,0x0018,0x001b,0x001c,0x001f,
(0014) 0x0020,0x0023,0x0024,0x0027,0x0028,0x002b,0x002c,0x002f,
(0015) 0x0030,0x0033,0x0034,0x0037,0x0038,0x003b,0x003c,0x003f,
(0016) 0x0040,0x0043};
(0017)
(0018) #define PU 0x11 //POWER UP 01
(0019) #define STOP 0x12 //停止 02
(0020) #define RESET 0x13 //复位 03
(0021) #define CLI_INT 0x14 //清除中断和EOM位 04
(0022) #define RD_STATUS 0x15 //读取状态寄存器,当前地址 05
(0023) #define RD_PLAY_PTR 0x16 //读取状态寄存器,当前地址和播放指针 06
(0024) #define PD 0x17 //POWER DOWN 07
(0025) #define RD_REC_PTR 0x18 //读取状态寄存器,当前地址和录音指针 08
(0026) #define RD_DEVID 0x19 //读取器件ID 09
(0027) #define PLAY 0x50 //播放
(0028) #define REC 0x51 //录音
(0029) #define FWD 0x58 //下一曲
(0030) #define ERASE 0X52 //擦除当前曲目
(0031) #define G_ERASE 0x53 //擦除全部曲目除了提示音 43
(0032) #define RD_APC 0x54 //读取状态寄存器,当前地址和APC寄存器 44
(0033) #define WR_APC1 0x55 //将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
(0034) #define WR_APC2 0x75 //将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
(0035) #define WR_NVCFG 0x56 //将APC的内容写到NVCFG中 46
(0036) #define CHK_MEM 0x59 //检查环形存储结构 49
(0037) #define SET_PLAY 0x90 //从<S10:S0>开始播放,直到<E10:E0>或EOM 80
(0038) #define SET_REC 0x91 //从<S10:S0>开始录音,直到<E10:E0> 81
(0039) #define SET_ERASE 0x92 //擦除<S10:S0>到<E10:E0>的内容 82
(0040)
(0041) #define SS_1 PORTB|=(1<<PB4) //停止SPI
(0042)
(0043) uchar SR0_L; //SR0的低位
(0044) uchar SR0_H; //SR0的高位
(0045) uchar SR1; //SR1寄存器
(0046) uchar ID,APCL=0,APCH=0;//ID和APC寄存器
(0047) /**************************************************************************
(0048) * 函数原型: ISD_SendData(unsigned int Data)
(0049) * 功 能: SPI发送数据
(0050) **************************************************************************/
(0051) void spi_sent_init(void)
(0052) { PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
_spi_sent_init:
57D B388 IN R24,0x18
57E 6F80 ORI R24,0xF0
57F BB88 OUT 0x18,R24
(0053) DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
580 B387 IN R24,0x17
581 6B80 ORI R24,0xB0
582 BB87 OUT 0x17,R24
(0054) SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
583 E783 LDI R24,0x73
584 B98D OUT 0x0D,R24
(0055) SPSR = 0x00; //预分频为128
585 2422 CLR R2
586 B82E OUT 0x0E,R2
587 9508 RET
_ISD_SendData:
sign --> R10
Data --> R16
588 92AA ST R10,-Y
(0056) }
(0057)
(0058) unsigned char ISD_SendData(unsigned int Data)
(0059) {
(0060) unsigned char sign;
(0061) PORTB &=~ (1<<PB4); //强制接收方进入从模式
589 98C4 CBI 0x18,4
(0062) SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
58A 9A6C SBI 0x0D,4
(0063) SPDR = Data; //启动数据传输
58B B90F OUT 0x0F,R16
(0064) while(!(SPSR&(1<<SPIF))); //等待传输结束
58C 9B77 SBIS 0x0E,7
58D CFFE RJMP 0x058C
(0065) sign=SPSR;
58E B0AE IN R10,0x0E
(0066) sign=SPDR;
58F B0AF IN R10,0x0F
(0067) //PORTB |= (1<<PB4);
(0068) return sign;
590 2D0A MOV R16,R10
591 90A9 LD R10,Y+
592 9508 RET
(0069) }
(0070) /**************************************************************************
(0071) * 函数原型: void GetToneAdd(uchar cNum, Uint ipStartAdd, Uint ipEndAdd);
(0072) * 功 能: 取出当前语音的首末地址
(0073) **************************************************************************/
(0074)
(0075) void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){
(0076)
(0077) *ipStartAdd=caToneAdd[cNum*2];
_GetToneAdd:
ipEndAdd --> Y,+0
ipStartAdd --> R18
cNum --> R16
593 EA80 LDI R24,0xA0
594 E090 LDI R25,0
595 2FE0 MOV R30,R16
596 27FF CLR R31
597 0FEE LSL R30
598 1FFF ROL R31
599 0FEE LSL R30
59A 1FFF ROL R31
59B 0FE8 ADD R30,R24
59C 1FF9 ADC R31,R25
59D 8020 LDD R2,Z+0
59E 8031 LDD R3,Z+1
59F 01F9 MOVW R30,R18
5A0 8231 STD Z+1,R3
5A1 8220 STD Z+0,R2
(0078) *ipEndAdd=caToneAdd[cNum*2+1];
5A2 2FE0 MOV R30,R16
5A3 27FF CLR R31
5A4 0FEE LSL R30
5A5 1FFF ROL R31
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -