音量控制M62446的驱动C程序 音量控制M62446 m62446 pdf //------------------------------------------------------------------------- // M62446 drving routines, VER 1.0 // // COPYRIGHT (C) 2000, Enbia Technology Inc. // Target: 8031 // AUTHOR: STEVEN LUO // // Revision History: // 2001/1/5 - Original Version // //------------------------------------------------------------------------- #include <reg51.h> #include <types.h> #include <intrins.h> #include <bin.h> extern BOOL PIN_M62446_LATCH; extern BOOL PIN_M62446_DATA; extern BOOL PIN_M62446_CLK; static idata WORD shadow_word00=0; static idata WORD shadow_word01=0; static idata WORD shadow_word10=0; static idata WORD shadow_word11=0; // for storing the control word status // static BOOL bM62446Muted; // Set when 62446 is muted static void Write_M62446_Word(WORD myword); //------------------------------------------------------------------------- // Name: Volume_Validate // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- static BYTE Volume_Validate(char vol){ if(vol<0)vol=0; // negative, should be 0 else if(vol >80) vol=80; // >80, set to 80 return 80 - vol; // Down to Up } //------------------------------------------------------------------------- // Name: Mute_M62446 // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- void Mute_M62446(void){ Write_M62446_Word(0xa141); // B1010000 1010000 01, B10100001_01000001 Write_M62446_Word(0xa142); Write_M62446_Word(0xa143); bM62446Muted = 1; } //------------------------------------------------------------------------- // Name: UnMute_M62446 // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- void UnMute_M62446(void){ shadow_word01&=0xfffc; shadow_word01|=0x01; Write_M62446_Word(shadow_word01); shadow_word10&=0xfffc; shadow_word10|=0x02; Write_M62446_Word(shadow_word10); shadow_word11&=0xfffc; shadow_word11|=0x03; Write_M62446_Word(shadow_word11); bM62446Muted = 0; } //------------------------------------------------------------------------- // Name: Write_M62446_Left // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_Left(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=9; shadow_word01&=0x01ff; shadow_word01|=temp; // DE=0;DF=1; shadow_word01&=0xfffc; shadow_word01|=0x01; if (bM62446Muted) return; Write_M62446_Word(shadow_word01); } //------------------------------------------------------------------------- // Name: Write_M62446_Right // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_Right(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=2; shadow_word01&=0xfe03; shadow_word01|=temp; // DE=0;DF=1; shadow_word01&=0xfffc; shadow_word01|=0x01; if (bM62446Muted) return; Write_M62446_Word(shadow_word01); } //------------------------------------------------------------------------- // Name: Write_M62446_Center // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_Center(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=9; shadow_word10&=0x01ff; shadow_word10|=temp; // DE=1;DF=0; shadow_word10&=0xfffc; shadow_word10|=0x02; if (bM62446Muted) return; Write_M62446_Word(shadow_word10); } //------------------------------------------------------------------------- // Name: Write_M62446_SubWoofer // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_SubWoofer(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=2; shadow_word10&=0xfe03; shadow_word10|=temp; // DE=1;DF=0; shadow_word10&=0xfffc; shadow_word10|=0x02; if (bM62446Muted) return; Write_M62446_Word(shadow_word10); } //------------------------------------------------------------------------- // Name: Write_M62446_SurLeft // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_SurLeft(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=9; shadow_word11&=0x01ff; shadow_word11|=temp; // DE=1;DF=1; shadow_word11&=0xfffc; shadow_word11|=0x03; if (bM62446Muted) return; Write_M62446_Word(shadow_word11); } //------------------------------------------------------------------------- // Name: Write_M62446_SurRight // Description: This function Write 2 bytes to M62446 // Arguments: // Return value: none //------------------------------------------------------------------------- void Write_M62446_SurRight(char vol){ WORD temp; temp=Volume_Validate(vol); temp<<=2; shadow_word11&=0xfe03; shadow_word11|=temp; // DE=1;DF=1; shadow_word11&=0xfffc; shadow_word11|=0x03; if (bM62446Muted) return; Write_M62446_Word(shadow_word11); } static BYTE code Treble_Bass_TAB[11]={ 0x0e, // 0, -10db 0x0c, // 1, -8db 0x0b, // 2, -6db 0x0a, // 3, -4db 0x09, // 4, -2db 0x00, // 5, 0db 0x01, // 6, +2db 0x02, // 7, +4db 0x03, // 8, +6db 0x04, // 9, +8db 0x06 // 10, +10db }; //------------------------------------------------------------------------- // Name: Write_M62446_Treble // Description: This function Write 2 bytes to M62446 // Arguments: 0-20, // 0: -10db // 10: 0db // 20 +10db // Return value: none //------------------------------------------------------------------------- void Write_M62446_Treble(BYTE Treble){ WORD temp; Treble=Treble_Bass_TAB[Treble]; temp=Treble; temp<<=12; shadow_word00&=0x0fff; shadow_word00|=temp; // DE=0;DF=0; shadow_word00&=0xfffc; Write_M62446_Word(shadow_word00); } //------------------------------------------------------------------------- // Name: Write_M62446_Bass // Description: This function Write 2 bytes to M62446 // Arguments: 0-20, // 0: -10db // 10: 0db // 20 +10db // Return value: none //------------------------------------------------------------------------- void Write_M62446_Bass(BYTE Bass){ WORD temp; Bass=Treble_Bass_TAB[Bass]; temp=Bass; temp<<=4; shadow_word00&=0xff0f; shadow_word00|=temp; // DE=0;DF=0; shadow_word00&=0xfffc; Write_M62446_Word(shadow_word00); } //------------------------------------------------------------------------- // Name: Write_M62446_Bypass // Description: This function Write 2 bytes to M62446 // Arguments: 1, bypass on, 0: off // Return value: none //------------------------------------------------------------------------- void Write_M62446_Bypass(BOOL bOnOff){ if (bOnOff) shadow_word00 |= 0x0004; // On else shadow_word00 &= 0xfffb; // off // DE=0;DF=0; shadow_word00 &= 0xfffc; Write_M62446_Word(shadow_word00); } //---------- |