Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #define LCD_DDR DDRB
- #define LCD_PORT PORTB
- #define LCD_RS 0
- #define LCD_EN 1
- #define LCD_DB4 4
- #define LCD_DB5 5
- #define LCD_DB6 6
- #define LCD_DB7 7
- static char numberOfChars = 0;
- void send_char(char key) //funkcja wysyłająca znak do wyświetlacza
- {
- PORTB|=0b00000001; //najmłodszy bit ustawiony na 1 informuje wyświetlacz że chcemy wyświetlić znak
- send(key); //wywołanie funkcji wysyłania
- }
- void send(char key) //funkcja wysyłająca informacje do wyświetlacza
- {
- PORTB|=00000010; // podniesienie stanu drugiego bitu
- PORTB=(PORTB & 0x0F)| (key & 0xF0); //PORTB przyjmie wartość czterech lewych bitów znaku „key” , a pozostałe //bity tego rejestru (4 młodsze) pozostaną bez zmian
- asm("nop"); //odczekanie trzech taktów procesora
- asm("nop");
- asm("nop");
- PORTB&=0b11111101; //ustawienie drugiego bitu na 0 powoduje wysłanie części znaku do wyświetlacza
- _delay_ms(2); //opóźnienie 2ms
- PORTB|=0b00000010; //ustawienie drugiego bitu w stan wysoki
- PORTB=(PORTB & 0x0F)| ((key & 0x0F)<<4); //PORTB przyjmie wartość czterech prawych bitów znaku „key” , a pozostałe //bity tego rejestru (4 młodsze) pozostaną bez zmian
- asm("nop"); //odczekanie trzech taktów procesora
- asm("nop");
- asm("nop");
- PORTB&=0b11111101; // wysłanie części znaku do wyświetlacza (reakcja na opadające zbocze)
- _delay_ms(2);
- }
- void printText(char *text, int textLength)
- {
- int k=0;
- while(k < textLength)
- {
- if(numberOfChars >= 17)
- {
- nextLine();
- numberOfChars = 0;
- }
- printChar(text[k]);
- numberOfChars++;
- k++;
- }
- }
- void nextLine()
- {
- LCD_PORT &= ~(_BV(LCD_RS));
- printChar( 0x80+0x28 );
- LCD_PORT |= _BV(LCD_RS);
- }
- uint8_t myChar[] = {0x08, 0x08, 0x04, 0x02, 0x04, 0x08, 0x08, 0x00};
- void clear_LCD() //funkcja „czyszcząca” wyświetlacz
- {
- send_command(1); //wysłanie do wyświetlacza komendy o kodzie 0b00000001
- _delay_ms(2); //czekamy 2ms
- }
- void clear_LCD() //funkcja „czyszcząca” wyświetlacz
- {
- send_command(1); //wysłanie do wyświetlacza komendy o kodzie 0b00000001
- _delay_ms(2); //czekamy 2ms
- }
- void configure_LCD() //funkcja przygotowująca wyświetlacz do pracy
- {
- send_command(0b00101100); // 4 bity, 2 linie, 5x10
- send_command(0b00001110); //wyświetlanie, kursor , miganie
- }
- unsigned char KbScan()
- {
- unsigned char result = 0xFF;
- unsigned char i, j;
- PORTA = 0xFF;
- for(i = 0; i < 4; i++)
- {
- DDRA = (1<<i+4);
- PORTA = ~(1<<i+4);
- for(j = 0; j < 4; j++)
- {
- _delay_ms(2);
- if(!(PINA & (1<<j)))
- {
- _delay_ms(2);
- result = PINA;
- }
- }
- }
- switch(result)
- {
- case 0b11101110:
- return 1;
- case 0b11011110:
- return 2;
- case 0b10111110:
- return 3;
- case 0b01111110:
- return 4;
- case 0b11101101:
- return 5;
- case 0b11011101:
- return 6;
- case 0b10111101:
- return 7;
- case 0b01111101:
- return 8;
- case 0b11101011:
- return 9;
- case 0b11011011:
- return 10;
- case 0b10111011:
- return 11;
- case 0b01111011:
- return 12;
- case 0b11100111:
- return 13;
- case 0b11010111:
- return 14;
- case 0b10110111:
- return 15;
- case 0b01110111:
- return 16;
- case 0b11111111:
- return 0;
- default:
- return 1;
- }
- }
- volatile char temp = 0;
- ISR(INT0_vect)
- {
- LCD_PORT &= ~(_BV(LCD_RS));
- printChar(0b00000001); //czyszczenie wyswietlacza
- LCD_PORT |= _BV(LCD_RS);
- print(temp);
- _delay_ms(10);
- }
- void print(char x)
- {
- switch(x)
- {
- case 1:
- send_char('1');break;
- case 2:
- send_char('2');break;
- case 3:
- send_char('3');break;
- case 4:
- send_charr('4');break;
- case 5:
- send_char('5');break;
- case 6:
- send_char('6');break;
- case 7:
- send_char('7');break;
- case 8:
- send_char('8');break;
- case 9:
- send_char('9');break;
- case 10:
- send_char('1');send_char('0');break;
- case 11:
- send_char('1');send_char('1');break;
- case 12:
- send_char('1');send_char('2');break;
- case 13:
- send_char('1');send_charr('3');break;
- case 14:
- send_char('1');send_char('4');break;
- case 15:
- send_char('1');send_char('5');break;
- case 16:
- send_charr('1');send_char('6');break;
- }
- }
- int main()
- {
- DDRA = 0xFF;
- PORTA = 0xFF;
- PORTB = 0xFF;
- DDRB = 0xFF;
- sei();
- MCUCR |= (1<<ISC01);
- GICR |= (1<<INT0);
- clear_LCD();
- configure_LCD();
- while(1)
- {
- temp = KbScan();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement