Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.63 KB | None | 0 0
  1. #include <8051.h>
  2. #include <stdbool.h>
  3.  
  4. #include <serial_port.h>
  5. #include <i2c.h>
  6.  
  7.  
  8. //-----------------------------------------------------------------------------
  9. //--Display "Treiber"----------------------------------------------------------
  10. //-----------------------------------------------------------------------------
  11. #define I2C_DISPLAY_ADDR 0x70
  12.  
  13. const unsigned char segment_table[16] = { 0xFC,  // 0
  14.                                           0x60,  // 1
  15.                                           0xDA,  // 2
  16.                                           0xF2,  // 3
  17.                                           0x66,  // 4
  18.                                           0xB6,  // 5
  19.                                           0xBE,  // 6
  20.                                           0xE0,  // 7
  21.                                           0xFE,  // 8
  22.                                           0xF6,  // 9
  23.                                           0xEE,  // A
  24.                                           0x3E,  // B
  25.                                           0x9C,  // C
  26.                                           0x7A,  // D
  27.                                           0x9E,  // E
  28.                                           0x8E,  // F
  29.                                         };
  30.  
  31. void lcd_print_number_hex(unsigned short number)
  32. {
  33.     unsigned char i;
  34.  
  35.     i2c_adrwr(I2C_DISPLAY_ADDR);
  36.     i2c_datwrf(0x80);
  37.     i2c_datwrf(0x60);
  38.  
  39.     i = number & 0x000F;
  40.     i2c_datwrf(segment_table[i]);
  41.  
  42.     i = (number >> 4) & 0x000F;
  43.     i2c_datwrf(segment_table[i]);
  44.    
  45.     i = (number >> 8) & 0x000F;
  46.     i2c_datwrf(segment_table[i]);
  47.    
  48.     i = (number >> 12) & 0x000F;
  49.     i2c_datwrl(segment_table[i]);
  50. }
  51.  
  52.  
  53. void lcd_print_number_dec(short number)
  54. {
  55.     unsigned char decimal[4];
  56.     bool sign = false;
  57.  
  58.     i2c_adrwr(I2C_DISPLAY_ADDR);
  59.     i2c_datwrf(0x80);
  60.     i2c_datwrf(0x60);
  61.  
  62.     if(number > 9999 || number < -999)
  63.     {
  64.         i2c_datwrf(0x00);
  65.         i2c_datwrf(0x0A | 1);   // r.
  66.         i2c_datwrf(0x0A);       // r
  67.         i2c_datwrl(0x9E);       // E
  68.         return;
  69.     }
  70.  
  71.     sign = (number >> 15) & 1;
  72.  
  73.     if(sign)
  74.         number = -number;
  75.  
  76.  
  77.     for(decimal[3] = 0; number >= 1000; number -= 1000)
  78.         decimal[3]++;
  79.  
  80.     for(decimal[2] = 0; number >= 100; number -= 100)
  81.         decimal[2]++;
  82.  
  83.     for(decimal[1] = 0; number >= 10; number -= 10)
  84.         decimal[1]++;
  85.  
  86.     decimal[0] = number;
  87.    
  88.  
  89.     i2c_datwrf(segment_table[decimal[0]]);
  90.  
  91.     i2c_datwrf(segment_table[decimal[1]]);
  92.  
  93.     i2c_datwrf(segment_table[decimal[2]]);
  94.  
  95.     if(sign)
  96.         i2c_datwrl(0x02);       // -
  97.     else
  98.         i2c_datwrl(segment_table[decimal[3]]);
  99.  
  100. }
  101.  
  102. void lcd_init()
  103. {
  104.     i2c_adrwr(I2C_DISPLAY_ADDR);
  105.     i2c_datwrf(0xCD);               // MODE SET: 11001101
  106.     i2c_datwrf(0x80);               // LOAD DATA POINTER: 10000000
  107.     i2c_datwrf(0xE0);               // DEVICE SELECT: 11100000
  108.     i2c_datwrf(0xF8);               // BANK SELECT: 11111000
  109.     i2c_datwrf(0x70);               // BLINK: 01110000
  110.  
  111.     i2c_datwrf(0x00);
  112.     i2c_datwrf(0x00);
  113.     i2c_datwrf(0x00);
  114.     i2c_datwrf(0x00);
  115.     i2c_datwrl(0x00);
  116. }
  117.  
  118. void lcd_deinit()
  119. {
  120.     i2c_adrwr(I2C_DISPLAY_ADDR);
  121.     i2c_datwrf(0xC5);               // MODE SET: 11000101
  122. }
  123. //-----------------------------------------------------------------------------
  124.  
  125. void main()
  126. {
  127.     short counter = 0;
  128.     char ch = 0;
  129.  
  130.     lcd_init();
  131.     while(1 > 0)
  132.     {
  133.         ch = sp_read_char();
  134.         if(ch == '+')
  135.             counter++;
  136.         else if(ch == '-')
  137.             counter--;
  138.  
  139.         lcd_print_number_dec(counter);
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement