Emania

had2

Nov 7th, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.96 KB | None | 0 0
  1. #include "stm32f4xx.h"
  2. #include <stdio.h>
  3.  
  4. #define setbit(reg, bit) ((reg) |= (1U << (bit)))       // set bit to 1
  5. #define clrbit(reg, bit) ((reg) &= (~(1U << (bit))))    // set bit to 0
  6. #define tglbit(reg, bit) ((reg) ^= (1U << (bit)))       // flip bit
  7. #define getbit(reg, bit) ((reg & (1U << bit))>>bit)     // read bit
  8.  
  9. /*
  10. MULTIFUNCTION SHIELD
  11. 4 red LEDs : PIN 10, 11, 12, 13
  12. 4-digit 7-sement LED : Latch 4, Clock 7, Data 8
  13.  
  14. Zápis do Latch – pin 4 (start zápisu LOW, konec HIGH)
  15. Hodinový pulz (takt) – pin 7
  16. Sériová data – pin 8 – zápis 2× 8 bitů (2× Byte)
  17. (první Byte – data rozsvícených LED – rozsvícení LOW, vypnutí HIGH)
  18.  
  19. http://kabinet.fyzika.net/dilna/ARDUINO/Popis-Arduino_Multi-function_Shield.pd
  20. fmail
  21.  
  22. help code
  23.  
  24. # Write a decimal number between 0 and 9 to one of the 4 digits of the display
  25. void WriteNumberToSegment(byte Segment, byte Value){
  26.     digitalWrite(LATCH_DIO,LOW);
  27.     shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
  28.     shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
  29.     digitalWrite(LATCH_DIO,HIGH);
  30. }
  31.  
  32.  
  33.  
  34. */
  35.  
  36.  
  37.  
  38.  
  39.  
  40. int cil;
  41.  
  42. void WriteToSegment(){      //zapis do segmentu
  43.     clrbit(GPIOB->ODR,5);   // latch
  44.     for(int i=15;i>(-1);i--){
  45.         if(getbit(cil,i)==1)
  46.             setbit(GPIOA->ODR, 9);  // data
  47.         else
  48.             clrbit(GPIOA->ODR,9);   // data
  49.        
  50.         setbit(GPIOA->ODR,8);   // clock
  51.         clrbit(GPIOA->ODR,8);   // clock
  52.     }
  53.     setbit(GPIOB->ODR,5);   //latch
  54. }
  55.  
  56.  
  57.  
  58. void initTIM2(void)
  59. {
  60.     setbit(RCC->APB1ENR, 0);    /* enable Clock for TIM2 */
  61.     TIM2->PSC = 50;              /* prescaler - doplnte podle potreby */
  62.     TIM2->ARR = 63999;              /* autoreload - doplnte podle potreby */
  63.     setbit(TIM2->CR1, 0);       /* enable TIM2 */
  64.     clrbit(TIM2->SR, 0);      /* status TIM2 */
  65. }
  66.  
  67. void initLED(void){
  68.  
  69.     //Povoleni hodin
  70.     setbit(RCC->AHB1ENR, 0);
  71.     setbit(RCC->AHB1ENR, 1);
  72.  
  73.  
  74.     //Nastaveni pinu na digitalni output
  75.     setbit(GPIOB->MODER, 10);
  76.     clrbit(GPIOB->MODER, 11);
  77.  
  78.     setbit(GPIOA->MODER, 12);
  79.     clrbit(GPIOA->MODER, 13);
  80.  
  81.     setbit(GPIOA->MODER, 14);
  82.     clrbit(GPIOA->MODER, 15);
  83.  
  84.     setbit(GPIOB->MODER, 12);
  85.     clrbit(GPIOB->MODER, 13);
  86.    
  87.     setbit(GPIOA->MODER, 16);
  88.     clrbit(GPIOA->MODER, 17);
  89.    
  90.     setbit(GPIOA->MODER, 18);
  91.     clrbit(GPIOA->MODER, 19);
  92. }
  93.  
  94. // Sériová data – pin 8 – zápis 2× 8 bitů (2× Byte)
  95. // 1. byte: the 8 segment information (rozsvícení LOW, vypnutí HIGH)
  96. // 2. byte: 00001111 - show on all displays
  97. void segment(int v){
  98.     switch (v){
  99.         case 1:
  100.             cil=0b1111111000001111;
  101.                 WriteToSegment();
  102.             break;
  103.         case 2:
  104.             cil=0b1111110100001111;
  105.                 WriteToSegment();
  106.             break;
  107.         case 3:
  108.             cil=0b1111101100001111;
  109.                 WriteToSegment();
  110.             break;
  111.         case 4:
  112.             cil=0b1111011100001111;
  113.                 WriteToSegment();
  114.             break;
  115.         case 5:
  116.             cil=0b1110111100001111;
  117.                 WriteToSegment();
  118.             break;
  119.         case 6:
  120.             cil=0b1101111100001111;
  121.                 WriteToSegment();
  122.             break;
  123.         case 7:
  124.             cil=0b0111111100001111;
  125.                 WriteToSegment();
  126.             break;             
  127.         default:
  128.             cil=0b111111100001111;
  129.                 WriteToSegment();
  130.             break;
  131.     }
  132. }  
  133.  
  134. //prednastavene hodnoty pro led diody(4stavy)
  135. void had(int i){
  136.     switch (i){
  137.         case 1:
  138.             clrbit(GPIOA->ODR,5);
  139.             setbit(GPIOA->ODR,6);
  140.             setbit(GPIOA->ODR,7);
  141.             setbit(GPIOB->ODR,6);
  142.             break;
  143.         case 2:
  144.             setbit(GPIOA->ODR,5);
  145.             clrbit(GPIOA->ODR,6);
  146.             setbit(GPIOA->ODR,7);
  147.             setbit(GPIOB->ODR,6);
  148.             break;
  149.         case 3:
  150.             setbit(GPIOA->ODR,5);
  151.             setbit(GPIOA->ODR,6);
  152.             clrbit(GPIOA->ODR,7);
  153.             setbit(GPIOB->ODR,6);
  154.             break;
  155.         default:
  156.             setbit(GPIOA->ODR,5);
  157.             setbit(GPIOA->ODR,6);
  158.             setbit(GPIOA->ODR,7);
  159.             clrbit(GPIOB->ODR,6);
  160.             break;
  161.     }
  162. }
  163.  
  164. //hlavni chod programu
  165. int main(void){
  166.    
  167.     int i=1;
  168.     int v=1;
  169.  
  170.     initLED();
  171.     initTIM2();
  172.        
  173.     while (1){
  174.         if(getbit(TIM2->SR, 0)){
  175.             clrbit(TIM2->SR, 0);
  176.             had(i);
  177.             i++;
  178.             if(i>4) i=1;
  179.             segment(v);
  180.             v++;
  181.             if(v>6) v=1;
  182.         }
  183.     }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment