Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "at91sam9263.h"
- //transistors
- #define TRANSISTOR_Q1 (1<<29)//brightness
- #define TRANSISTOR_Q2 (1<<28)//turns left display
- #define TRANSISTOR_Q3 (1<<30)//turns right display
- //segments
- #define A (1<<25)
- #define B (1<<24)
- #define C (1<<22)
- #define D (1<<21)
- #define E (1<<20)
- #define F (1<<27)
- #define G (1<<26)
- #define DOT (1<<23)
- #define ALL_SEGMENTS (A | B | C | D | E | F | G | DOT)
- //digits
- #define NR0 (A | B | C | D | E | F)
- #define NR1 (B | C)
- #define NR2 (A | B | D | E | G)
- #define NR3 (A | B | C | D | G)
- #define NR4 (B | C | F | G)
- #define NR5 (A | C | D | F | G)
- #define NR6 (A | C | D | E | F | G)
- #define NR7 (A | B | C)
- #define NR8 (A | B | C | D | E | F | G)
- #define NR9 (A | B | C | D | F | G)
- //const
- #define REFRESH 50
- #define CYCLES_TO_MS 6250 // 100MHz main clock -> divided by the prescaler = 16 -> 6.25Mhz of the PIT clock
- #define SEC_TO_MILISEC 1000
- void dbgu_print_ascii(const char *a) {}
- void PIT_init();
- void start_PIT();
- void stop_PIT();
- void PIT_delay(float delay);
- void interrupt_handler();
- void PIT_interrupts_init();
- void set_disp();
- void enable_left_disp();
- void enable_right_disp();
- void disable_left_disp();
- void disable_right_disp();
- void next_nr(int nr);
- volatile int counter = 0;
- volatile int interrupt_flag = 0;
- int loop = 0;
- int main(void) {
- int numbers[10] = {NR0, NR1, NR2, NR3, NR4, NR5, NR6, NR7, NR8, NR9};
- int i = 0;
- int tens = 0;
- int units = 0;
- set_disp();
- PIT_interrupts_init();
- disable_left_disp();
- disable_right_disp();
- PIT_init();
- while(1){
- for(tens = 0; tens < 10; ++tens){
- for(units = 0; units < 10; ++units){
- for(i = 0; i < REFRESH; ++i){
- if(tens){
- next_nr(numbers[tens]);
- enable_left_disp();
- }
- PIT_delay(0.01);
- disable_left_disp();
- next_nr(numbers[units]);
- enable_right_disp();
- PIT_delay(0.01);
- disable_right_disp();
- }
- }
- }
- }
- }
- void PIT_delay(float delay){
- start_PIT();
- counter = 0;
- interrupt_flag = 0;
- loop = delay * SEC_TO_MILISEC;
- while(interrupt_flag == 0) {
- if(interrupt_flag == 1){
- stop_PIT();
- break;
- }
- }
- }
- void PIT_init(){
- AT91C_BASE_PITC -> PITC_PIMR |= (0x000FFFFFU & CYCLES_TO_MS);
- stop_PIT();
- }
- void start_PIT(){
- AT91C_BASE_PITC -> PITC_PIMR |= AT91C_PITC_PITEN;
- }
- void stop_PIT(){
- AT91C_BASE_PITC -> PITC_PIMR &= ~AT91C_PITC_PITEN;
- }
- void interrupt_handler(){
- if(AT91C_BASE_PITC -> PITC_PIMR & AT91C_PITC_PITIEN){
- if(AT91C_BASE_PITC -> PITC_PISR & AT91C_PITC_PITS) {
- AT91C_BASE_PITC -> PITC_PIVR;
- ++counter;
- if(counter >= loop){
- interrupt_flag = 1;
- }
- }
- }
- }
- void PIT_interrupts_init(){
- AT91C_BASE_AIC -> AIC_IDCR = 1 << AT91C_ID_SYS;//2.disabling pit interrupts
- AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_SYS] = (unsigned int) interrupt_handler;//3.configuring pointer for handler
- AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_LOWEST;//4.configuring triggering method
- AT91C_BASE_AIC -> AIC_ICCR = 1 << AT91C_ID_SYS;//5.clearing interrupt flag
- AT91C_BASE_AIC -> AIC_IECR = 1 << AT91C_ID_SYS;//6.turning on interrupt
- AT91C_BASE_PITC -> PITC_PIMR = AT91C_PITC_PITIEN; //7
- }
- void set_disp(){
- AT91C_BASE_PIOB -> PIO_PER = ALL_SEGMENTS;
- AT91C_BASE_PIOB -> PIO_PER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
- AT91C_BASE_PIOB -> PIO_OER = ALL_SEGMENTS;
- AT91C_BASE_PIOB -> PIO_OER = TRANSISTOR_Q1 | TRANSISTOR_Q2 | TRANSISTOR_Q3;
- AT91C_BASE_PIOB -> PIO_CODR = ALL_SEGMENTS;
- AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q1;
- }
- void enable_left_disp(){
- AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q2;
- }
- void enable_right_disp(){
- AT91C_BASE_PIOB -> PIO_CODR = TRANSISTOR_Q3;
- }
- void disable_left_disp(){
- AT91C_BASE_PIOB -> PIO_SODR = TRANSISTOR_Q2;
- }
- void disable_right_disp(){
- AT91C_BASE_PIOB -> PIO_SODR = TRANSISTOR_Q3;
- }
- void next_nr(int nr){
- AT91C_BASE_PIOB -> PIO_CODR = ALL_SEGMENTS;
- AT91C_BASE_PIOB -> PIO_SODR = nr;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement