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
- buttons: PIN A1, A2, A3
- 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)
- BUTTONS:
- PA_1 - A1 (button 1)
- PA_4 - A2 (button 2)
- PB_0 - A3 (button 3)
- read button: GPIOx_IDR
- set buttons str. 158
- 00: No pull-up, pull-down
- 01: Pull-up
- 10: Pull-down
- 11: Reserved
- */
- int packet;
- void WriteToSegment();
- void display_num1(int num){
- switch (num){
- case 0:
- packet=0b1100000000001000;
- WriteToSegment();
- break;
- case 1:
- packet=0b1111100100001000;
- WriteToSegment();
- break;
- case 2:
- packet=0b1010010000001000;
- WriteToSegment();
- break;
- case 3:
- packet=0b1011000000001000;
- WriteToSegment();
- break;
- case 4:
- packet=0b1001100100001000;
- WriteToSegment();
- break;
- case 5:
- packet=0b1001001000001000;
- WriteToSegment();
- break;
- case 6:
- packet=0b1000001000001000;
- WriteToSegment();
- break;
- case 7:
- packet=0b1111100000001000;
- WriteToSegment();
- break;
- case 8:
- packet=0b1000000000001000;
- WriteToSegment();
- break;
- case 9:
- packet=0b1001000000001000;
- WriteToSegment();
- break;
- default:
- packet=0b1011111100001000;
- WriteToSegment();
- break;
- }
- }
- void display_num10(int num){
- switch (num){
- case 0:
- packet=0b1100000000000100;
- WriteToSegment();
- break;
- case 1:
- packet=0b1111100100000100;
- WriteToSegment();
- break;
- case 2:
- packet=0b1010010000000100;
- WriteToSegment();
- break;
- case 3:
- packet=0b1011000000000100;
- WriteToSegment();
- break;
- case 4:
- packet=0b1001100100000100;
- WriteToSegment();
- break;
- case 5:
- packet=0b1001001000000100;
- WriteToSegment();
- break;
- case 6:
- packet=0b1000001000000100;
- WriteToSegment();
- break;
- case 7:
- packet=0b1111100000000100;
- WriteToSegment();
- break;
- case 8:
- packet=0b1000000000000100;
- WriteToSegment();
- break;
- case 9:
- packet=0b1001000000000100;
- WriteToSegment();
- break;
- default:
- packet=0b1011111100000100;
- WriteToSegment();
- break;
- }
- }
- void display_num10_dot(int num){
- switch (num){
- case 0:
- packet=0b0100000000000100;
- WriteToSegment();
- break;
- case 1:
- packet=0b0111100100000100;
- WriteToSegment();
- break;
- case 2:
- packet=0b0010010000000100;
- WriteToSegment();
- break;
- case 3:
- packet=0b0011000000000100;
- WriteToSegment();
- break;
- case 4:
- packet=0b0001100100000100;
- WriteToSegment();
- break;
- case 5:
- packet=0b0001001000000100;
- WriteToSegment();
- break;
- case 6:
- packet=0b0000001000000100;
- WriteToSegment();
- break;
- case 7:
- packet=0b0111100000000100;
- WriteToSegment();
- break;
- case 8:
- packet=0b0000000000000100;
- WriteToSegment();
- break;
- case 9:
- packet=0b0001000000000100;
- WriteToSegment();
- break;
- default:
- packet=0b0011111100000100;
- WriteToSegment();
- break;
- }
- }
- void display_num100(int num){
- switch (num){
- case 0:
- packet=0b1100000000000010;
- WriteToSegment();
- break;
- case 1:
- packet=0b1111100100000010;
- WriteToSegment();
- break;
- case 2:
- packet=0b1010010000000010;
- WriteToSegment();
- break;
- case 3:
- packet=0b1011000000000010;
- WriteToSegment();
- break;
- case 4:
- packet=0b1001100100000010;
- WriteToSegment();
- break;
- case 5:
- packet=0b1001001000000010;
- WriteToSegment();
- break;
- case 6:
- packet=0b1000001000000010;
- WriteToSegment();
- break;
- case 7:
- packet=0b1111100000000010;
- WriteToSegment();
- break;
- case 8:
- packet=0b1000000000000010;
- WriteToSegment();
- break;
- case 9:
- packet=0b1001000000000010;
- WriteToSegment();
- break;
- default:
- packet=0b1011111100000010;
- WriteToSegment();
- break;
- }
- }
- void display_num1000(int num){
- switch (num){
- case 0:
- packet=0b1100000000000001;
- WriteToSegment();
- break;
- case 1:
- packet=0b1111100100000001;
- WriteToSegment();
- break;
- case 2:
- packet=0b1010010000000001;
- WriteToSegment();
- break;
- case 3:
- packet=0b1011000000000001;
- WriteToSegment();
- break;
- case 4:
- packet=0b1001100100000001;
- WriteToSegment();
- break;
- case 5:
- packet=0b1001001000000001;
- WriteToSegment();
- break;
- case 6:
- packet=0b1000001000000001;
- WriteToSegment();
- break;
- case 7:
- packet=0b1111100000000001;
- WriteToSegment();
- break;
- case 8:
- packet=0b1000000000000001;
- WriteToSegment();
- break;
- case 9:
- packet=0b1001000000000001;
- WriteToSegment();
- break;
- default:
- packet=0b1011111100000001;
- WriteToSegment();
- break;
- }
- }
- void initBUTT(void){
- setbit(RCC->AHB1ENR, 1);
- setbit(RCC->AHB1ENR, 0);
- // PA_1 - A1
- setbit(GPIOA->PUPDR, 2);
- clrbit(GPIOA->PUPDR, 3);
- // PA_4 - A2
- setbit(GPIOA->PUPDR, 8);
- clrbit(GPIOA->PUPDR, 9);
- // PB_0 - A3
- setbit(GPIOB->PUPDR, 0);
- clrbit(GPIOB->PUPDR, 1);
- }
- void initTIM2(void){
- setbit(RCC->APB1ENR, 0); /* enable Clock for TIM2 */
- TIM2->PSC = 1; /* prescaler - doplnte podle potreby */
- TIM2->ARR = 1280000; /* 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;
- }
- }
- void led1(int light){
- if(light)
- clrbit(GPIOA->ODR,6);
- else
- setbit(GPIOA->ODR,6);
- }
- void led2(int light){
- if(light)
- clrbit(GPIOA->ODR,7);
- else
- setbit(GPIOA->ODR,7);
- }
- void led3(int light){
- if(light)
- clrbit(GPIOB->ODR,6);
- else
- setbit(GPIOB->ODR,6);
- }
- void ledRESET(void){
- setbit(GPIOA->ODR,5);
- setbit(GPIOA->ODR,6);
- setbit(GPIOA->ODR,7);
- setbit(GPIOB->ODR,6);
- }
- void display_time(int time){
- display_num1(time % 10);
- display_num10((time % 100) / 10);
- display_num100((time % 1000) / 100);
- display_num1000(time / 1000);
- }
- void display_time_precise(int time_in_100ms){
- display_num1(time_in_100ms % 10);
- display_num10_dot((time_in_100ms % 100) / 10);
- display_num100((time_in_100ms % 1000) / 100);
- display_num1000(time_in_100ms / 1000);
- }
- //hlavni chod programu
- int main(void){
- initBUTT();
- initGPIO();
- initTIM2();
- int time = 0; // time in 100ms
- int B1, B2, B3;
- int PUSHED = 0;
- int STATUS = 0; // 0 - running, 1 - stopped, 2 - reset
- int PRECISE = 0; // 0 - slow, 1 - fast
- int B1P = 0;
- int B2P = 0;
- int B3P = 0;
- while (1){
- B1 = !getbit(GPIOA->IDR, 1); // button 1 is pushed down
- B2 = !getbit(GPIOA->IDR, 4); // button 2 is pushed down
- B3 = !getbit(GPIOB->IDR, 0); // button 3 is pushed down
- if(B1 && B1P == 0){ // pushed B1 and was not previously pushed
- B1P = 1;
- STATUS = (STATUS + 1) % 3;
- }
- if(B2 && B2P == 0){ // pushed B2 and was not previously pushed
- B2P = 1;
- PRECISE = (PRECISE + 1) % 2;
- }
- if(B3 && B3P == 0){ // pushed B3 and was not previously pushed
- B3P = 1;
- time += 20; // cheating ;-)
- }
- if(!B1 && B1P == 1) // B1 is released
- B1P = 0;
- if(!B2 && B2P == 1) // B2 is released
- B2P = 0;
- if(!B3 && B3P == 1) // B3 is released
- B3P = 0;
- if(STATUS == 2) // reset
- time = 0;
- led1(PRECISE == 1); // show if counting in precise mode
- led2(STATUS == 1); // show if stopped
- led3(STATUS == 2); // show if reset
- if(PRECISE == 0)
- display_time(time / 10);
- else
- display_time_precise(time);
- if(getbit(TIM2->SR, 0)){
- clrbit(TIM2->SR, 0);
- if(STATUS == 0)
- time++;
- if(PUSHED && B3P)
- PUSHED = 0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment