Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- /*
- * startup.c
- *
- */
- 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 */
- ) ;
- }
- typedef struct {
- uint32_t moder;
- uint16_t otyper; // +0x4
- uint16_t otReserved; //
- uint32_t ospeedr; // +0x8
- uint32_t pupdr; // +0xc (12)
- uint8_t idrLow; // +0x10
- uint8_t idrHigh; // +0x11
- uint16_t idrReserved;
- uint8_t odrLow; // +0x14
- uint8_t odrHigh; // +0x15
- uint16_t odrReserved;
- } GPIO;
- typedef volatile GPIO* gpioptr;
- #define GPIO_D (*(gpioptr)0x40020c00)
- void app_init(void){
- GPIO_D.moder = 0x55005555;
- GPIO_D.otyper = GPIO_D.otyper & 0x00FF;
- GPIO_D.pupdr = GPIO_D.pupdr & 0x0000FFFF | 0x00AA0000;
- }
- void kbdActivate (unsigned int row){
- switch (row){
- case 1: GPIO_D.odrHigh = 0x10; break;
- case 2: GPIO_D.odrHigh = 0x20; break;
- case 3: GPIO_D.odrHigh = 0x40; break;
- case 4: GPIO_D.odrHigh = 0x80; break;
- default: GPIO_D.odrHigh = 0x00; break;
- }
- }
- int kbdGetCol (void){
- unsigned char c;
- c = GPIO_D.idrHigh;
- if (c & 0x8) return 4;
- if (c & 0x4) return 3;
- if (c & 0x2) return 2;
- if (c & 0x1) return 1;
- return 0;
- }
- 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;
- }
- void out7seg(unsigned char c){
- switch (c){
- case 0 : GPIO_D.odrLow = 0x3F; break;
- case 1 : GPIO_D.odrLow = 0x06; break;
- case 2 : GPIO_D.odrLow = 0x5B; break;
- case 3 : GPIO_D.odrLow = 0x4F; break;
- case 4 : GPIO_D.odrLow = 0x66; break;
- case 5 : GPIO_D.odrLow = 0x6D; break;
- case 6 : GPIO_D.odrLow = 0x7D; break;
- case 7 : GPIO_D.odrLow = 0x07; break;
- case 8 : GPIO_D.odrLow = 0x7F; break;
- case 9 : GPIO_D.odrLow = 0x6F; break;
- case 10: GPIO_D.odrLow = 0x77; break;
- case 11: GPIO_D.odrLow = 0x7C; break;
- case 12: GPIO_D.odrLow = 0x39; break;
- case 13: GPIO_D.odrLow = 0x5E; break;
- case 14: GPIO_D.odrLow = 0x79; break;
- case 15: GPIO_D.odrLow = 0x71; break;
- default: GPIO_D.odrLow = 0x00; break;
- }
- }
- void main(void){
- app_init();
- while(1){
- out7seg(keyb());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement