Advertisement
xerpi

Prac SPI bit-banging

Dec 12th, 2014
433
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 KB | None | 0 0
  1. #include <xc.h>
  2. #include <p18f4550.h>
  3. #define _XTAL_FREQ 8000000   // Need for __delay_ms function
  4. #include <delays.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "config.h"
  9. #include "touchscreen.h"
  10. #include "GLCD.h"
  11.  
  12. #define ADC_THRESHOLD 10
  13. extern unsigned const char font5x7[];
  14. extern unsigned const char font5x72[];
  15. byte zeros[128];
  16. byte cal_x_min,  cal_y_min, cal_x_max,  cal_y_max;
  17. int x_coord_old, y_coord_old, x_coord64, y_coord128;
  18.  
  19. byte tpCoord (byte x, byte y);
  20.  
  21. #define DADES  PORTBbits.RB0
  22. #define CLOCK  PORTBbits.RB6
  23. #define LATCH  PORTBbits.RB2
  24. #define ENABLE PORTBbits.RB4
  25.  
  26. #define BLAU  0x3FF00000
  27. #define ROIG  0x000FFC00
  28. #define VERD  0x000003FF
  29. #define BLANC 0x3FFFFFFF
  30. #define NEGRE 0x00000000
  31.  
  32. void spi_bb_init()
  33. {
  34.     TRISB = 0x00; //Port B output
  35. }
  36.  
  37. void spi_bb_send32(unsigned long int b)
  38. {
  39.     LATCH = 0;
  40.     CLOCK = 0;
  41.     ENABLE = 0;
  42.     int i;
  43.     for (i = 0; i < 32; i++) {
  44.         DADES = (b>>(31-i)) & 0b1;
  45.         CLOCK = 1;
  46.         __delay_ms(1);
  47.         CLOCK = 0;
  48.        
  49.     }
  50.     CLOCK = 0;
  51.     LATCH = 1;
  52.     ENABLE = 1;
  53.     LATCH = 0;
  54. }
  55.  
  56. void main()
  57. {
  58.     cal_x_min = 47;  cal_y_min = 14;  // Valor cal·libracio per defecte
  59.     cal_x_max = 221; cal_y_max = 222;  // Son els necessaris per la simulacio en PROTEUS
  60.  
  61.     tpInit();
  62.     spi_bb_init();
  63.    
  64.     while (1) {
  65.         byte tsX = tpGetY();
  66.         __delay_ms(1);
  67.         byte tsY = tpGetX();
  68.        
  69.         //Pressionat
  70.         if ((tsX > ADC_THRESHOLD) && (tsY > ADC_THRESHOLD)) {
  71.             if (tpCoord(tsX, tsY)) {
  72.                 //Superior
  73.                 if (x_coord64 < 32) {
  74.                     //Esquerra
  75.                     if (y_coord128 < 64) {
  76.                         spi_bb_send32(VERD);
  77.                     } else { //Dreta
  78.                         spi_bb_send32(BLAU);
  79.                     }
  80.                 } else { //Inferior
  81.                     //Esquerra
  82.                     if (y_coord128 < 64) {
  83.                         spi_bb_send32(BLANC);
  84.                     } else { //Dreta
  85.                         spi_bb_send32(ROIG);
  86.                     }
  87.                 }
  88.             }
  89.         } else { //No pressionat
  90.             spi_bb_send32(NEGRE);
  91.         }
  92.     }
  93. }
  94.  
  95.  
  96. byte tpCoord (byte x, byte y)
  97. {
  98.     int x_coord, y_coord, x_coord_diff, y_coord_diff;
  99.       // After a PRESS is detected read X-Y and convert it to 64x128 space
  100.       x_coord = (int)x - cal_x_min;
  101.       y_coord = (int)y - cal_y_min;
  102.  
  103.       // When lifting pen from the touchpanel surface tpGetX and tpGetY readings
  104.       // (after correct PressDetect reading) may be incorrect
  105.       if ( x_coord > x_coord_old ) { x_coord_diff = x_coord - x_coord_old; }           // Compare with old values
  106.       else                         { x_coord_diff = x_coord_old - x_coord; };
  107.       if ( y_coord > y_coord_old ) { y_coord_diff = y_coord - y_coord_old; }
  108.       else                         { y_coord_diff = y_coord_old - y_coord; };
  109.  
  110.       x_coord_old = x_coord;                               // Save old values
  111.       y_coord_old = y_coord;
  112.  
  113.       if ( (x_coord_diff>15) || (y_coord_diff>15) ) return (0);      // If difference is too big then ignore the reading
  114.        
  115.       y_coord128 = (y_coord * 128) / (cal_y_max - cal_y_min);
  116.       x_coord64 = (64 -(x_coord *64) / (cal_x_max - cal_x_min));
  117.  
  118.       /* if ((x_coord64 < 0) || (x_coord64 > 63))   return(0);
  119.       if ((y_coord128 < 0) || (y_coord128 > 127))   return(0); */
  120.       if (x_coord64 < 0)    x_coord64=0;
  121.       if (x_coord64 > 63)   x_coord64=63;
  122.       if (y_coord128 < 0)   y_coord128=0;
  123.       if (y_coord128 > 127) y_coord128=127;
  124.  
  125.       return(1);
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement