Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include "lcd.h"
- #include <util/delay.h>
- void add_second();
- int valikko(); /* tekee valikon */
- int pelaa(); /* pelaa peliä, palauttaa pelituloksen arvon */
- void tilastot(); /* näyttää tilastot */
- void lcd_gotoxy (unsigned char x, unsigned char y); /* asettaa kursorin haluttuun paikkaan näytöllä */
- char seconds = 0;
- void init(void) {
- /* estetään kaikki keskeytykset */
- cli();
- /* kaiutin pinnit ulostuloksi */
- DDRE |= (1 << PE4) | (1 << PE5);
- /* pinni PE4 nollataan */
- PORTE &= ~(1 << PE4);
- /* pinni PE5 asetetaan */
- PORTE |= (1 << PE5);
- /* ajastin nollautuu, kun sen ja OCR1A rekisterin arvot ovat samat */
- TCCR1A &= ~( (1 << WGM11) | (1 << WGM10) );
- TCCR1B |= (1 << WGM12);
- TCCR1B &= ~(1 << WGM13);
- /* salli keskeytys, jos ajastimen ja OCR1A rekisterin arvot ovat samat */
- TIMSK |= (1 << OCIE1A);
- /* asetetaan OCR1A rekisterin arvoksi 0x3e (~250hz) */
- OCR1AH = 0x00;
- OCR1AL = 0x14;
- /* käynnistä ajastin ja käytä kellotaajuutena (16 000 000 / 1024) Hz */
- TCCR1B |= (1 << CS12) | (1 << CS10);
- /* näppäin pinnit sisääntuloksi */
- DDRA &= ~(1 << PA0);
- DDRA &= ~(1 << PA2);
- DDRA &= ~(1 << PA4);
- /* rele/led pinni ulostuloksi */
- DDRA |= (1 << PA6);
- /* lcd-näytön alustaminen */
- lcd_init();
- lcd_write_ctrl(LCD_ON);
- lcd_write_ctrl(LCD_CLEAR);
- }
- int main(void)
- {
- int i;
- init();
- sei();
- while(1){
- i = valikko();
- if (i == 1){
- pelaa();
- i = valikko();
- }
- if (i == 0){
- tilastot();
- i = valikko();
- }
- }
- }
- int valikko(){
- init();
- int naytto = 0, valikon_arvo;
- while (1) {
- if (naytto == 0) {
- lcd_write_data('P');
- lcd_write_data('e');
- lcd_write_data('l');
- lcd_write_data('i');
- lcd_write_data('i');
- lcd_write_data('n');
- lcd_write_data(':');
- lcd_write_data(' ');
- lcd_write_data('v');
- lcd_write_data('a');
- lcd_write_data('s');
- lcd_write_data('e');
- lcd_write_data('n');
- lcd_gotoxy (0, 1);
- lcd_write_data('T');
- lcd_write_data('i');
- lcd_write_data('l');
- lcd_write_data('a');
- lcd_write_data('s');
- lcd_write_data('t');
- lcd_write_data('o');
- lcd_write_data('t');
- lcd_write_data(':');
- lcd_write_data(' ');
- lcd_write_data('o');
- lcd_write_data('i');
- lcd_write_data('k');
- lcd_write_data('e');
- lcd_write_data('a');
- naytto = 1;
- }
- if (!(PINA & (1 << PA3))){
- valikon_arvo = 0;
- break;
- }
- if (!(PINA & (1 << PA1))){
- valikon_arvo = 1;
- break;
- }
- }
- return valikon_arvo;
- }
- int pelaa(){
- int kentan_oikea_puoli [16];
- int kentan_vasen_puoli [16];
- while(1){
- add_second();
- _delay_ms(800);
- }
- }
- void tilastot() {
- lcd_write_ctrl(LCD_CLEAR);
- lcd_write_data('T');
- }
- void lcd_gotoxy (unsigned char x, unsigned char y)
- {
- if ( y==0 )
- lcd_write_ctrl(LCD_DDRAM | (LCD_START_LINE1+x));
- else
- lcd_write_ctrl(LCD_DDRAM | (LCD_START_LINE2+x));
- }
- void add_second(void){
- char tens_seconds = 0;
- /* clear display */
- lcd_write_ctrl(LCD_CLEAR);
- if (seconds < 1000000000) seconds++;
- else seconds = 0;
- char temp_seconds = seconds;
- /*hard coded to find first digit*/
- while (temp_seconds > 9){
- temp_seconds -= 10;
- tens_seconds++;
- }
- /*write numbers as chars to display*/
- lcd_write_data(tens_seconds + 48);
- lcd_write_data(temp_seconds + 48);
- }
- ISR(TIMER1_COMPA_vect) {
- /* vaihdetaan kaiutin pinnien tilat XOR operaatiolla */
- PORTE ^= (1 << PE4) | (1 << PE5);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement