Emania

hadV3

Nov 7th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.49 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. LED:
  33. PB6 - D10 (led 4)
  34. PA7 - D11 (led 3)
  35. PA6 - D12 (led 2)
  36. PA5 - D13 (led 1)
  37.  
  38. DISPLAY:
  39. PB5 - D4 (Latch)
  40. PA8 - D7 (Clock)
  41. PA9 - D8 (Data)
  42.  
  43.  
  44. */
  45.  
  46.  
  47.  
  48.  
  49.  
  50. int packet;
  51.  
  52.  
  53. void initTIM2(void){
  54.     setbit(RCC->APB1ENR, 0);    /* enable Clock for TIM2 */
  55.     TIM2->PSC = 1;              /* prescaler - doplnte podle potreby */
  56.     TIM2->ARR = 3200000;        /* autoreload - doplnte podle potreby */
  57.     setbit(TIM2->CR1, 0);       /* enable TIM2 */
  58.     clrbit(TIM2->SR, 0);        /* status TIM2 */
  59. }
  60.  
  61. void initGPIO(void){
  62.  
  63.     //set clock
  64.     setbit(RCC->AHB1ENR, 0);
  65.     setbit(RCC->AHB1ENR, 1);
  66.  
  67.     // set to output - 01
  68.  
  69.     // PA 6 to output
  70.     setbit(GPIOA->MODER, 12);
  71.     clrbit(GPIOA->MODER, 13);
  72.  
  73.     // PA 7 to output
  74.     setbit(GPIOA->MODER, 14);
  75.     clrbit(GPIOA->MODER, 15);
  76.  
  77.     // PA 8 to output
  78.     setbit(GPIOA->MODER, 16);
  79.     clrbit(GPIOA->MODER, 17);
  80.  
  81.     // PA 9 to output
  82.     setbit(GPIOA->MODER, 18);
  83.     clrbit(GPIOA->MODER, 19);
  84.  
  85.     // PB 5 to output
  86.     setbit(GPIOB->MODER, 10);
  87.     clrbit(GPIOB->MODER, 11);
  88.  
  89.     // PB 6 to output
  90.     setbit(GPIOB->MODER, 12);
  91.     clrbit(GPIOB->MODER, 13);
  92. }
  93.  
  94. void WriteToSegment(){
  95.     clrbit(GPIOB->ODR,5);   // PB5 - D4 (Latch)
  96.     for(int i=15; i > (-1); i--){
  97.         if(getbit(packet,i)==1){
  98.             setbit(GPIOA->ODR, 9);  // PA9 - D8 (Data)
  99.         }else{
  100.             clrbit(GPIOA->ODR,9);   // PA9 - D8 (Data)
  101.         }
  102.         setbit(GPIOA->ODR,8);   // PA8 - D7 (Clock)
  103.         clrbit(GPIOA->ODR,8);   // PA8 - D7 (Clock)
  104.     }
  105.     setbit(GPIOB->ODR,5);   // PB5 - D4 (Latch)
  106. }
  107.  
  108.  
  109.  
  110. // Sériová data – pin 8 – zápis 2× 8 bitů (2× Byte)
  111. // 1. byte: the 8 segment information (rozsvícení LOW, vypnutí HIGH)
  112. // 2. byte: 00001111 - show on all displays
  113. void display(int v){
  114.     switch (v){
  115.         case 0:
  116.             packet=0b1111011100000001;
  117.                 WriteToSegment();
  118.             break;
  119.         case 1:
  120.             packet=0b1110111100000001;
  121.                 WriteToSegment();
  122.             break;
  123.         case 2:
  124.             packet=0b1101111100000001;
  125.                 WriteToSegment();
  126.             break;
  127.         case 3:
  128.             packet=0b1111111000000001;
  129.                 WriteToSegment();
  130.             break;
  131.         case 4:
  132.             packet=0b1111111000000010;
  133.                 WriteToSegment();
  134.             break;
  135.         case 5:
  136.             packet=0b1111111000000100;
  137.                 WriteToSegment();
  138.             break;
  139.         case 6:
  140.             packet=0b1111111000001000;
  141.                 WriteToSegment();
  142.             break;
  143.         case 7:
  144.             packet=0b1111110100001000;
  145.                 WriteToSegment();
  146.             break;
  147.         case 8:
  148.             packet=0b1111101100001000;
  149.                 WriteToSegment();
  150.             break;
  151.         case 9:
  152.             packet=0b1111011100001000;
  153.                 WriteToSegment();
  154.             break;
  155.         case 10:
  156.             packet=0b1111011100000100;
  157.                 WriteToSegment();
  158.             break;
  159.         default:
  160.             packet=0b1111011100000010;
  161.                 WriteToSegment();
  162.             break;
  163.     }
  164. }
  165.  
  166. // LED
  167. void led(int status){
  168.     switch (status){
  169.         case 0:
  170.             clrbit(GPIOA->ODR,5);
  171.             setbit(GPIOA->ODR,6);
  172.             setbit(GPIOA->ODR,7);
  173.             setbit(GPIOB->ODR,6);
  174.             break;
  175.         case 1:
  176.             setbit(GPIOA->ODR,5);
  177.             clrbit(GPIOA->ODR,6);
  178.             setbit(GPIOA->ODR,7);
  179.             setbit(GPIOB->ODR,6);
  180.             break;
  181.         case 2:
  182.             setbit(GPIOA->ODR,5);
  183.             setbit(GPIOA->ODR,6);
  184.             clrbit(GPIOA->ODR,7);
  185.             setbit(GPIOB->ODR,6);
  186.             break;
  187.         default:
  188.             setbit(GPIOA->ODR,5);
  189.             setbit(GPIOA->ODR,6);
  190.             setbit(GPIOA->ODR,7);
  191.             clrbit(GPIOB->ODR,6);
  192.             break;
  193.     }
  194. }
  195.  
  196. //hlavni chod programu
  197. int main(void){
  198.  
  199.     initGPIO();
  200.     initTIM2();
  201.  
  202.     int state = 0;
  203.  
  204.     while (1){
  205.         if(getbit(TIM2->SR, 0)){
  206.             clrbit(TIM2->SR, 0);
  207.             led(state % 4);
  208.             display(state % 12);
  209.             state++;
  210.         }
  211.     }
  212. }
Advertisement
Add Comment
Please, Sign In to add comment