/* * File: PIC12F675_kostka_do_gry.c * Author: elektronikawsrode * * */ // CONFIG #pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #define _XTAL_FREQ 4000000 // zawsze potrzebne dla makra __delay_ms() #include #include unsigned int delay_ms(unsigned int czas){ while (czas > 0){ __delay_ms(1); czas--; } } unsigned int delay_us(unsigned int czas){ while (czas > 0){ __delay_us(1); czas--; } } void main(){ ANSEL = 0b00000000; // wszystkie analogowe wyłączone TRISIO = 0b00000100; // GPIO2 wejście inne wyjścia CMCON = 0b00000111; // komparator wyłączony GPIO = 0b00000000; // wszystkie GPIO ustawione na stan niski OPTION_REGbits.nGPPU = 0; // włączony pull up - rezystor podciągający // konfiguracja Timer1 jako licznika T1CONbits.TMR1CS = 0; // Źródło zegara: wewnętrzny oscylator T1CONbits.T1CKPS = 0; // Preskaler: 1:1 T1CONbits.TMR1ON = 1; // Włącz Timer1 TMR1 = 0; // zerowanie Taimera1 int losowa_6 = 0; // zainicjowanie zmiennej int losowa_6_2 = 0; // zainicjowanie zmiennej int czas_PWM; while (1){ if (GPIO2 == 0){ delay_ms(30); czas_PWM = 400; // ustawienie początkowego czasu świecenia srand(TMR1); // inicjowanie funkcji rand() losowa_6 = rand() % 6 + 1; // losowanie liczby od 1 do 6 // symulacja losowania - zapalanie diodek while (GPIO2 == 0){ losowa_6_2 = rand() % 6 + 1; // losowanie liczby od 1 do 6 switch (losowa_6_2){ case 1: GPIO4 = 1; break; case 2: GPIO5 = 1; break; case 3: GPIO4 = 1; GPIO5 = 1; break; case 4: GPIO1 = 1; GPIO5 = 1; break; case 5: GPIO1 = 1; GPIO4 = 1; GPIO5 = 1; break; case 6: GPIO0 = 1; GPIO1 = 1; GPIO5 = 1; break; } delay_ms(100); GPIO0 = 0; GPIO1 = 0; GPIO4 = 0; GPIO5 = 0; } // zapalanie właściwego wyniku switch (losowa_6){ case 1: GPIO4 = 1; break; case 2: GPIO5 = 1; break; case 3: GPIO4 = 1; GPIO5 = 1; break; case 4: GPIO1 = 1; GPIO5 = 1; break; case 5: GPIO1 = 1; GPIO4 = 1; GPIO5 = 1; break; case 6: GPIO0 = 1; GPIO1 = 1; GPIO5 = 1; break; } delay_ms(3000); GPIO0 = 0; GPIO1 = 0; GPIO4 = 0; GPIO5 = 0; } // ściemnianie diodek switch (losowa_6){ case 1: GPIO4 = 1; break; case 2: GPIO5 = 1; break; case 3: GPIO4 = 1; GPIO5 = 1; break; case 4: GPIO1 = 1; GPIO5 = 1; break; case 5: GPIO1 = 1; GPIO4 = 1; GPIO5 = 1; break; case 6: GPIO0 = 1; GPIO1 = 1; GPIO5 = 1; break; } if (czas_PWM > 4) // za każdym cyklem zegarowym czas swiecenia sie zmiejsza czas_PWM--; delay_us(czas_PWM); // czas świecenia (czas całkowity cyklu to czas świecenia + czas wygaszenia, niestety proporcja wypełnienia się zmieniają wraz ze ze zmianą czasu świecenia) GPIO0 = 0; GPIO1 = 0; GPIO4 = 0; GPIO5 = 0; delay_us(220); // czas ciemnych diodek } }