สอบถามการเขียนคุม LED 1/4 scan มีหลักการแบบไหนครับ

  • 21 Replies
  • 7142 Views
แก้ไขโค้ดนิดนึงครับ สลับ row กับคอลั่ม


for (k=0; k<4; k++)
{
   output_high(OE);  // เคลียร์ row ก่อนเลือกแถวใหม่ ป้องกันเงาตอนแสดงผล
   select_138(k);  // เลือกแถว
   for (j=0; j<4; j++)  // ลูป 4 ครั้ง ครั้งละ 8 คอลั่ม
   {
      for (i=0; i<4; i++)  // ลูป 4 แถว
      {
         byte_out(led_buffer[(3 - i) * 4 + k][3 - j]);  // สลับที่ i กับ j
      }
   }
   Latch_COL();
   output_low(OE);     // enable output
}


ส่วนคอนเซปต์ ผมแนะนำให้

1.มอง display ทั้งหมดเป็นผืนข้อมูล array สองมิติ
2.ให้เราทำโค้ดที่ดึงข้อมูลใน array มาแสดงให้ถูกต้องก่อน โค้ดส่วนนี้ควรจะมีการเรียกซ้ำอัตโนมัติด้วย timer interrupt เพื่อให้การแสดงผลถูกอัพเดทอัตโนมัติตลอดเวลา และในฐานเวลาที่แน่นอน
3.จากนั้นให้ทำฟังก์ชั่น putpixel สำหรับแก้ไขข้อมูลใน array แปลว่าเมื่อเราแก้ไข array หน้าจอก็จะถูกปรับโดยอัตโนมัติด้วยโค้ดที่เราเขียนไว้ทีแรก

4.จากนั้นก็ออกแบบรูปแบบการเก็บตัวอักษรให้สอดคล้องกับ array ของหน้าจอ ต่อไปการเขียนตัวอักษรก็คือการก้อปข้อมูลจาก rom ตัวอักษรลงใน array ของหน้าจอผ่านฟังก์ชั่น putpixel ที่เราสร้างขึ้นมาครับ


หวังว่าคงเป็นประโยชน์บ้างครับ

ต้องขอบคุณพี่มาก ๆ ครับ ตอนนี้ทำออกมาเป็นตัวอักษรอังกฤษได้แล้วครับ
หลังจากที่ทำตามพี่คือ สลับ row กับคอลั่ม  สลับที่ i กับ j

รูปตามลิ้งครับ  http://image.ohozaa.com/view2/wIWfbwAE0VHaqUXH

**อยากถามอีกครับ จะทำให้มันเลื่อนยังไงหรอครับ พอจะมีคอนเซปต์หรือตัวอย่างโค้ดไหมครับ**


โค้ดทั้งหมดครับ

ผมลองไล่ดูข้อมูลที่ดึงมาแสดง ตอนสร้าง font แถวจะเรียงสลับตามเลขที่คอมเม้นไว้นะครับจะไม่เรียงมาตรง ๆ
Code: [Select]
#include <18f8627.h>
#fuses hs,nowdt,nolvp,noprotect,noput
#use delay(clock=  10 MHz)

#define A pin_d3 //b0 //d3
#define B pin_d4 //b1 //d4


#define LT2       pin_d1 //c1 //d1
#define CK2       pin_b2 //c2 //b2
#define D2        pin_b5 //c3 //b5

#define OE        pin_d2 //c0  //d2

int n,p;

