#include __CONFIG(WDTDIS & XT & UNPROTECT & LVPDIS); // freq. clock 4MHz //__CONFIG(WDTDIS & HS & UNPROTECT & LVPDIS); // freq. clock 20MHz #define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit)) static bit CSL @ PORTBIT(PORTA, 0); static bit CSR @ PORTBIT(PORTA, 1); static bit BLK @ PORTBIT(PORTA, 2); static bit CLK @ PORTBIT(PORTA, 3); static bit DAT @ PORTBIT(PORTA, 5); static bit ST1 @ PORTBIT(PORTB, 5); static bit ST0 @ PORTBIT(PORTB, 4); static bit VUP @ PORTBIT(PORTC, 7); static bit VDW @ PORTBIT(PORTC, 6); #ifndef XTAL_FREQ #define XTAL_FREQ 4MHZ /* Crystal frequency in MHz */ #endif #define MHZ *1000L /* number of kHz in a MHz */ #define KHZ *1 /* number of kHz in a kHz */ #if XTAL_FREQ >= 12MHZ #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \ while(--_dcnt != 0) \ continue; } #else #define DelayUs(x) { unsigned char _dcnt; \ _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \ while(--_dcnt != 0) \ continue; } #endif void DelayMs(unsigned char cnt); void write_SPI(unsigned int data, unsigned int len); #define MAX_VOL (1023) #define INC_VOL (1) void main() { int i, flag = 1; unsigned char buf, curr, SAVEPOR; int vol = 0, mod_lev = 0, auto_incr = 1; TRISA = 0b00000000; // All ports A are output TRISB = 0b00110000; // Only Rb4 and 5 are input TRISC = 0b11000000; // Only Rc6 and 7 are input ADCON1 = 0x06; // All posts AN4-7 to digital PORTA = 0b00000000; CSL = 1; CSR = 1; DAT = 0; CLK = 0; //################################################## //# wait 1 second for power supply startup //################################################## BLK = 0; DelayMs(250); BLK = 1; DelayMs(250); BLK = 0; DelayMs(250); BLK = 1; DelayMs(250); //################################################## //# set the AD1955 in mono mode //################################################## CSL = 0; write_SPI(0b00001100, 8); write_SPI(0b00000000, 8); CSL = 1; DelayMs(5); CSR = 0; write_SPI(0b00001000, 8); write_SPI(0b00000000, 8); CSR = 1; while(1) { if (VUP == 0) { if (vol < MAX_VOL) { if (vol < (MAX_VOL - INC_VOL)) vol += INC_VOL; else vol = MAX_VOL; } mod_lev = 1; auto_incr = 0; } if (VDW == 0) { if (vol > 0) { if (vol > INC_VOL) vol -= INC_VOL; else vol = 0; } mod_lev = 1; auto_incr = 0; } if (auto_incr == 1 || mod_lev == 1) { //################################################## //# set the AD1955 volume //################################################## CSR = 0; CSL = 0; write_SPI(vol, 10); write_SPI(0b1111, 4); write_SPI(0b11, 2); CSR = 1; CSL = 1; CSR = 0; CSL = 0; write_SPI(vol, 10); write_SPI(0b1111, 4); write_SPI(0b10, 2); CSR = 1; CSL = 1; if (auto_incr == 1) { if (vol == MAX_VOL) auto_incr = 0; else vol++; } DelayMs(1); mod_lev = 0; } } } void write_SPI(unsigned int data, unsigned int n_bit) { unsigned int bit_mask; int i; bit_mask = 1 << (n_bit - 1); for (i = 0; i < n_bit; i++) { CLK = 0; DelayUs(100); if ((data & bit_mask) == 0) DAT = 0; else DAT = 1; DelayUs(100); CLK = 1; data <<= 1; } } void DelayMs(unsigned char cnt) { #if XTAL_FREQ <= 2MHZ do { DelayUs(996); } while(--cnt); #endif #if XTAL_FREQ > 2MHZ unsigned char i; do { i = 4; do { DelayUs(250); } while(--i); } while(--cnt); #endif }