Now I am reading the Guzunty Pi led-driver core's demo program in C, hoping to convert it to Python.
* gz_led_demo.c by campbellsan  
* This program implements a digital clock displayed on a 4 digit
* 7 segment LED. It also incorporates a font for sevent segment
* displays, so that messages can be displayed. Toggle between the
* clock and message with the 'c' and 'm' keys.
const unsigned char font[128] = 
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // All
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // unprintable
0x00, 0x30, 0x22, 0x76, // SP, !, ", # (H)
0x6d, 0x7f, 0x7d, 0x20, // $ (5), % (8), & (6), '
0x39, 0x0f, 0x76, 0x76, // (, ), * (H), + (H)
0x10, 0x40, 0x00, 0x52, // ',', -, ., /
0x3f, 0x06, 0x5b, 0x4f, // 0, 1, 2, 3
0x66, 0x6d, 0x7d, 0x07, // 4, 5, 6, 7
0x7f, 0x6f, 0x30, 0x30, // 8, 9, :, ;
0x58, 0x48, 0x4c, 0x53, // <, =, >, ?
0x7b, 0x77, 0x7f, 0x39, // @, A, B, C
0x3f, 0x79, 0x71, 0x3d, // D (0), E, F, G
0x76, 0x06, 0x1e, 0x75, // H, I (1), J, K
0x38, 0x55, 0x37, 0x3f, // L, M, N, O (0)
0x73, 0x7d, 0x31, 0x6d, // P, Q, R, S (5)
0x07, 0x3e, 0x2a, 0x6a, // T, U, V, W
0x76, 0x6e, 0x5b, 0x39, // X (H), Y (y), Z, [
0x64, 0x0f, 0x23, 0x08, // backslash, ], ^, _
0x02, 0x77, 0x7c, 0x58, // ', a (A), b, c
0x5e, 0x7b, 0x71, 0x6f, // d, e, f (F), g
0x74, 0x04, 0x0c, 0x75, // h, i (1), j, k (K)
0x06, 0x55, 0x54, 0x5c, // l, m (M), n, o
0x73, 0x67, 0x50, 0x6d, // p (P), q, r, s (5)
0x78, 0x1c, 0x1c, 0x6a, // t, u, v (u), w (W)
0x76, 0x6e, 0x5b, 0x39, // x (H), y, Z (2), { ([)
0x30, 0x0f, 0x01, 0x00  // |, } (]), ~, DEL
};
int main(int argc, char* argv[])
{
    gz_clock_ena(GZ_CLK_5MHz, 0xfff); // Turn on the slowest clock we can
    unsigned char colon = 0;
    unsigned char disp_mode = 'c';
    char * message = "Guzunty LED driver - ";
    char * start_at = message;
    char * cursor = message;
    unsigned char payload[4];
    
    gz_spi_set_width(4);              // Pass blocks of 4 bytes on SPI
      *** Clock mode ***
   if (disp_mode == 'c') 
   {
        time_t t;
        time(&t);
        char time_buf[4];
        char time_str[25];
        sprintf(time_str, "%s",ctime(&t));
        time_buf[0] = time_str[11];
        time_buf[1] = time_str[12];
        time_buf[2] = time_str[14];
        time_buf[3] = time_str[15];
        for (; i < 4; i++) {
    payload[i] = ~font[(unsigned char)time_buf[i]];
     }
     if (colon != 0) {
    payload[1] &= ~0x80;
    colon = 0;
        }
        else {
    colon = 1;
     }
   }
      *** display message mode ***
   if (disp_mode == 'm') 
   {
  cursor = start_at;
  for (; i < 4; i++) {
    if (*cursor == '\0') {
   cursor = message;
    }
    payload[i] = ~font[(unsigned char)*cursor];
    cursor++;
  }
     start_at++;
     if (*start_at == '\0') {
    start_at = message;
     }
   }
   gz_spi_write(payload);          // pass display bytes to SPI
      sleep(1);
      int key = getch();
      if (key !=-1) {
  if (key == 'c') {
    disp_mode = (unsigned char)key;
  }
  else {
    if (key == 'm') {
     disp_mode = (unsigned char)key;
    }
    else {
      break;
    }
     }
   }
    }