char const font[5][16] ={     
     
    //2    3    4    1   6     7    8    5   10    11   12   9   14   15   16   13
   
   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //Full
   {0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x00,0x24,0x18,0x00,0x42,0x00,0x00,0x00,0x00}, //O
   {0x00,0x00,0x00,0x00,0x42,0x62,0x52,0x00,0x46,0x42,0x00,0x4A,0x00,0x00,0x00,0x00}, //N
   {0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x00,0x42,0x42,0x00,0x7E,0x00,0x00,0x00,0x00}, //A
   {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //Spacebar
};

unsigned char led_buffer[4][16]; // [row][column]

void select_font()
{
   //----------------------------------------
   for (n=0;n<16;n++)
   {
      led_buffer[0][n] = font[2][n];    // N
   }
   for (n=0;n<16;n++)
   {
      led_buffer[1][n] = font[1][n];    // O
   }

   for (n=0;n<16;n++)
   {
      led_buffer[2][n] = font[2][n];    // N
   }

   for (n=0;n<16;n++)
   {
      led_buffer[3][n] = font[3][n];    // A
   }
}

void Clock_COL(void)
{
   output_low(CK2);
   delay_us(10);
   output_high(CK2);
   delay_us(10);
}

void byte_out(char buffer)
{
  char loop;
  for(loop=0;loop<8;loop++){
      if((buffer&0x80)==0x80)
      {//b10000000
         output_low(D2);
      }
      else {
         output_high(D2);
      }
      Clock_COL();
      buffer = buffer<<1;
  }
}
void Latch_COL(void)
{
   output_low(LT2);
   delay_us(1);
   output_high(LT2);
   delay_us(1);
}

void select_138(int seen)
{

   if(seen==0 )
   {
     output_low(A);
     output_low(B);
   }
    if(seen==1 )
   {
     output_high(A);
     output_low(B);
   }
    if(seen==2 )
   {
     output_low(A);
     output_high(B);   
   }
    if(seen==3 )
   {
     output_high(A);
     output_high(B);   
   }

}


void scandisplay(void)
{
   
int k,j,i,l;

   for (k=0; k<4; k++)
      {
         output_high(OE);
         select_138(k);  //
         
         for (j=0; j<4; j++) 
        {     
            for (i=0; i<4; i++) 
            {
             l = led_buffer[3 - j][(3 - i) * 4 + k];     
              byte_out(l);
            }
         }         
       Latch_COL();
       output_low(OE);           
      }     
}

void main(void)
{

  //int frames;
set_tris_b(0x00);
output_high(LT2);
output_high(CK2);
//output_low(OE);
// 0,0,0,0,0,0,0,

select_font();
   while(true)


scandisplay();
     
}

}


*

Wiz


ผมลองไล่ดูข้อมูลที่ดึงมาแสดง ตอนสร้าง font แถวจะเรียงสลับตามเลขที่คอมเม้นไว้นะครับจะไม่เรียงมาตรง ๆ


ย้ำว่าให้มอง array ของ display buffer ให้มองเป็น array ของหน้าจอเลยครับ

Code: [Select]
unsigned char led_buffer[16][4]; // [row][column]
การเรียงข้อมูลจะนับ x จากซ้ายไปขวา นับ y จากบนลงล่าง ดังนั้นรูปแบบการเก็บข้อมูล font ที่แนะนำคือ

Code: [Select]
unsigned char letter_A[6] =
{0x18,  // 0001 1000
 0x24,  // 0010 0100
 0x42,  // 0100 0010
 0x7E,  // 0111 1110
 0x42,  // 0100 0010
 0x42}; // 0100 0010

แนะนำให้เขียนฟังก์ชั่นจัดการ pixel ขึ้นมาก่อนครับ ...ถ้าต้องการแก้ไข display ให้ทำผ่านฟังก์ชั่นนี้เท่านั้น

Code: [Select]
void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(1 << (x % 8));
   else
      tmp |= (1 << (x % 8));

   led_buffer[y][x / 8] = tmp;
}

ดังนั้นหน้าตาฟังก์ชั่นสำหรับเขียนตัวอักษรจะประมาณนี้ครับ

Code: [Select]
void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<6; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}


ผมลองไล่ดูข้อมูลที่ดึงมาแสดง ตอนสร้าง font แถวจะเรียงสลับตามเลขที่คอมเม้นไว้นะครับจะไม่เรียงมาตรง ๆ


ย้ำว่าให้มอง array ของ display buffer ให้มองเป็น array ของหน้าจอเลยครับ

Code: [Select]
unsigned char led_buffer[16][4]; // [row][column]
การเรียงข้อมูลจะนับ x จากซ้ายไปขวา นับ y จากบนลงล่าง ดังนั้นรูปแบบการเก็บข้อมูล font ที่แนะนำคือ

Code: [Select]
unsigned char letter_A[6] =
{0x18,  // 0001 1000
 0x24,  // 0010 0100
 0x42,  // 0100 0010
 0x7E,  // 0111 1110
 0x42,  // 0100 0010
 0x42}; // 0100 0010

แนะนำให้เขียนฟังก์ชั่นจัดการ pixel ขึ้นมาก่อนครับ ...ถ้าต้องการแก้ไข display ให้ทำผ่านฟังก์ชั่นนี้เท่านั้น

Code: [Select]
void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(1 << (x % 8));
   else
      tmp |= (1 << (x % 8));

   led_buffer[y][x / 8] = tmp;
}

ดังนั้นหน้าตาฟังก์ชั่นสำหรับเขียนตัวอักษรจะประมาณนี้ครับ

Code: [Select]
void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<6; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}

คือผมทำมาแล้วมันออกมาเป็นแบบนี้นะครับ
http://image.ohozaa.com/view2/wJf5ole2gYOu8Y6R

ผมใช้ฟังก์ชันที่พี่ให้มาผิดตรงไหนหรือป่าวครับ ช่วยดูหน่อยครับ
แล้วฟังก์ชันที่พี่ให้มามันทำงานยังไงหรอครับ ช่วยคอมเม้นหน่อยได้ไหมครับ พอดีผมไม่ค่อยเข้าใจนะ (ไม่ค่อยเก่งเท่าไร^^)


โค้ดทั้งหมดครับ
Code: [Select]
#include <18f8627.h>
#fuses hs,nowdt,nolvp,noprotect,noput
#use delay(clock=  5 MHz)

#define A pin_d1 //b0 //d3
#define B pin_d2 //b1 //d4

#define CK2       pin_d4 //c2 //b2
#define LT2       pin_d5 //c1 //d1
#define D2        pin_d6 //c3 //b5

//#define DAT_2     pin_b5 //b5

#define OE        pin_d7 //c0  //d2


unsigned char letter_A[6] =
{0xFF,  // 0001 1000
 0xFF,  // 0010 0100
 0xFF,  // 0100 0010
 0xFF,  // 0111 1110
 0xFF,  // 0100 0010
 0xFF}; // 0100 0010

unsigned char led_buffer[16][4]; // [row][column]

void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(1 << (x % 8));
   else
      tmp |= (1 << (x % 8));

   led_buffer[y][x / 8] = tmp;
}

void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<6; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}

void Clock_COL(void)
{
   output_low(CK2);
   delay_us(10);
   output_high(CK2);
   delay_us(10);
}

void byte_out(char buffer)
{
  char loop;
  for(loop=0;loop<8;loop++){
      if((buffer&0x80)==0x80)
      {//b10000000
         output_low(D2);
      }
      else {
         output_high(D2);
      }
      Clock_COL();
      buffer = buffer<<1;
  }
}
void Latch_COL(void)
{
   output_low(LT2);
   delay_us(1);
   output_high(LT2);
   delay_us(1);
}

void select_138(int seen)
{

   if(seen==0 )
   {
     output_low(A);
     output_low(B);
   }
    if(seen==1 )
   {
     output_high(A);
     output_low(B);
   }
    if(seen==2 )
   {
     output_low(A);
     output_high(B);   
   }
    if(seen==3 )
   {
     output_high(A);
     output_high(B);   
   }
}

void scandisplay(void)
{
   
int k,j,i,l;

   for (k=0; k<4; k++)
      {
         output_high(OE);
         select_138(k);  //
         
         for (j=0; j<4; j++) 
        {     
            for (i=0; i<4; i++) 
            {
             l = led_buffer[(3 - i) * 4 + k][3 - j];  //l = led_buffer[3 - j][(3 - i) * 4 + k];     
              byte_out(l);
            }
         }         
       Latch_COL();
       output_low(OE);           
      }     
}

void main(void)
{

set_tris_b(0x00);
output_high(LT2);
output_high(CK2);

   while(true)


scandisplay();
     
}
}

*

Wiz

1. ในโค้ดทั้งหมดที่คุณให้มา ยังไม่มีการกระทำใด ๆ ต่อ led_buffer เลยครับ ดังนั้นค่าใน buffer อาจเป็นค่าใด ๆ ก็ได้ (แต่ส่วนใหญ่น่าจะเป็น 0)

ดังนั้นในขั้นตอน initial ควรจะสร้างฟังก์ชั่นสำหรับ clear หน้าจอทั้งหมดและเรียกใช้ก่อนเข้า loop หลัก 1 ครั้ง

Code: [Select]
#include <string.h>

void ClearDisplay(void)
{
   memset(led_buffer, 0x00, sizeof(led_buffer));
}

2. ในโค้ดทั้งหมดที่คุณให้มา letter_A ยังไม่มีการใส่ค่าลงไปเลยครับ ลองใส่ค่าตามนี้

Code: [Select]
unsigned char letter_A[6] =
{0x18,  // 0001 1000
 0x24,  // 0010 0100
 0x42,  // 0100 0010
 0x7E,  // 0111 1110
 0x42,  // 0100 0010
 0x42}; // 0100 0010

3. หลังจาก initial, clear screen แล้ว ต้องมีขั้นตอนการเขียนตัวอักษรด้วยครับ หน้าจอถึงจะแสดงตัวอักษรได้

Code: [Select]
void main(void)
{
   set_tris_b(0x00);
   output_high(LT2);
   output_high(CK2);

   ClearDisplay();
   PutChar(0, 0, letter_A);   // เขียนตัวอักษร A ที่ตำแหน่ง x=0, y=0

   while(true)
   { 
      scandisplay();
   }
}

4. ถ้าแสดงผลแปลก ๆ อาจเป็นปัญหาที่ฟังก์ชั่น PutPixel ให้ลองเปลี่ยนเป็นโค้ดนี้ครับ

Code: [Select]
void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา
   else
      tmp |= (0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา

   led_buffer[y][x / 8] = tmp;
}

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
Code: [Select]
void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x >> 3];
   if (px == 0)
      tmp &= ~(0x80 >> (x & 7));
   else
      tmp |= (0x80 >> (x & 7));

   led_buffer[y][x >> 3] = tmp;
}
optimize อีกนิดครับ  ;)
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

1. ในโค้ดทั้งหมดที่คุณให้มา ยังไม่มีการกระทำใด ๆ ต่อ led_buffer เลยครับ ดังนั้นค่าใน buffer อาจเป็นค่าใด ๆ ก็ได้ (แต่ส่วนใหญ่น่าจะเป็น 0)

ดังนั้นในขั้นตอน initial ควรจะสร้างฟังก์ชั่นสำหรับ clear หน้าจอทั้งหมดและเรียกใช้ก่อนเข้า loop หลัก 1 ครั้ง

Code: [Select]
#include <string.h>

void ClearDisplay(void)
{
   memset(led_buffer, 0x00, sizeof(led_buffer));
}

2. ในโค้ดทั้งหมดที่คุณให้มา letter_A ยังไม่มีการใส่ค่าลงไปเลยครับ ลองใส่ค่าตามนี้

Code: [Select]
unsigned char letter_A[6] =
{0x18,  // 0001 1000
 0x24,  // 0010 0100
 0x42,  // 0100 0010
 0x7E,  // 0111 1110
 0x42,  // 0100 0010
 0x42}; // 0100 0010

3. หลังจาก initial, clear screen แล้ว ต้องมีขั้นตอนการเขียนตัวอักษรด้วยครับ หน้าจอถึงจะแสดงตัวอักษรได้

Code: [Select]
void main(void)
{
   set_tris_b(0x00);
   output_high(LT2);
   output_high(CK2);

   ClearDisplay();
   PutChar(0, 0, letter_A);   // เขียนตัวอักษร A ที่ตำแหน่ง x=0, y=0

   while(true)
   { 
      scandisplay();
   }
}

4. ถ้าแสดงผลแปลก ๆ อาจเป็นปัญหาที่ฟังก์ชั่น PutPixel ให้ลองเปลี่ยนเป็นโค้ดนี้ครับ

Code: [Select]
void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา
   else
      tmp |= (0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา

   led_buffer[y][x / 8] = tmp;
}



ขอบคุณมากครับ ตอนนี้แสดงผลออกมาเกือบถูกแล้วครับ
ยังผิดอยู่ตำแหน่งนึงครับ ตามรูปครับ เกิดจากอะไรหรอครับ

ใส่ font ตามของพี่คือ
 0x18,  // 0001 1000
 0x24,  // 0010 0100
 0x42,  // 0100 0010
 0x7E,  // 0111 1110
 0x42,  // 0100 0010
 0x42   // 0100 0010

จะออกมาเป็นแบบนี้ครับ   http://image.ohozaa.com/view2/wJg9PWbtyItOVY4b

เหมือนมันจะเรียงสลับอยู่แบบนี้นะครับ ถ้าใส่แบบนี้

 0x24, // แถว 2   0010 0100
 0x42, // แถว 3   0100 0010
 0x7E, // แถว 4   0111 1110
 0x18, // แถว 1   0001 1000
 0x42, // แถว 6   0100 0010
 0x00, // แถว 7   0000 0000
 0x00, // แถว 8   0000 0000
 0x42, // แถว 5   0100 0010

และแก้ฟังก์ชันนี้จาก 6 เป็น 8
void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<8; j++) //จาก 6 เป็น 8
   {
      bt = letter[j];
      for (i=0; i<8; i++) 
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}

จะออกมาตรงตามรูปครับ  http://image.ohozaa.com/view2/wJgfo9xGTSKDbHJe

โค้ดทั้งหมด 
Code: [Select]
#include <18f8627.h>
#include <string.h>
#fuses hs,nowdt,nolvp,noprotect,noput
#use delay(clock=  5 MHz)

#define A pin_d1 //b0 //d3
#define B pin_d2 //b1 //d4

#define CK2       pin_d4 //c2 //b2
#define LT2       pin_d5 //c1 //d1
#define D2        pin_d6 //c3 //b5

//#define DAT_2     pin_b5 //b5

#define OE        pin_d7 //c0  //d2


unsigned char letter_A[8] =
{//0x18,  // 0001 1000
 //0x24,  // 0010 0100
 //0x42,  // 0100 0010
 //0x7E,  // 0111 1110
 //0x42,  // 0100 0010
 //0x42}; // 0100 0010
 
 0x24, //2
 0x42, //3
 0x7E, //4
 0x18, //1
 0x42, //6
 0x00, //7
 0x00, //8
 0x42, //5
};

unsigned char led_buffer[16][4]; // [row][column]

void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา
   else
      tmp |= (0x80 >> (x % 8));   // แก้การเรียงลำดับ pixel จากซ้ายไปขวา

   led_buffer[y][x / 8] = tmp;
}

void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<8; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}



void ClearDisplay(void)
{
   memset(led_buffer, 0x00, sizeof(led_buffer));
}

void Clock_COL(void)
{
   output_low(CK2);
   delay_us(10);
   output_high(CK2);
   delay_us(10);
}

void byte_out(char buffer)
{
  char loop;
  for(loop=0;loop<8;loop++){
      if((buffer&0x80)==0x80)
      {//b10000000
         output_low(D2);
      }
      else {
         output_high(D2);
      }
      Clock_COL();
      buffer = buffer<<1;
  }
}
void Latch_COL(void)
{
   output_low(LT2);
   delay_us(1);
   output_high(LT2);
   delay_us(1);
}

void select_138(int seen)
{

   if(seen==0 )
   {
     output_low(A);
     output_low(B);
   }
    if(seen==1 )
   {
     output_high(A);
     output_low(B);
   }
    if(seen==2 )
   {
     output_low(A);
     output_high(B);   
   }
    if(seen==3 )
   {
     output_high(A);
     output_high(B);   
   }
}

void scandisplay(void)
{
   
int k,j,i,l;

   for (k=0; k<4; k++)
      {
         output_high(OE);
         select_138(k);  //
         
         for (j=0; j<4; j++) 
        {     
            for (i=0; i<4; i++) 
            {
             l = led_buffer[(3 - i) * 4 + k][3 - j];  //l = led_buffer[3 - j][(3 - i) * 4 + k];     
              byte_out(l);
            }
         }         
       Latch_COL();
       output_low(OE);           
      }     
}

