Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx.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) // get bit
- #define readbit(reg, bit) ((reg) & (1<<bit)) // read bit
- int packet;
- int bytes = 0;
- char buffer;
- char to_display[5];
- char num;
- void initDisp(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 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 initUART(void){
- setbit(RCC->AHB1ENR, 0); // clock of port A
- setbit(GPIOA->MODER, 5); // PA2
- setbit(GPIOA->MODER, 7); // PA3
- setbit(RCC->APB1ENR, 17); // UART clock
- setbit(USART2->CR1, 13); // USART interface
- setbit(USART2->CR1, 2); // UART receive
- USART2->BRR = (136 << 4) + 7; // speed 9600
- // alternate function register
- setbit(GPIOA->AFR[0], 8);
- setbit(GPIOA->AFR[0], 9);
- setbit(GPIOA->AFR[0], 10);
- setbit(GPIOA->AFR[0], 12);
- setbit(GPIOA->AFR[0], 13);
- setbit(GPIOA->AFR[0], 14);
- }
- void write_to_segment(){
- 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)
- }
- void display_num3(int num){
- switch (num){
- case 0:
- packet=0b1100000000001000;
- write_to_segment();
- break;
- case 1:
- packet=0b1111100100001000;
- write_to_segment();
- break;
- case 2:
- packet=0b1010010000001000;
- write_to_segment();
- break;
- case 3:
- packet=0b1011000000001000;
- write_to_segment();
- break;
- case 4:
- packet=0b1001100100001000;
- write_to_segment();
- break;
- case 5:
- packet=0b1001001000001000;
- write_to_segment();
- break;
- case 6:
- packet=0b1000001000001000;
- write_to_segment();
- break;
- case 7:
- packet=0b1111100000001000;
- write_to_segment();
- break;
- case 8:
- packet=0b1000000000001000;
- write_to_segment();
- break;
- case 9:
- packet=0b1001000000001000;
- write_to_segment();
- break;
- default:
- packet=0b1011111100001000;
- write_to_segment();
- break;
- }
- }
- void display_num2(int num){
- switch (num){
- case 0:
- packet=0b1100000000000100;
- write_to_segment();
- break;
- case 1:
- packet=0b1111100100000100;
- write_to_segment();
- break;
- case 2:
- packet=0b1010010000000100;
- write_to_segment();
- break;
- case 3:
- packet=0b1011000000000100;
- write_to_segment();
- break;
- case 4:
- packet=0b1001100100000100;
- write_to_segment();
- break;
- case 5:
- packet=0b1001001000000100;
- write_to_segment();
- break;
- case 6:
- packet=0b1000001000000100;
- write_to_segment();
- break;
- case 7:
- packet=0b1111100000000100;
- write_to_segment();
- break;
- case 8:
- packet=0b1000000000000100;
- write_to_segment();
- break;
- case 9:
- packet=0b1001000000000100;
- write_to_segment();
- break;
- default:
- packet=0b1011111100000100;
- write_to_segment();
- break;
- }
- }
- void display_num1(int num){
- switch (num){
- case 0:
- packet=0b1100000000000010;
- write_to_segment();
- break;
- case 1:
- packet=0b1111100100000010;
- write_to_segment();
- break;
- case 2:
- packet=0b1010010000000010;
- write_to_segment();
- break;
- case 3:
- packet=0b1011000000000010;
- write_to_segment();
- break;
- case 4:
- packet=0b1001100100000010;
- write_to_segment();
- break;
- case 5:
- packet=0b1001001000000010;
- write_to_segment();
- break;
- case 6:
- packet=0b1000001000000010;
- write_to_segment();
- break;
- case 7:
- packet=0b1111100000000010;
- write_to_segment();
- break;
- case 8:
- packet=0b1000000000000010;
- write_to_segment();
- break;
- case 9:
- packet=0b1001000000000010;
- write_to_segment();
- break;
- default:
- packet=0b1011111100000010;
- write_to_segment();
- break;
- }
- }
- void display_num0(int num){
- switch (num){
- case 0:
- packet=0b1100000000000001;
- write_to_segment();
- break;
- case 1:
- packet=0b1111100100000001;
- write_to_segment();
- break;
- case 2:
- packet=0b1010010000000001;
- write_to_segment();
- break;
- case 3:
- packet=0b1011000000000001;
- write_to_segment();
- break;
- case 4:
- packet=0b1001100100000001;
- write_to_segment();
- break;
- case 5:
- packet=0b1001001000000001;
- write_to_segment();
- break;
- case 6:
- packet=0b1000001000000001;
- write_to_segment();
- break;
- case 7:
- packet=0b1111100000000001;
- write_to_segment();
- break;
- case 8:
- packet=0b1000000000000001;
- write_to_segment();
- break;
- case 9:
- packet=0b1001000000000001;
- write_to_segment();
- break;
- default:
- packet=0b1011111100000001;
- write_to_segment();
- break;
- }
- }
- void display_num(int num, int position){
- // transfer char to int -> -48
- switch(position){
- case 3: display_num3(num - 48); break;
- case 2: display_num2(num - 48); break;
- case 1: display_num1(num - 48); break;
- case 0: display_num0(num - 48); break;
- default: break;
- }
- }
- void read_buffer() {
- do {
- if (readbit(USART2->SR,5)) {
- bytes++;
- buffer = USART2->DR;
- }
- if (buffer == 13) {
- to_display[4]= buffer;
- } else {
- to_display[bytes-1]=buffer;
- }
- } while (buffer != 13);
- }
- int main(void) {
- initDisp();
- initTIM2();
- initUART();
- while(1) {
- bytes = 0;
- read_buffer();
- switch(bytes){
- case 2:
- do {
- display_num(to_display[0],3);
- } while (!readbit(USART2->SR,5));
- break;
- case 3:
- do {
- display_num(to_display[0],2);
- display_num(to_display[1],3);
- } while (!readbit(USART2->SR,5));
- break;
- case 4:
- do {
- display_num(to_display[0],1);
- display_num(to_display[1],2);
- display_num(to_display[2],3);
- } while (!readbit(USART2->SR,5));
- break;
- case 5:
- do{
- display_num(to_display[0],0);
- display_num(to_display[1],1);
- display_num(to_display[2],2);
- display_num(to_display[3],3);
- }while (!readbit(USART2->SR,5)); break;
- default:
- do{
- display_num(-1,0);
- display_num(-1,1);
- display_num(-1,2);
- display_num(-1,3);
- } while (!readbit(USART2->SR,5)); break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment