Advertisement
Deadik

Untitled

Mar 13th, 2015
982
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.23 KB | None | 0 0
  1. #define F_CPU 1000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #include <stdlib.h>
  6. #include <avr/sleep.h>
  7. #define TRUE 1
  8. #define FALSE 0
  9. #define SLEEP_TIMEOUT 500
  10. //Биты состояния
  11. #define STATEDICE 0x01
  12. #define STATEBUTTON 0x02
  13.  
  14. unsigned char digs[6]={
  15.   0x01,//1
  16.   0x02,//2
  17.   0x03,//3
  18.   0x06,//4
  19.   0x07,//5
  20.   0x0E,//6
  21. };
  22.  
  23. short dig=0;
  24. short dig2=0;
  25. unsigned int timer = 0;
  26. unsigned int sleepTimer = SLEEP_TIMEOUT;
  27.  
  28. //Байт для сохранения состояний
  29. char STATE = (0<<STATEDICE)|(0<<STATEBUTTON);
  30.  
  31. //Бросок кубика
  32. void shuffleDice(void);
  33. //Инициализация портов
  34. void init_io(void);
  35. //Инициализация прерываний
  36. void init_int(void);
  37. //Смена режима
  38. void setMode(void);
  39.  
  40. void setMode(){
  41.     if((STATE & (1 << STATEDICE))){
  42.         STATE&=~(1<<STATEDICE);
  43.         PORTB=0x0F;
  44.     }else{
  45.         STATE|=(1<<STATEDICE);
  46.         PORTB=0xFF;
  47.     }
  48. }
  49.  
  50. void init_int(){
  51.     //Устанавливаем прерывани по кнопке
  52.     GIMSK=(1<<INT0);
  53.     MCUCR=(0<<ISC00)|(1<<ISC01);
  54.  
  55.     //Устанавливаем таймер
  56.     OCR0A  = 0xFF;
  57.     TCCR0A = (1<<WGM01)|(0<<WGM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
  58.     TIFR |= 0x01;
  59.     TCCR0B = (0<<CS02)|(1<<CS01)|(1<<CS00);// 1/64
  60.     TIMSK = (0<<TOIE0)|(1<<OCIE0A);
  61.  
  62.     //Разрешаем прерывания
  63.     sei();
  64. }
  65.  
  66. void init_io(){
  67.     DDRB = 0xFF;
  68.     PORTB=0x0F;
  69.     DDRD = (0 << PD2);
  70. }
  71.  
  72. void shuffleDice(){
  73.     for (int i = 0; i < 10; ++i)
  74.     {
  75.         dig = rand()%6;
  76.         PORTB =(digs[dig]);
  77.         _delay_ms(50);
  78.     }
  79.     if((STATE & (1 << STATEDICE))){
  80.         for (int i = 0; i < 10; ++i)
  81.         {
  82.             dig2 = rand()%6;
  83.             PORTB =(digs[dig])|(digs[dig2]<<4);
  84.             _delay_ms(50);
  85.         }
  86.     }
  87. }
  88.  
  89. SIGNAL(INT0_vect) {
  90.     sleepTimer=SLEEP_TIMEOUT;
  91.     cli();
  92.     STATE|=(1<<STATEBUTTON);
  93.     sei();
  94. }
  95.  
  96. SIGNAL(TIMER0_COMPA_vect) {
  97.     sleepTimer--;
  98.  
  99.     if((STATE & (1 << STATEBUTTON))){
  100.         timer++;
  101.     }
  102.  
  103.     if(timer>20&&timer<160){
  104.         if((PIND & (1 << PD2)) !=0){
  105.             STATE&=~(1<<STATEBUTTON);
  106.             timer=0;
  107.             shuffleDice();
  108.         }
  109.     }else if(timer>250){
  110.         if((PIND & (1 << PD2)) == 0){
  111.             setMode();
  112.         }
  113.         STATE&=~(1<<STATEBUTTON);
  114.         timer=0;
  115.     }
  116. }
  117.  
  118. int main(void)
  119. {
  120.     init_io();
  121.     init_int();
  122.     while(1){}
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement