Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx.h"
- #include <stdio.h>
- #define setbit(reg, bit) ((reg) |= (1U << (bit))) // set bit to 1
- #define clrbit(reg, bit) ((reg) &= (~(1U << (bit)))) // set bit to 0
- #define tglbit(reg, bit) ((reg) ^= (1U << (bit))) // flip bit
- #define getbit(reg, bit) ((reg & (1U << bit))>>bit) // read bit
- /*
- MULTIFUNCTION SHIELD
- 4 red LEDs : PIN 10, 11, 12, 13
- 4-digit 7-sement LED : Latch 4, Clock 7, Data 8
- Zápis do Latch – pin 4 (start zápisu LOW, konec HIGH)
- Hodinový pulz (takt) – pin 7
- Sériová data – pin 8 – zápis 2× 8 bitů (2× Byte)
- (první Byte – data rozsvícených LED – rozsvícení LOW, vypnutí HIGH)
- http://kabinet.fyzika.net/dilna/ARDUINO/Popis-Arduino_Multi-function_Shield.pd
- fmail
- help code
- # Write a decimal number between 0 and 9 to one of the 4 digits of the display
- void WriteNumberToSegment(byte Segment, byte Value){
- digitalWrite(LATCH_DIO,LOW);
- shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
- shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
- digitalWrite(LATCH_DIO,HIGH);
- }
- */
- int cil;
- void WriteToSegment(){ //zapis do segmentu
- clrbit(GPIOB->ODR,5); // latch
- for(int i=15;i>(-1);i--){
- if(getbit(cil,i)==1)
- setbit(GPIOA->ODR, 9); // data
- else
- clrbit(GPIOA->ODR,9); // data
- setbit(GPIOA->ODR,8); // clock
- clrbit(GPIOA->ODR,8); // clock
- }
- setbit(GPIOB->ODR,5); //latch
- }
- void initTIM2(void)
- {
- setbit(RCC->APB1ENR, 0); /* enable Clock for TIM2 */
- TIM2->PSC = 50; /* prescaler - doplnte podle potreby */
- TIM2->ARR = 63999; /* autoreload - doplnte podle potreby */
- setbit(TIM2->CR1, 0); /* enable TIM2 */
- clrbit(TIM2->SR, 0); /* status TIM2 */
- }
- void initLED(void){
- //Povoleni hodin
- setbit(RCC->AHB1ENR, 0);
- setbit(RCC->AHB1ENR, 1);
- //Nastaveni pinu na digitalni output
- setbit(GPIOB->MODER, 10);
- clrbit(GPIOB->MODER, 11);
- setbit(GPIOA->MODER, 12);
- clrbit(GPIOA->MODER, 13);
- setbit(GPIOA->MODER, 14);
- clrbit(GPIOA->MODER, 15);
- setbit(GPIOB->MODER, 12);
- clrbit(GPIOB->MODER, 13);
- setbit(GPIOA->MODER, 16);
- clrbit(GPIOA->MODER, 17);
- setbit(GPIOA->MODER, 18);
- clrbit(GPIOA->MODER, 19);
- }
- // Sériová data – pin 8 – zápis 2× 8 bitů (2× Byte)
- // 1. byte: the 8 segment information (rozsvícení LOW, vypnutí HIGH)
- // 2. byte: 00001111 - show on all displays
- void segment(int v){
- switch (v){
- case 1:
- cil=0b1111111000001111;
- WriteToSegment();
- break;
- case 2:
- cil=0b1111110100001111;
- WriteToSegment();
- break;
- case 3:
- cil=0b1111101100001111;
- WriteToSegment();
- break;
- case 4:
- cil=0b1111011100001111;
- WriteToSegment();
- break;
- case 5:
- cil=0b1110111100001111;
- WriteToSegment();
- break;
- case 6:
- cil=0b1101111100001111;
- WriteToSegment();
- break;
- case 7:
- cil=0b0111111100001111;
- WriteToSegment();
- break;
- default:
- cil=0b111111100001111;
- WriteToSegment();
- break;
- }
- }
- //prednastavene hodnoty pro led diody(4stavy)
- void had(int i){
- switch (i){
- case 1:
- clrbit(GPIOA->ODR,5);
- setbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- break;
- case 2:
- setbit(GPIOA->ODR,5);
- clrbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- break;
- case 3:
- setbit(GPIOA->ODR,5);
- setbit(GPIOA->ODR,6);
- clrbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- break;
- default:
- setbit(GPIOA->ODR,5);
- setbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- clrbit(GPIOB->ODR,6);
- break;
- }
- }
- //hlavni chod programu
- int main(void){
- int i=1;
- int v=1;
- initLED();
- initTIM2();
- while (1){
- if(getbit(TIM2->SR, 0)){
- clrbit(TIM2->SR, 0);
- had(i);
- i++;
- if(i>4) i=1;
- segment(v);
- v++;
- if(v>6) v=1;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment