Skip to main content

GPIO_ODR_LOW

/*
 *     startup.c
 *
 */
#include "GPIO_defs.h"

void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );

void startup ( void )
{
__asm volatile(
    " LDR R0,=0x2001C000\n"        /* set stack */
    " MOV SP,R0\n"
    " BL main\n"                /* call main */
    "_exit: B .\n"                /* never return */
    ) ;
}




unsigned char keyb(void)
{
    unsigned char key[]={1,2,3,0xA,4,5,6,0xB,7,8,9,0xC,0xE,0,0xF,0xD};
    int row, col;
   
    for (row=1; row <=4 ; row++ ) {
        kbdActivate( row );
        if( (col = kbdGetCol () ) )
        {
            kbdActivate( 0 );
            return key [4*(row-1)+(col-1) ];
        }
    }
    kbdActivate( 0 );
    return 0xFF;
}
int kbdGetCol ( void )
    {
    /* Om någon tangent (i aktiverad rad)
    * är nedtryckt, returnera dess kolumnnummer,
    * annars, returnera 0 */
    unsigned char c;
    c = *GPIO_IDR_HIGH;
    if ( c & 0x8 ) return 4;
    if ( c & 0x4 ) return 3;
    if ( c & 0x2 ) return 2;
    if ( c & 0x1 ) return 1;
    return 0;
}
void kbdActivate(unsigned int row)
{
    switch(row)
    {
    case 1: *GPIO_ODR_HIGH = 0x10; break;
    case 2: *GPIO_ODR_HIGH = 0x20; break;
    case 3: *GPIO_ODR_HIGH = 0x40; break;
    case 4: *GPIO_ODR_HIGH = 0x80; break;
    case 0: *GPIO_ODR_HIGH = 0x00; break;
    }  
}

void out7seg(unsigned char c)
{
    unsigned char key[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7F,0x39,0x3F,0x79,0x71};  
    if((c > 0xF) && (c < 0xFF)){
        *GPIO_ODR_LOW = 0xFF;
    }
    else{
        *GPIO_ODR_LOW = key[c];  
    }
}
void app_init(void)
{
   
    *GPIO_MODER = 0x55005555;
    *GPIO_OTYPER &= 0x00FF;
    *GPIO_OTYPER |= 0x0000;
   
    *GPIO_PUPDR &= 0x0000FFFF;
    *GPIO_PUPDR |= 0X55AA0000;
}

void main(void)
{
    app_init();
   while(1)
    {
        out7seg(keyb());
    }
}