losmi93

TAJMERI

Jan 12th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.98 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. const unsigned char simboli[] = {
  4. 0x0c, 0xa4, 0x27, 0xc4
  5. }; //look-up tabela sa simbolima A,b,C,d
  6. unsigned char DISP_BAFER[4] = {
  7. 0xfe, 0xfe, 0xfe, 0xfe
  8. }; //bafer displeja
  9. unsigned long millis;
  10. unsigned char disp = 3;
  11.  
  12. unsigned char digitToDisp(int digit)
  13. {
  14. switch(digit)
  15. {
  16. case 0:
  17. return 0x05;
  18. case 1:
  19. return 0xdd;
  20. case 2:
  21. return 0x46;
  22. case 3:
  23. return 0x54;
  24. case 4:
  25. return 0x9c;
  26. case 5:
  27. return 0x34;
  28. case 6:
  29. return 0x24;
  30. case 7:
  31. return 0x5d;
  32. case 8:
  33. return 0x04;
  34. case 9:
  35. return 0x14;
  36. }
  37. }
  38.  
  39. void numToBuffer(int num, unsigned char *buf)
  40. {
  41. buf[3] = digitToDisp(num % 10);
  42. num /= 10;
  43.  
  44. //bez vodecih nula
  45. buf[2] = (num % 10) ? digitToDisp(num % 10) : 0xff;
  46. num /= 10;
  47. buf[1] = (num % 10) ? digitToDisp(num % 10) : 0xff;
  48. num /= 10;
  49. buf[0] = (num % 10) ? digitToDisp(num % 10) : 0xff;
  50. }
  51.  
  52.  
  53. ISR(TIMER0_COMPA_vect)
  54. {
  55. //prekid tajmera 0 usled dostizanja vrednosti registra OCR0A
  56. if (++disp > 3)
  57. disp = 0;
  58. //if(!(millis % 1000))
  59.  
  60. PORTB = ~(1 << (3-disp)); //ukljucenje tranzistora
  61. PORTD = DISP_BAFER[disp]; //ispis na trenutno aktivan displej
  62.  
  63. millis++; //sistemsko vreme
  64. }
  65. int main()
  66. {
  67. unsigned long t0;
  68. unsigned char i;
  69. //inicijalizacija portova:
  70. DDRB = 0x0f; //PB3-PB0 -> izlazi
  71. DDRD = 0xff; //port D -> izlaz
  72. //inicijalizacija tajmera 0:
  73. TCCR0A = 0x02; //tajmer 0: CTC mod
  74. TCCR0B = 0x03; //tajmer 0: fclk = fosc/64
  75. OCR0A = 249; //perioda tajmera 0: 250 Tclk (OCR0A + 1 = 250)
  76. TIMSK0 = 0x02; //dozvola prekida tajmera 0
  77. //usled dostizanja vrednosti registra OCR0A
  78. sei(); //I = 1 (dozvola prekida)
  79. int number = 0;
  80. while(1)
  81. {
  82. t0 = millis;
  83. while ((millis - t0) < 1000); //pauza 1000ms
  84.  
  85. //for (i = 0; i < 4; i++)
  86. //DISP_BAFER[i] = simboli[i];
  87. numToBuffer(number, DISP_BAFER);
  88. ++number;
  89. //t0 = millis;
  90. /*while ((millis - t0) < 500); //pauza 500ms
  91. for (i = 0; i < 4; i++)
  92. DISP_BAFER[i] = 0xfe;*/
  93. }
  94. return 0;
  95. }
Add Comment
Please, Sign In to add comment