📄 testlcd.lst
字号:
__start:
__text_start:
572 E5CF LDI R28,0x5F
573 E0D4 LDI R29,4
574 BFCD OUT 0x3D,R28
575 BFDE OUT 0x3E,R29
576 52C0 SUBI R28,0x20
577 40D0 SBCI R29,0
578 EA0A LDI R16,0xAA
579 8308 STD Y+0,R16
57A 2400 CLR R0
57B EBE2 LDI R30,0xB2
57C E0F0 LDI R31,0
57D E012 LDI R17,2
57E 3DEA CPI R30,0xDA
57F 07F1 CPC R31,R17
580 F011 BEQ 0x0583
581 9201 ST R0,Z+
582 CFFB RJMP 0x057E
583 8300 STD Z+0,R16
584 E9E2 LDI R30,0x92
585 E0FA LDI R31,0xA
586 E6A0 LDI R26,0x60
587 E0B0 LDI R27,0
588 E01A LDI R17,0xA
589 E000 LDI R16,0
58A BF0B OUT 0x3B,R16
58B 3EE4 CPI R30,0xE4
58C 07F1 CPC R31,R17
58D F021 BEQ 0x0592
58E 95C8 LPM
58F 9631 ADIW R30,1
590 920D ST R0,X+
591 CFF9 RJMP 0x058B
592 940E 1128 CALL _main
_exit:
594 CFFF RJMP _exit
FILE: D:\学习\AVRpro\Mega16程序\TestLCD\VS1011B.c
(0001) # include "iom16v.h"
(0002) # include "macros.h"
(0003) # include "VS1011B.h"
(0004)
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007) #ifndef SPI_CS_Deassert()
(0008) #define MMC_SD_PORT PORTB //引脚定义
(0009) #define MMC_SD_CS_PIN 4 //mega16,MMC/SD卡的片选引脚,接PortB4/ss
(0010) #define SPI_CS_Deassert() MMC_SD_PORT |= BIT(MMC_SD_CS_PIN) //SS为高,释放MMC
(0011) #endif
(0012)
(0013) extern unsigned char CurVol,CurBass;
(0014) extern void Delay(unsigned int DelayTimes);
(0015)
(0016) //以最低速度运行 //low speed
(0017) void VS1011B_SPI_Low(void)
(0018) {
(0019) SPCR = BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(SPR0);
_VS1011B_SPI_Low:
595 E583 LDI R24,0x53
596 B98D OUT 0x0D,R24
(0020) SPSR &= ~BIT(SPI2X);
597 9870 CBI 0x0E,0
598 9508 RET
(0021) }
(0022)
(0023) //以FCK/4速度运行 //full speed
(0024) void VS1011B_SPI_High(void)
(0025) {
(0026) SPCR = BIT(SPE)|BIT(MSTR);
_VS1011B_SPI_High:
599 E580 LDI R24,0x50
59A B98D OUT 0x0D,R24
(0027) SPSR |= BIT(SPI2X);
59B 9A70 SBI 0x0E,0
59C 9508 RET
(0028) }
(0029)
(0030) //向VS1011B写一字节 //write one byte to vs1011b
(0031) void VS1011B_WriteByte(unsigned char CH)
(0032) {
(0033) SPDR = CH;
_VS1011B_WriteByte:
CH --> R16
59D B90F OUT 0x0F,R16
(0034) while(!(SPSR & BIT(SPIF)));
59E 9B77 SBIS 0x0E,7
59F CFFE RJMP 0x059E
5A0 9508 RET
(0035) }
(0036)
(0037) //从VS1011B读一字节 //read one byte from vs1011b
(0038) unsigned char VS1011B_ReadByte(void)
(0039) {
(0040) SPDR = 0xff;
_VS1011B_ReadByte:
5A1 EF8F LDI R24,0xFF
5A2 B98F OUT 0x0F,R24
(0041) while(!(SPSR & BIT(SPIF)));
5A3 9B77 SBIS 0x0E,7
5A4 CFFE RJMP 0x05A3
(0042) return SPDR;
5A5 B10F IN R16,0x0F
5A6 9508 RET
_VS1011B_WriteCMD:
dat --> R10
addr --> R12
5A7 940E 16A2 CALL push_xgset003C
5A9 0159 MOVW R10,R18
5AA 2EC0 MOV R12,R16
(0043) }
(0044)
(0045) //写寄存器,参数,地址和数据 //config register
(0046) void VS1011B_WriteCMD(unsigned char addr, unsigned int dat)
(0047) {
(0048) VS1011B_XDCS_H();
5AB 9AD8 SBI 0x1B,0
(0049) VS1011B_XCS_L();
5AC 98D9 CBI 0x1B,1
(0050) VS1011B_WriteByte(0x02);
5AD E002 LDI R16,2
5AE DFEE RCALL _VS1011B_WriteByte
(0051) VS1011B_WriteByte(addr);
5AF 2D0C MOV R16,R12
5B0 DFEC RCALL _VS1011B_WriteByte
(0052) VS1011B_WriteByte(dat>>8);
5B1 0185 MOVW R16,R10
5B2 2F01 MOV R16,R17
5B3 2711 CLR R17
5B4 DFE8 RCALL _VS1011B_WriteByte
(0053) VS1011B_WriteByte(dat);
5B5 2D0A MOV R16,R10
5B6 DFE6 RCALL _VS1011B_WriteByte
(0054) VS1011B_XCS_H();
5B7 9AD9 SBI 0x1B,1
5B8 940C 1690 JMP pop_xgset003C
_VS1011B_ReadCMD:
temp --> R10
addr --> R10
5BA 92AA ST R10,-Y
5BB 92BA ST R11,-Y
5BC 2EA0 MOV R10,R16
(0055) }
(0056)
(0057) //读寄存器,参数 地址 返回内容 //read register
(0058) unsigned int VS1011B_ReadCMD(unsigned char addr)
(0059) {
(0060) unsigned int temp;
(0061) VS1011B_XDCS_H();
5BD 9AD8 SBI 0x1B,0
(0062) VS1011B_XCS_L();
5BE 98D9 CBI 0x1B,1
(0063) VS1011B_WriteByte(0x03);
5BF E003 LDI R16,3
5C0 DFDC RCALL _VS1011B_WriteByte
(0064) VS1011B_WriteByte(addr);
5C1 2D0A MOV R16,R10
5C2 DFDA RCALL _VS1011B_WriteByte
(0065) temp = VS1011B_ReadByte();
5C3 DFDD RCALL _VS1011B_ReadByte
5C4 2EA0 MOV R10,R16
5C5 24BB CLR R11
(0066) temp <<= 8;
5C6 2CBA MOV R11,R10
5C7 24AA CLR R10
(0067) temp += VS1011B_ReadByte();
5C8 DFD8 RCALL _VS1011B_ReadByte
5C9 2E20 MOV R2,R16
5CA 2433 CLR R3
5CB 0CA2 ADD R10,R2
5CC 1CB3 ADC R11,R3
(0068) VS1011B_XCS_H();
5CD 9AD9 SBI 0x1B,1
(0069) return temp;
5CE 0185 MOVW R16,R10
5CF 90B9 LD R11,Y+
5D0 90A9 LD R10,Y+
5D1 9508 RET
_VS1011B_WriteDAT:
dat --> R10
5D2 92AA ST R10,-Y
5D3 2EA0 MOV R10,R16
(0070) }
(0071)
(0072) //写数据,音乐数据 //write data (music data)
(0073) void VS1011B_WriteDAT(unsigned char dat)
(0074) {
(0075) VS1011B_XDCS_L();
5D4 98D8 CBI 0x1B,0
(0076) VS1011B_WriteByte(dat);
5D5 2D0A MOV R16,R10
5D6 DFC6 RCALL _VS1011B_WriteByte
(0077) VS1011B_XDCS_H();
5D7 9AD8 SBI 0x1B,0
(0078) VS1011B_XCS_H();
5D8 9AD9 SBI 0x1B,1
5D9 90A9 LD R10,Y+
5DA 9508 RET
_VS1011B_Init:
Tmp --> R10
retry --> R20
5DB 940E 16C7 CALL push_xgsetF03C
(0079) }
(0080)
(0081) // 1 means fail, 0 OK!
(0082) unsigned char VS1011B_Init(void)
(0083) {
(0084) unsigned char retry;
(0085) unsigned int Tmp;
(0086) DDRB |= BIT(4)|BIT(5)|BIT(7); //mega16,这些SPI端口要输出
5DD B387 IN R24,0x17
5DE 6B80 ORI R24,0xB0
5DF BB87 OUT 0x17,R24
(0087) DDRB &=~BIT(6); //MISO为输入方式
5E0 98BE CBI 0x17,6
(0088) SPI_CS_Deassert(); //释放MMC/SD卡
5E1 9AC4 SBI 0x18,4
(0089) VS1011B_PORT_INI();
5E2 B38A IN R24,0x1A
5E3 6483 ORI R24,0x43
5E4 BB8A OUT 0x1A,R24
(0090) DDRA &=~BIT(VS1011B_DREQ); //DREQ为输入
5E5 98D2 CBI 0x1A,2
(0091) PORTA|= BIT(VS1011B_DREQ); //DREQ=1
5E6 9ADA SBI 0x1B,2
(0092)
(0093) VS1011B_XCS_H();
5E7 9AD9 SBI 0x1B,1
(0094) VS1011B_XDCS_H();
5E8 9AD8 SBI 0x1B,0
(0095) VS1011B_XRESET_L();
5E9 98DE CBI 0x1B,6
(0096) Delay(2);
5EA E002 LDI R16,2
5EB E010 LDI R17,0
5EC D484 RCALL _Delay
(0097) VS1011B_XRESET_H();//使能芯片 //chip select
5ED 9ADE SBI 0x1B,6
(0098) VS1011B_SPI_Low();//先以低频操作 //low speed
5EE DFA6 RCALL _VS1011B_SPI_Low
(0099) Delay(2);
5EF E002 LDI R16,2
5F0 E010 LDI R17,0
5F1 D47F RCALL _Delay
(0100) Delay(2);
5F2 E002 LDI R16,2
5F3 E010 LDI R17,0
5F4 D47C RCALL _Delay
(0101) retry=0;
5F5 2744 CLR R20
(0102)
(0103) VS1011B_ReadCMD(0x03);
5F6 E003 LDI R16,3
5F7 DFC2 RCALL _VS1011B_ReadCMD
5F8 C00C RJMP 0x0605
(0104) while(VS1011B_ReadCMD(0x03)!=CLOCK_REG)//写时钟寄存器 //set PLL register
(0105) {
(0106) VS1011B_WriteCMD(0x03,CLOCK_REG);
5F9 E020 LDI R18,0
5FA E330 LDI R19,0x30
5FB E003 LDI R16,3
5FC DFAA RCALL _VS1011B_WriteCMD
(0107) if(retry++ >10 )return 1;
5FD 2E24 MOV R2,R20
5FE 2433 CLR R3
5FF 5F4F SUBI R20,0xFF
600 E08A LDI R24,0xA
601 1582 CP R24,R2
602 F410 BCC 0x0605
603 E001 LDI R16,1
604 C056 RJMP 0x065B
605 E003 LDI R16,3
606 DFB3 RCALL _VS1011B_ReadCMD
607 3000 CPI R16,0
608 E3E0 LDI R30,0x30
609 071E CPC R17,R30
60A F771 BNE 0x05F9
(0108) }
(0109)
(0110) Delay(2);
60B E002 LDI R16,2
60C E010 LDI R17,0
60D D463 RCALL _Delay
(0111)
(0112) VS1011B_WriteCMD(0x05,0xBB81);//0xBB81 AC45);
60E E821 LDI R18,0x81
60F EB3B LDI R19,0xBB
610 E005 LDI R16,5
611 DF95 RCALL _VS1011B_WriteCMD
(0113)
(0114) retry=0;
612 2744 CLR R20
(0115) Tmp=CurVol*256+CurVol;
613 90A0 00D1 LDS R10,CurVol
615 2D2A MOV R18,R10
616 940E 19FC CALL 0x19FC
618 0118 MOVW R2,R16
619 2C4A MOV R4,R10
61A 2455 CLR R5
61B 0C24 ADD R2,R4
61C 1C35 ADC R3,R5
61D 0151 MOVW R10,R2
61E C008 RJMP 0x0627
(0116) while(VS1011B_ReadCMD(0x0b) != Tmp)//设音量 //set Volume
(0117) {
(0118) VS1011B_WriteCMD(0x0b,Tmp);
61F 0195 MOVW R18,R10
620 E00B LDI R16,0xB
621 DF85 RCALL _VS1011B_WriteCMD
622 940E 18E6 CALL 0x18E6
(0119) if(retry++ >10 )return 2;
624 F410 BCC 0x0627
625 E002 LDI R16,2
626 C034 RJMP 0x065B
627 E00B LDI R16,0xB
628 DF91 RCALL _VS1011B_ReadCMD
629 0168 MOVW R12,R16
62A 150A CP R16,R10
62B 051B CPC R17,R11
62C F791 BNE 0x061F
(0120) }
(0121)
(0122) retry=0;
62D 2744 CLR R20
(0123) Tmp=CurBass;
62E 90A0 00D0 LDS R10,CurBass
630 24BB CLR R11
631 C008 RJMP 0x063A
(0124) while(VS1011B_ReadCMD(0x02)!=Tmp)//写低音寄存器
(0125) {
(0126) VS1011B_WriteCMD(0x02,Tmp);
632 0195 MOVW R18,R10
633 E002 LDI R16,2
634 DF72 RCALL _VS1011B_WriteCMD
635 940E 18E6 CALL 0x18E6
(0127) if(retry++ >10 )return 1;
637 F410 BCC 0x063A
638 E001 LDI R16,1
639 C021 RJMP 0x065B
63A E002 LDI R16,2
63B DF7E RCALL _VS1011B_ReadCMD
63C 0168 MOVW R12,R16
63D 150A CP R16,R10
63E 051B CPC R17,R11
63F F791 BNE 0x0632
(0128) }
(0129) Delay(2);
640 E002 LDI R16,2
641 E010 LDI R17,0
642 D42E RCALL _Delay
(0130)
(0131) retry=0;
643 2744 CLR R20
644 C009 RJMP 0x064E
(0132) while(VS1011B_ReadCMD(0x00) != 0x0800)//0x0800)//写mode寄存器 //set mode register
(0133) {
(0134) VS1011B_WriteCMD(0x00,0x0800);//0x0800);
645 E020 LDI R18,0
646 E038 LDI R19,0x8
647 2700 CLR R16
648 DF5E RCALL _VS1011B_WriteCMD
649 940E 18E6 CALL 0x18E6
(0135) if(retry++ >10 )return 3;//
64B F410 BCC 0x064E
64C E003 LDI R16,3
64D C00D RJMP 0x065B
64E 2700 CLR R16
64F DF6A RCALL _VS1011B_ReadCMD
650 01B8 MOVW R22,R16
651 3000 CPI R16,0
652 E0E8 LDI R30,0x8
653 071E CPC R17,R30
654 F781 BNE 0x0645
(0136) }
(0137)
(0138) Delay(2);
655 E002 LDI R16,2
656 E010 LDI R17,0
657 D419 RCALL _Delay
(0139)
(0140) VS1011B_SoftReset();
658 D004 RCALL _VS1011B_SoftReset
(0141) VS1011B_SPI_High();
659 DF3F RCALL _VS1011B_SPI_High
(0142) return 0;
65A 2700 CLR R16
65B 940C 16CE JMP pop_xgsetF03C
(0143) }
(0144)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -