Facebook
From farkost, 9 Months ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 99
  1. /*
  2.  *      startup.c
  3.  *
  4.  */
  5.  
  6. //#define USBDM
  7.  
  8.  
  9. #define GPIO_D 0x40020C00
  10. #define GPIO_MODER ((volatile unsigned int *) (GPIO_D))
  11. #define GPIO_OTYPER ((volatile unsigned short *) (GPIO_D+0x4))
  12. #define GPIO_PUPDR ((volatile unsigned int *) (GPIO_D+0xC))
  13. #define GPIO_IDR_LOW ((volatile unsigned char *) (GPIO_D+0x10))
  14. #define GPIO_IDR_HIGH ((volatile unsigned char *) (GPIO_D+0x11))
  15. #define GPIO_ODR_LOW ((volatile unsigned char *) (GPIO_D+0x14))
  16. #define GPIO_ODR_HIGH ((volatile unsigned char *) (GPIO_D+0x15))
  17.  
  18. #define GPIO_E 0x40021000
  19. #define GPIO_E_MODER ((volatile unsigned int *) (GPIO_E))
  20. #define GPIO_E_OTYPER ((volatile unsigned short *) (GPIO_E+0x4))
  21. #define GPIO_E_PUPDR ((volatile unsigned int *) (GPIO_E+0xC))
  22. #define GPIO_E_IDR_LOW ((volatile unsigned char *) (GPIO_E+0x10))
  23. #define GPIO_E_IDR_HIGH ((volatile unsigned char *) (GPIO_E+0x11))
  24. #define GPIO_E_ODR_LOW ((volatile unsigned char *) (GPIO_E+0x14))
  25. #define GPIO_E_ODR_HIGH ((volatile unsigned char *) (GPIO_E+0x15))
  26.  
  27.  
  28. unsigned char keyb(void);
  29.  
  30. void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
  31. void startup ( void )
  32. {
  33. __asm (
  34. " LDR R0,=0x2001C000\n"
  35. " MOV SP,R0\n"
  36. " BL main\n"
  37. ".L1: B .L1\n"
  38. ) ;
  39. }
  40.  
  41. void activateRow(unsigned int row){
  42.         switch(row){
  43.                 case 1: *GPIO_ODR_HIGH = 0x10; break;
  44.                 case 2: *GPIO_ODR_HIGH = 0x20; break;
  45.                 case 3: *GPIO_ODR_HIGH = 0x40; break;
  46.                 case 4: *GPIO_ODR_HIGH = 0x80; break;
  47.                 case 0: *GPIO_ODR_HIGH = 0x00; break;
  48.         }
  49. }
  50.  
  51. int readColumn(){
  52.         unsigned char c;
  53.         c = *GPIO_IDR_HIGH;
  54.         if(c & 0x1)
  55.                 return 1;
  56.         if(c & 0x2)
  57.                 return 2;
  58.         if(c & 0x4)
  59.                 return 3;
  60.         if(c & 0x8)
  61.                 return 4;
  62.         return 0;
  63. }
  64.  
  65. unsigned char keyb(void){
  66.         int row, column;
  67.         unsigned char key[]={1,2,3,0xA,4,5,6,0xB,7,8,9,0xC,0xE,0,0xF,0xD};
  68.        
  69.         for(row = 1; row <= 4; row++){
  70.                 activateRow(row);
  71.                 column = readColumn();
  72.                
  73.                 if(column){
  74.                         activateRow(0);
  75.                         return key[4*(row - 1) + column - 1];
  76.  
  77.                 }
  78.         }
  79.         activateRow(0);
  80.         return 0xFF;
  81. }
  82.  
  83. void out7seg(unsigned char c){
  84.         unsigned char segCodes[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0xFD, 0x07, 0x7F, 0xE7, 0x77, 0x7F, 0x39, 0x3F, 0x79, 0x71};
  85.        
  86.         for(int i = 0; i < 16; i++){
  87.                 *GPIO_E_ODR_LOW &= 0x000000000;         //~GPIO_E_IDR_LOW
  88.                 *GPIO_E_ODR_LOW |= segCodes[c];
  89.         }
  90. }
  91.  
  92. void appInit (void){
  93.         #ifdef USBDM
  94.                 *((unsigned long*) 0x40023830) = 0x18;
  95.         #endif
  96.        
  97.         *GPIO_MODER = 0x55000000;               //15-12 in, 11-8 ut
  98.         *GPIO_E_MODER = 0x00005555;             //7-0 ut
  99. }
  100.  
  101. void main(void)
  102. {
  103.         appInit();
  104.        
  105.         while(1){
  106.                 char c;
  107.                 c = keyb();
  108.                 out7seg(c);
  109.         }
  110. }
  111.  
  112.