...
}
***************************************************************************************
* gz_led_demo.c
* This program implements a digital clock displayed on a 4 digit
* 7 segment LED. It also incorporates a font for sevent segment
* displays, so that messages can be displayed. Toggle between the
* clock and message with the 'c' and 'm' keys.
const unsigned char font[128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // All
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // unprintable
0x00, 0x30, 0x22, 0x76, // SP, !, ", # (H)
0x6d, 0x7f, 0x7d, 0x20, // $ (5), % (8), & (6), '
0x39, 0x0f, 0x76, 0x76, // (, ), * (H), + (H)
0x10, 0x40, 0x00, 0x52, // ',', -, ., /
0x3f, 0x06, 0x5b, 0x4f, // 0, 1, 2, 3
0x66, 0x6d, 0x7d, 0x07, // 4, 5, 6, 7
0x7f, 0x6f, 0x30, 0x30, // 8, 9, :, ;
0x58, 0x48, 0x4c, 0x53, // <, =, >, ?
0x7b, 0x77, 0x7f, 0x39, // @, A, B, C
0x3f, 0x79, 0x71, 0x3d, // D (0), E, F, G
0x76, 0x06, 0x1e, 0x75, // H, I (1), J, K
0x38, 0x55, 0x37, 0x3f, // L, M, N, O (0)
0x73, 0x7d, 0x31, 0x6d, // P, Q, R, S (5)
0x07, 0x3e, 0x2a, 0x6a, // T, U, V, W
0x76, 0x6e, 0x5b, 0x39, // X (H), Y (y), Z, [
0x64, 0x0f, 0x23, 0x08, // backslash, ], ^, _
0x02, 0x77, 0x7c, 0x58, // ', a (A), b, c
0x5e, 0x7b, 0x71, 0x6f, // d, e, f (F), g
0x74, 0x04, 0x0c, 0x75, // h, i (1), j, k (K)
0x06, 0x55, 0x54, 0x5c, // l, m (M), n, o
0x73, 0x67, 0x50, 0x6d, // p (P), q, r, s (5)
0x78, 0x1c, 0x1c, 0x6a, // t, u, v (u), w (W)
0x76, 0x6e, 0x5b, 0x39, // x (H), y, Z (2), { ([)
0x30, 0x0f, 0x01, 0x00  // |, } (]), ~, DEL
};
int main(int argc, char* argv[])
{
    gz_clock_ena(GZ_CLK_5MHz, 0xfff); // Turn on the slowest clock we can
    unsigned char colon = 0;
    unsigned char disp_mode = 'c';
    char * message = "Guzunty LED driver - ";
    char * start_at = message;
    char * cursor = message;
    unsigned char payload[4];
    
    gz_spi_set_width(4);              // Pass blocks of 4 bytes on SPI
 printw("Press 'm' for message, 'c' for clock, any other key to stop.\n");
    while (1) {
      int i = 0;
      if (disp_mode == 'c') {
        time_t t;
        time(&t);
        char time_buf[4];
        char time_str[25];
        sprintf(time_str, "%s",ctime(&t));
        time_buf[0] = time_str[11];
        time_buf[1] = time_str[12];
        time_buf[2] = time_str[14];
        time_buf[3] = time_str[15];
        for (; i < 4; i++) {
    payload[i] = ~font[(unsigned char)time_buf[i]];
     }
     if (colon != 0) {
    payload[1] &= ~0x80;
    colon = 0;
        }
        else {
    colon = 1;
     }
   }
   if (disp_mode == 'm') {
  cursor = start_at;
  for (; i < 4; i++) {
    if (*cursor == '\0') {
   cursor = message;
    }
    payload[i] = ~font[(unsigned char)*cursor];
    cursor++;
  }
     start_at++;
     if (*start_at == '\0') {
    start_at = message;
     }
   }
   gz_spi_write(payload);          // pass display bytes to SPI
      sleep(1);
      int key = getch();
      if (key !=-1) {
  if (key == 'c') {
    disp_mode = (unsigned char)key;
  }
  else {
    if (key == 'm') {
     disp_mode = (unsigned char)key;
    }
    else {
      break;
    }
     }
   }
    }
    gz_spi_close();                   // close SPI channel
    reset_shell_mode();               // turn off ncurses
    gz_clock_dis();                   // turn off GPIO clock
    return 0;
}
.END
 
No comments:
Post a Comment