#define F_CPU 3686400 #include #include // Pinbelegung für das LCD, an verwendete Pins anpassen // DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_RS PD5 #define LCD_EN PD4 //////////////////////////////////////////////////////////////////////////////// // erzeugt den Enable-Puls void lcd_enable(void) { LCD_PORT |= (1<> 4; temp1 = temp1 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } //////////////////////////////////////////////////////////////////////////////// // sendet einen Befehl an das LCD void lcd_command(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT &= ~(1<> 4; // oberes Nibble holen temp1 = temp1 & 0x0F; // maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_ms(2); } //////////////////////////////////////////////////////////////////////////////// // Schreibt ein Zeichen in den Character Generator RAM void lcd_generatechar(uint8_t code, const uint8_t *data) { // Startposition des Zeichens einstellen lcd_command(0x40|(code<<3)); // Bitmuster übertragen for (uint8_t i=0; i<8; i++) { lcd_data(data[i]); } lcd_command(0x80); } //////////////////////////////////////////////////////////////////////////////// // Initialisierung: void lcd_init(void) { LCD_DDR = LCD_DDR | 0x0F | (1<=100) lcd_data(0x4F); else lcd_string(" "); e=dataa-d*10; //"Einer" if (e==1) lcd_data(1); else if (e==2) lcd_data(2); else if (e==3) lcd_data(3); else if (e==4) lcd_data(4); else if (e==5) lcd_data(5); else if (e==6) lcd_data(6); else if (e==7) lcd_data(7); else if (e==8) lcd_data(0x38); else if (e==9) lcd_data(0); else if (e==0) lcd_data(0x4F); } //////////////////////////////////////////////////////////////////////////////// // sendet die aktuelle Volume über Port B an PGA void output(int zahl) { int xx; zahl = 192+(zahl*2); zahl |= (zahl<<8); PORTB &= ~(1<<7); PORTB &= ~(1<<5); PORTB &= ~(1<<6); for (xx=15;xx>-1;xx--) { _delay_us(100); if ( zahl & ( 1 << xx ) ) { PORTB |= (1<< 6); } _delay_us(100); PORTB |= (1<< 5); _delay_us(100); PORTB &= ~(1<< 6); _delay_us(100); PORTB &= ~(1<< 5); } PORTB &= ~(1<<6); _delay_us(100); PORTB &= ~(1<< 5); _delay_us(100); PORTB |= (1<< 7); } //////////////////////////////////////////////////////////////////////////////// // Hauptprogramm int main(void) { DDRD = 0xFF; PORTD = 0xFF; DDRB = 0xF0; PINB = 0x0F; unsigned int x; int zaehler; int zaehlermute; int mute; unsigned int blackout; int blackout2; lcd_init(); uint8_t chrdata1[8] = { 0b00001110, // XXX 0b00000100, // X 0b00000100, // X 0b00000100, // X 0b00000100, // X 0b00001100, // XX 0b00000100, // X 0b00000000 }; uint8_t chrdata2[8] = { 0b00011111, // XXXXX 0b00001000, // X 0b00000100, // X 0b00000010, // X 0b00000001, // X 0b00010001, // X X 0b00001110, // XXX 0b00000000 }; uint8_t chrdata3[8] = { 0b00001110, // XXX 0b00010001, // X X 0b00000001, // X 0b00000010, // X 0b00000100, // X 0b00000010, // X 0b00011111, // XXXXX 0b00000000 }; uint8_t chrdata4[8] = { 0b00000010, // X 0b00000010, // X 0b00011111, // XXXXX 0b00010010, // X X 0b00001010, // X X 0b00000110, // XX 0b00000010, // X 0b00000000 }; uint8_t chrdata5[8] = { 0b00001110, // XXX 0b00010001, // X X 0b00000001, // X 0b00000001, // X 0b00011110, // XXXX 0b00010000, // X 0b00011111, // XXXXX 0b00000000 }; uint8_t chrdata6[8] = { 0b00001110, // XXX 0b00010001, // X X 0b00010001, // X X 0b00011110, // XXXX 0b00010000, // X 0b00001000, // X 0b00000110, // XX 0b00000000 }; uint8_t chrdata7[8] = { 0b00001000, // X 0b00001000, // X 0b00001000, // X 0b00000100, // X 0b00000010, // X 0b00000001, // X 0b00011111, // XXXXX 0b00000000 }; uint8_t chrdata0[8] = { 0b00001100, // XX 0b00000010, // X 0b00000001, // X 0b00001111, // XXXX 0b00010001, // X X 0b00010001, // X X 0b00001110, // XXX 0b00000000 }; lcd_generatechar(1, chrdata0); lcd_generatechar(2, chrdata2); lcd_generatechar(3, chrdata3); lcd_generatechar(4, chrdata4); lcd_generatechar(5, chrdata5); lcd_generatechar(6, chrdata6); lcd_generatechar(7, chrdata7); lcd_generatechar(0, chrdata1); mute=-1; x=0 ; zaehler=-20 ; zaehlermute = 0; PORTB = 0b10001111; blackout = 0; blackout2 = 0; goto outputtest; lcd_zahl(zaehler); output(zaehler); loop: if (PINB == 0b10001111) x=0; if (PINB == 0b10001101) x=1; if (PINB == 0b10001110) x=2; if (PINB == 0b10001011) goto mute; if (PINB == 0b10001100) { if (x==1) goto leise; else if (x==2) goto laut; } if (mute<0) blackout++; if (blackout == 65000) { blackout2 ++; blackout = 0; } if (blackout2 == 2) { blackout = 0; blackout2 = 0; set_cursor (0,1); lcd_string(" "); } goto loop; laut: { blackout = 0; blackout2 = 0; if (zaehler<=30) { mute=-1; zaehler=zaehler+1; zaehlermute = zaehler; lcd_zahl(zaehler); output(zaehler); } x=0; goto loop; } leise: { blackout = 0; blackout2 = 0; if (zaehler>=-95) { mute=-1; zaehler=zaehler-1; zaehlermute = zaehler; lcd_zahl(zaehler); output(zaehler); } x=0; goto loop; } mute: { mute=-mute; if (mute>0) { zaehlermute = zaehler; set_cursor(0,1); lcd_data(0x17); lcd_data(0x4F); lcd_data(0x09); set_cursor(5,1); lcd_string(" "); set_cursor(6,1); lcd_data(0xEE); zaehler = -96; output(zaehler); } if (mute<0) { zaehler = zaehlermute; lcd_zahl(zaehler); output(zaehler); } _delay_ms(100); goto loop; } outputtest: lcd_data(0); lcd_data(1); lcd_data(2); lcd_data(3); lcd_data(4); lcd_data(5); lcd_data(6); lcd_data(7); }