void main(void)
{
   set_tris_b(0x00);
   output_high(LT2);
   output_high(CK2);

   ClearDisplay();
   PutChar(0, 0, letter_A);   // เขียนตัวอักษร A ที่ตำแหน่ง x=0, y=0

   while(true)
   { 
      scandisplay();
   }
}


*

Wiz


optimize อีกนิดครับ  ;)

 ;)


คุณ anon1206 การสลับแถว font เป็นการแก้ที่ปลายเหตุครับ อันที่จริงควรจะตรวจสอบฟังก์ชั่น scan display หรือเช็คการเรียงลำดับแถวของ 74138 มากกว่าครับ

ผมสมมติฐานว่าในวงจร 74138 ไม่ได้เรียงตามปกติ ซึ่งมีโอกาสเกิดขึ้นได้เนื่องจากความสุดวิสัยในการออกแบบ PCB หรือสาเหตุอื่นใด บางทีเราแค่แก้ฟังก์ชั่นนี้ก็พอครับ

Code: [Select]
void select_138(int seen)
{

   if(seen==0 )
   {
     output_high(A);
     output_high(B);
   }
    if(seen==1 )
   {
     output_low(A);
     output_low(B);
   }
    if(seen==2 )
   {
     output_high(A);
     output_low(B);   
   }
    if(seen==3 )
   {
     output_low(A);
     output_high(B);   
   }
}

ยังไงฝากไล่วงจร 74138 ให้ด้วยนะครับ

optimize อีกนิดครับ 


คุณ anon1206 การสลับแถว font เป็นการแก้ที่ปลายเหตุครับ อันที่จริงควรจะตรวจสอบฟังก์ชั่น scan display หรือเช็คการเรียงลำดับแถวของ 74138 มากกว่าครับ

ผมสมมติฐานว่าในวงจร 74138 ไม่ได้เรียงตามปกติ ซึ่งมีโอกาสเกิดขึ้นได้เนื่องจากความสุดวิสัยในการออกแบบ PCB หรือสาเหตุอื่นใด บางทีเราแค่แก้ฟังก์ชั่นนี้ก็พอครับ

ยังไงฝากไล่วงจร 74138 ให้ด้วยนะครับ

ขอบคุณมากครับ ตอนนี้ได้สลับแถว 74hc138 ตามที่ให้มา แสดงตรงแล้วครับ

นี่ลงจร 74hc138 ครับ  http://image.ohozaa.com/view2/wJi2Ca0v3R8WgEgB

คือมีเรื่องอยากสอบถามอีกนะครับ
คือว่าบอร์ด LED ขนาด 16*32 นั้นเป็นเพียง 1 บอร์ดนะครับ ผมเลยอยากทดลองใน 1 บอร์ดนี้ให้ได้ก่อน
โปรเจคที่ต้องทำจริง ๆ คือ(ขนาด 32*64) 2048 หลอด (ซึ้งต้องใช้บอร์ด 16*32)512 หลอด  4 บอร์ดต่อกันตามรูปครับ

รูปบอร์ด 32*64
 (ดานหน้า)  http://image.ohozaa.com/view2/wJid5B3UxXfxegc7
 (ด้านหลัง)  http://image.ohozaa.com/view2/wJidckERVZC2ir8u

ที่ผมรู้ตอนนี้ไม่แน่ใจว่าถูกหรือป่าว
- ขา dat จะแยกกันเป็นเป็น 2 ขาคือคุมด้านบน 16*64 และด้านล่าง 16*64 รวมเป็น 32*64
- ต้องเปลี่ยนขนาดของ buffer[16][4] เป็น buffer[16][8] ใช่ไหมครับ หรือเป็น  buffer[32][8] ครับ
   และ function scandisplay ต้องแก้จาก(ลูป 4 ครั้ง ครั้งละ 8 คอลัม)เป็น (ลูป 8 ครั้ง ครั้งละ 8 คอลัม) ถูกไหมครับ
- สร้าง function byte_out(); สำหรับขา dat อีกขาใช่ไหมครับ

แล้วจะเขียนคุมขา dat 2 ขา ยังไงเพื่อจัดการกับ pixel ให้เหมือนเป็น Display ขนาด 32*64 ตัวเดียวเลยครับ