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);
- }
- LED:
- PB6 - D10 (led 4)
- PA7 - D11 (led 3)
- PA6 - D12 (led 2)
- PA5 - D13 (led 1)
- DISPLAY:
- PB5 - D4 (Latch)
- PA8 - D7 (Clock)
- PA9 - D8 (Data)
- */
- int packet;
- void initTIM2(void){
- setbit(RCC->APB1ENR, 0); /* enable Clock for TIM2 */
- TIM2->PSC = 1; /* prescaler - doplnte podle potreby */
- TIM2->ARR = 3200000; /* autoreload - doplnte podle potreby */
- setbit(TIM2->CR1, 0); /* enable TIM2 */
- clrbit(TIM2->SR, 0); /* status TIM2 */
- }
- void initGPIO(void){
- //set clock
- setbit(RCC->AHB1ENR, 0);
- setbit(RCC->AHB1ENR, 1);
- // set to output - 01
- // PA 6 to output
- setbit(GPIOA->MODER, 12);
- clrbit(GPIOA->MODER, 13);
- // PA 7 to output
- setbit(GPIOA->MODER, 14);
- clrbit(GPIOA->MODER, 15);
- // PA 8 to output
- setbit(GPIOA->MODER, 16);
- clrbit(GPIOA->MODER, 17);
- // PA 9 to output
- setbit(GPIOA->MODER, 18);
- clrbit(GPIOA->MODER, 19);
- // PB 5 to output
- setbit(GPIOB->MODER, 10);
- clrbit(GPIOB->MODER, 11);
- // PB 6 to output
- setbit(GPIOB->MODER, 12);
- clrbit(GPIOB->MODER, 13);
- }
- void WriteToSegment(){
- clrbit(GPIOB->ODR,5); // PB5 - D4 (Latch)
- for(int i=15; i > (-1); i--){
- if(getbit(packet,i)==1){
- setbit(GPIOA->ODR, 9); // PA9 - D8 (Data)
- }else{
- clrbit(GPIOA->ODR,9); // PA9 - D8 (Data)
- }
- setbit(GPIOA->ODR,8); // PA8 - D7 (Clock)
- clrbit(GPIOA->ODR,8); // PA8 - D7 (Clock)
- }
- setbit(GPIOB->ODR,5); // PB5 - D4 (Latch)
- }
- // 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 display(int v){
- switch (v){
- case 0:
- packet=0b1111011100000001;
- WriteToSegment();
- break;
- case 1:
- packet=0b1110111100000001;
- WriteToSegment();
- break;
- case 2:
- packet=0b1101111100000001;
- WriteToSegment();
- break;
- case 3:
- packet=0b1111111000000001;
- WriteToSegment();
- break;
- case 4:
- packet=0b1111111000000010;
- WriteToSegment();
- break;
- case 5:
- packet=0b1111111000000100;
- WriteToSegment();
- break;
- case 6:
- packet=0b1111111000001000;
- WriteToSegment();
- break;
- case 7:
- packet=0b1111110100001000;
- WriteToSegment();
- break;
- case 8:
- packet=0b1111101100001000;
- WriteToSegment();
- break;
- case 9:
- packet=0b1111011100001000;
- WriteToSegment();
- break;
- case 10:
- packet=0b1111011100000100;
- WriteToSegment();
- break;
- default:
- packet=0b1111011100000010;
- WriteToSegment();
- break;
- }
- }
- // LED
- void led(int status){
- switch (status){
- case 0:
- clrbit(GPIOA->ODR,5);
- setbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- break;
- case 1:
- setbit(GPIOA->ODR,5);
- clrbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- break;
- case 2:
- 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){
- initGPIO();
- initTIM2();
- int state = 0;
- while (1){
- if(getbit(TIM2->SR, 0)){
- clrbit(TIM2->SR, 0);
- led(state % 4);
- display(state % 12);
- state++;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment