Thông báo

Collapse
No announcement yet.

[HELP] Quét led matrix 8x8 ạ...

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [HELP] Quét led matrix 8x8 ạ...

    - Em đang làm 1 cái mạch chạy chữ dùng 2 bảng led matrix 8x8. Code thì xong rồi nhưng có vài vấn đề phần cứng ạ.
    - Do khả năng cấp dòng của VĐK 89S52 khá thấp nên em dùng nó để hút dòng (quét cột). Còn con 4017 để cấp điện quét theo dòng.
    - Vấn đề em đang thắc mắc là nếu để mạch như vậy thì khi chạy, các led có sáng đều nhau không ?
    - Khả năng cấp dòng của 4017 có cao không, (đủ cấp dòng sao cho khi 8led/dòng cùng sáng thì độ sáng tương đương 1led không ? - Do nếu yếu đi sẽ bị sáng không đều ở các dòng ạ).


    Thân,
    Cảm ơn nhiều ạ.

  • #2
    - Em em không phải SV điện tử. Em SV khoa toán tin, do mê điện tử nên làm thôi. Do đó có nhiều vấn đề thắc mắc.
    - Em có được học qua điện tử đâu mà . Mong giúp đỡ.

    Comment


    • #3
      để các led sáng đều thì chắc chắn phải đệm, có thể dùng con 2803 để hút dòng. cái này nói nữa sẽ bị thừa, bạn tìm trong diễn đàn này đi, có nhiều lắm. bạn coi phần cứng rồi lắp theo là OK thôi. link nè http://dientuvietnam.net/forums/showthread.php?t=15613
      hãy cố gắng dù vướn phải thất bại!!!!!!!!

      Comment


      • #4
        Chào khanhduy, mình cũng học CNTT không học điện, và mình cũng đang làm BTL gần như của bạn. BTL của mình là dùng phần mềm máy tính để nhập chữ, nhập chữ gì thì 2 led matrix hiện ra chữ đó. Mình đang gặp khó khăn phần lập trình để kon 89c51 giao tiếp máy tính, bạn có thể up đoạn code lên để cùng trao đổi được không.

        Cảm ơn bạn nhiều !

        Comment


        • #5
          - Code của mình hiện chỉ hiển thị chữ cứng thôi, chưa hiển thị = cách thông qua giao tiếp máy tính được.

          - Nhưng mình có 1 đoạn code (1 anh member của diễn đàn share - quên mất nick name rồi) dùng để giao tiếp máy tính nè:
          Code:
          /***** Khoi tao giao tiep RS232 *****/
          void uart_init()
          {
          	SCON = 0x50;
          	TMOD&=0x0F;
          	TMOD|=0x20;
          	TH1=0xFD;
          	TL1=0xFD;
          	ES=1;
          	EA=1;
          	TR1=1;
          
          }
          
          /***** Nhan 1 chu cai *****/
          void recieve1char()	interrupt 4
          {
          	if(RI==1)
          	{
          		RI = 0;
          		uart_rcv_data = SBUF;
          		P2=uart_rcv_data;
          	}
          	if(SCLK_ACK)
          		SCLK = ~SCLK;
          }
          
          /***** Goi 1 chu cai *****/
          void send1char(unsigned char send_data)
          {
          	TI = 0;
          	SBUF = send_data;
          	while(TI==0){}
          	TI=0;
          }
          - Còn đây là đoạn code chạy chữ của mình viết, chắc là còn nhiều chỗ dở, cần tối ưu hóa, mong các Bác góp ý ạ .
          Code:
          #include "REGX52.H"
          typedef union
          {
          	long line_data;
          	unsigned char line[4];
          }DISPLAY_BUFFER;
          
          /***** Variable *****/
          DISPLAY_BUFFER displaybuffer[8];
          unsigned char timer0_delay1 = 0;
          unsigned char timer0_delay2 = 0;
          unsigned char timer0_counter1 = 0;
          unsigned char display_data[]={'L','E','N','G','U','Y','E','N','K','H','A','N','H','D','U','Y'};
          /***** Function *****/
          void addDataToSecondaryBuffer(unsigned char ch);
          void init_timer0();
          void program_timer0();
          void delay(unsigned int time);
          void main()
          {
          	init_timer0();
          	P3 = 0;
          	P2 = 0;
          	P1 = 0;
          	P1_4 = 1;
          	while(1)
          	{
          		char i;
          		unsigned int addr = 0x01;
          		for(i = 0; i < 8; i++)
          		{
          			P1 = 0;
          			P1_4 = 1;
          			P2 = displaybuffer[7-i].line[2];
          			P1 = (7-i)&(0x0F);
          			delay(1);
          		}
          		/*for(i = 0; i < 8; i++)
          		{
          			P1 = 0;
          			P3 = 0XFF;
          			P2 = displaybuffer[7-i].LINE.line[1];
          			P3 = ~(addr<<i);
          			P1 = (i+8)&(0x0F);
          			delay(1);
          		} */
          			 
          	}
          }
          /***** Add char to secondary buffer	*****/
          void addDataToSecondaryBuffer(unsigned char ch)
          {
          	switch(ch)
          	{
          	case 'A':
          		{
          			displaybuffer[0].line[3] = 24;
          			displaybuffer[1].line[3] = 36;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 66;
          			displaybuffer[4].line[3] = 126;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 66;
          			break;
          		}
          	case 'B':
          		{
          			displaybuffer[0].line[3] = 124;
          			displaybuffer[1].line[3] = 66;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 124;
          			displaybuffer[4].line[3] = 66;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 124;
          			break;
          		}
          	case 'D':
          		{
          			displaybuffer[0].line[3] = 120;
          			displaybuffer[1].line[3] = 68;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 66;
          			displaybuffer[4].line[3] = 66;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 68;
          			displaybuffer[7].line[3] = 120;
          			break;
          		}
          	case 'L':
          		{
          			displaybuffer[0].line[3] = 96;
          			displaybuffer[1].line[3] = 96;
          			displaybuffer[2].line[3] = 96;
          			displaybuffer[3].line[3] = 96;
          			displaybuffer[4].line[3] = 96;
          			displaybuffer[5].line[3] = 96;
          			displaybuffer[6].line[3] = 126;
          			displaybuffer[7].line[3] = 126;
          			break;
          		}
          	case 'E':
          		{
          			displaybuffer[0].line[3] = 126;
          			displaybuffer[1].line[3] = 64;
          			displaybuffer[2].line[3] = 64;
          			displaybuffer[3].line[3] = 120;
          			displaybuffer[4].line[3] = 64;
          			displaybuffer[5].line[3] = 64;
          			displaybuffer[6].line[3] = 64;
          			displaybuffer[7].line[3] = 126;
          			break;
          		}
          	case 'N':
          		{
          			displaybuffer[0].line[3] = 66;
          			displaybuffer[1].line[3] = 98;
          			displaybuffer[2].line[3] = 82;
          			displaybuffer[3].line[3] = 74;
          			displaybuffer[4].line[3] = 70;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 66;
          			break;
          		}
          	case 'G':
          		{
          			displaybuffer[0].line[3] = 60;
          			displaybuffer[1].line[3] = 66;
          			displaybuffer[2].line[3] = 64;
          			displaybuffer[3].line[3] = 78;
          			displaybuffer[4].line[3] = 66;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 60;
          			break;
          		}
          	case 'U':
          		{
          			displaybuffer[0].line[3] = 66;
          			displaybuffer[1].line[3] = 66;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 66;
          			displaybuffer[4].line[3] = 66;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 60;
          			break;
          		}
          	case 'Y':
          		{
          			displaybuffer[0].line[3] = 66;
          			displaybuffer[1].line[3] = 66;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 36;
          			displaybuffer[4].line[3] = 24;
          			displaybuffer[5].line[3] = 24;
          			displaybuffer[6].line[3] = 24;
          			displaybuffer[7].line[3] = 24;
          			break;
          		}
          	case 'K':
          		{
          			displaybuffer[0].line[3] = 68;
          			displaybuffer[1].line[3] = 72;
          			displaybuffer[2].line[3] = 80;
          			displaybuffer[3].line[3] = 96;
          			displaybuffer[4].line[3] = 112;
          			displaybuffer[5].line[3] = 72;
          			displaybuffer[6].line[3] = 68;
          			displaybuffer[7].line[3] = 66;
          			break;
          		}
          	case 'H':
          		{
          			displaybuffer[0].line[3] = 66;
          			displaybuffer[1].line[3] = 66;
          			displaybuffer[2].line[3] = 66;
          			displaybuffer[3].line[3] = 126;
          			displaybuffer[4].line[3] = 66;
          			displaybuffer[5].line[3] = 66;
          			displaybuffer[6].line[3] = 66;
          			displaybuffer[7].line[3] = 66;
          			break;
          		}
          	}
          }
          /***** Khoi tao Timer 0 *****/
          void init_timer0()
          {
          	TMOD|=0x01;
          	ET0=1;
          	EA=1;
          	TH0=0;
          	TL0=0;
          	TR0=1;
          }
          /***** Chuong trinh phuc vu cho ngat timer 0 *****/
          void program_timer0() interrupt 1
          {
          	
          	timer0_delay1++;
          	if(timer0_delay1 > 2)
          	{	
          		char i;
          		for(i = 0; i < 8; i++)
          			displaybuffer[i].line_data =displaybuffer[i].line_data<<1;	
          		timer0_delay1 = 0;
          		timer0_delay2++;
          	}
          	if(timer0_delay2 > 7)
          	{
          		addDataToSecondaryBuffer(display_data[timer0_counter1]);
          		timer0_delay2 = 0;
          		timer0_counter1++;
          		if(timer0_counter1 > 15)
          			timer0_counter1 = 0;
          	}
          	TF0=0;
          	TR0=1;
          }
          /***** Ham tao tre *****/
          void delay(unsigned int time)
          {
          	while(time--)
          	{
          		unsigned char temp = 121;
          		while(temp--) ;
          	}
          }
          // Hiện do mình chưa biết cách làm mạch in, mà làm trên bo đục lỗ đi dây tùm lum hết, nên chưa đủ khả năng làm phần cứng chứa 2 bảng led 8x8, nên mình cho phần mềm chạy 1 bảng thôi, chỉ cần sửa lại ở vòng for thứ nhất và mở thêm 1 vòng for nữa là chạy được 2 bảng.

          Thân,
          Cảm ơn.

          Comment


          • #6
            Cái đoạn giao tiếp kia mình cũng có rồi, nhưng mình đang thắc mắc ở chỗ là tìn hiệu gửi xuống nó có cấu trúc như thế nào. Soft máy tính mình dùng C#, dùng lệnh SerialPort.Write('a') để gửi, kon 89c51 cũng nhận được rồi nhưng không bít nó nhận đc tín hiệu thế nào để còn so sánh; vì của mình là máy tính gửi 1 yêu cầu hiện 1 chữ, 89c51 nhận tín hiệu đó và hiện chữ tương ứng, do đó phải bít tín hiệu như thế nào thì mới đặt biểu thức logic đc.

            Còn về làm mạch in cũng dễ thôi mà, bạn có thể tự làm hoặc thuê làm, chắc mạch này cũng tầm mấy chục ngàn - nếu chỉ àm 1 cái này thì nên đi thuê, còn thường xuyên làm thì bạn có thể tự làm theo hướng dẫn sau : http://dientuvietnam.net/forums/showthread.php?t=345. Bạn có thể dùng proteus hoặc orcad để vẽ mạch

            Comment


            • #7
              - Theo mình, để biết VĐK nhận data như thế nào thì sau khi nhận xong bạn cho xuất Data nhận được ra PORT P1,P2... tùy.
              - Sau đó dùng Proteus mô phỏng xem là thấy được liền à. VD chữ 'A' sau khi nhận xong, tớ xuất ra cổng P2 thì thấy data là (P2.0 -> P2.7) là 10000010, còn 'a' là : 10000110


              Thân,
              Chúc thành công.

              // Làm mạch in là mình tự vẽ rồi đem ra cho họ làm mạch à? Mình chỉ cần làm 1 cái mạch in để sắp xếp lại chân mấy con led matrix 8x8 cho nó có thứ tự để dễ kết nối thôi.
              Last edited by khanhduy301; 29-10-2008, 22:39.

              Comment


              • #8
                // Làm mạch in là mình tự vẽ rồi đem ra cho họ làm mạch à? Mình chỉ cần làm 1 cái mạch in để sắp xếp lại chân mấy con led matrix 8x8 cho nó có thứ tự để dễ kết nối thôi.
                Bạn dùng Proteus vẽ ra cái mạch, chuyển thành mạch in, rồi mang đi thuê họ làm.

                - Theo mình, để biết VĐK nhận data như thế nào thì sau khi nhận xong bạn cho xuất Data nhận được ra PORT P1,P2... tùy.
                - Sau đó dùng Proteus mô phỏng xem là thấy được liền à. VD chữ 'A' sau khi nhận xong, tớ xuất ra cổng P2 thì thấy data là (P2.0 -> P2.7) là 10000010, còn 'a' là : 10000110
                Mình vẫn không làm được. Các bạn xem giúp mình với. Bây giờ mình cần là chương trình điều khiển gửi 1 chữ cái xuống 89c52, 89c52 nhận và so sánh điều kiện, nếu đúng thì làm 1 việc gì đó. (VD : if (dulieuden==0x12) P1=0xfd


                Chương trình của mình như sau :
                CODE nạp :
                Code:
                #include <regx52.h>
                unsigned char uart_data_receive;
                //***************Thie^'t la^.p cho UART****************
                void uart_init()//dung trong truyen thong noi tiep
                {
                	SCON=0x50;//che do 8 bit du lieu,1 bit sart,1 bit stop
                	TMOD&=0x0F;//
                    TMOD|=0x20;//timer1 in mode2
                    TH1=0xFD;//set baut rate at 9600(11.0592Mhz)
                    TL1=0xFD;
                    ES=1;//cho phep ngat noi tiep
                	EA=1;//cho fep tat ca cac ngat
                	TR1=1;//chay timer1
                }
                //***************Gu+?i 1 ký tu+. *********************
                void send_data(char uart_data)//gui du lieu qua cong COM
                {
                	TI=0;
                	SBUF=0x00;
                	SBUF=uart_data;
                	while(TI==0){}//cho trong khi dang gui du lieu
                	TI=0;
                }
                //*************Nha^.n 1 ký tu+.*********************
                void receive_data() interrupt 4//nhan du lieu
                {
                	
                	if(RI==1)
                		{
                			RI=0;
                			uart_data_receive=SBUF;
                		}
                }
                
                main(void)
                {
                	uart_init();
                	P2=uart_data_receive;
                }
                Còn đây là code chương trình đk (viết = C#)
                Code:
                using System;
                using System.Collections.Generic;
                using System.ComponentModel;
                using System.Data;
                using System.Drawing;
                using System.Text;
                using System.Windows.Forms;
                using System.IO.Ports;
                using System.IO;
                using System.Threading;
                
                namespace WindowsApplication1
                {
                    public partial class Form1 : Form
                    {
                        public Form1()
                        {
                            InitializeComponent();
                        }
                
                        private void Form1_Load(object sender, EventArgs e)
                        {
                            if (serialPort1.IsOpen) serialPort1.Close();
                            serialPort1.Open();
                            serialPort1.DataReceived += new SerialDataReceivedEventHandler(dulieuden);
                        }
                
                        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
                        {
                            if (serialPort1.IsOpen) serialPort1.Close();
                        }
                
                        private void button1_Click(object sender, EventArgs e)
                        {
                            serialPort1 .Write("a");//Đúng ra là serialPort1 .Write(textbox1.text); nhưng mình đặt luôn thữ a để thử
                        }
                        string data;
                        private void dulieuden(object sender, SerialDataReceivedEventArgs e)
                        {
                            data = "";
                            data = serialPort1.ReadExisting();
                        }
                        
                        private void button2_Click(object sender, EventArgs e)
                        {
                            textBox2.Text = data;
                        }
                    }
                }
                Mạch như sau :




                Tất cả ở file đính kèm
                Attached Files

                Comment


                • #9
                  Hik, cuối cùng thì cũng tìm ra lỗi rồi. nó là do cái hàm ngắt receive_data lúc nào nó cũng gán uart_receive_data=SBUF cho nên lúc nào uart_receive_data cũng bằng 0x00; vì không gửi tín hiệu thì nó mặc định = 0x00 hay sao ấy (thêys P2 có giá trị 0 hết)

                  Ai phương án giải quyết không, chỉ giáo cho em với.
                  Em cần là mỗi khi nhận đc tín hiệu thì sẽ lưu vào 1 biến nào đó để dùng trong Main()

                  Comment


                  • #10
                    - Không phải vấn đề nằm ở hàm receive_data đâu. Code của mình y hệt của cậu mà vẫn chạy good đó.
                    - Mình nghĩ vấn đề nằm ở đoạn code C# đó. Mình đọc đoạn code đó thấy bạn chưa khai báo tốc độ truyền nhận Data là 9600bps.

                    // Còn nữa, khi mô phỏng = Proteus, bạn phải vào set cho con uC chạy thạch anh 11.0592MHz (set trong uC properties đó). Mặc định Proteus nó cho chạy 12MHz đó.

                    Thân,

                    Comment


                    • #11
                      - Mình nghĩ vấn đề nằm ở đoạn code C# đó. Mình đọc đoạn code đó thấy bạn chưa khai báo tốc độ truyền nhận Data là 9600bps.
                      cái này khi mình add serialport mình set ở phần properties của nó rồi.
                      // Còn nữa, khi mô phỏng = Proteus, bạn phải vào set cho con uC chạy thạch anh 11.0592MHz (set trong uC properties đó). Mặc định Proteus nó cho chạy 12MHz đó.
                      Cái này mình cũng sửa rồi.

                      Đúng là nó ở chỗ receive_data ấy, vì khi mình thay dòng uart_data_receive=SBUF; thành P2=SBUF thì nó có xuất ra port2 các bit tương ứng, nhưng khi đặt ở main thì nó xuất ra 00000000.

                      Bạn gửi đoạn code nạp của bạn để mình tham khảo được không ?



                      Cho mình hỏi cái nữa là : khi uart_data_receive=SBUF; rồi, tức là có giá trị trong uart_data_receive rồi, thì viết biểu thức đk sau như thế nào ? if (uart_data_receive==10000110) P1=0x00; <~~ cái chỗ 1000110 ấy, mình viết nhưng khi gửi chữ 'a' mà nó k đúng.

                      Comment


                      • #12
                        oh yea, đc rồi.... fuf, cuối cùng thì cũng tạm xong

                        KhanhDuy nhớ gửi cho mình đoạn code nạp mà sử dụng được giá trị của uart_receive_data ở main() nhé
                        Last edited by Huntress1; 31-10-2008, 10:27.

                        Comment


                        • #13
                          if (uart_data_receive==10000110) P1=0x00;

                          => cái này bạn thay 10000110 thành 'a' hoặc 97 luôn cho gọn, vì nó là 1 chuẩn chung rồi. (hình như cách viết 10000110 keil C không hiểu là binary đâu, muốn Keil C hiểu là binary thì phải viết cái gì gì nữa đó.
                          Ví dụ: chữ a của computer cũng có mã là 97, chữ b là 98...

                          - Còn hàm main, để cập nhật P2 = uart_receive_data, bạn phải đặt nó trong hàm lặp.
                          VD:
                          while(1)
                          {
                          P2 = uart_receive_data;
                          };

                          Thân,

                          Comment


                          • #14
                            uki. Thxx bạn nhìu, chỗ đấy được rồi bạn àh.

                            Mình gần như đã hoàn thành rồi, nhưng bây giờ mình add font vào chương trình không được >"<. hình như theo cách của mình thì nó nhiều biến quá nên không chạy, mình làm được chữ a,b,0,1,2,3,4,5,6,7,8; nếu thêm 1 biến nữa là có lỗi. Cách sử dụng như ở dưới, bạn có phương án add font nào không ?

                            Code:
                            #include <regx52.h>
                            	unsigned char ud1,ud2,kt=1;
                            	char a[8]={247,235,221,190,128,190,190,190};
                            	char b[8]={240,238,238,224,222,222,222,224};
                            	char s0[8]={225,222,206,214,218,220,222,225};
                            	char s1[8]={251,249,250,251,251,251,251,224};
                            	char s2[8]={241,238,239,247,251,253,254,224};
                            	char s3[8]={241,238,239,243,239,239,238,241};
                            	char s4[8]={247,243,245,246,224,247,247,247};
                            	char s5[8]={224,254,254,240,239,239,238,241};
                            	char s6[8]={241,238,254,240,238,238,238,241};
                            	char s7[8]={192,222,239,239,247,247,251,251};
                            	char s8[8]={241,238,238,241,238,238,238,241};
                            //	char s9[8]={241,238,238,225,239,239,238,241};
                            									   
                            void delay(unsigned int ms)
                              { 
                                unsigned int i,j;
                                for (i=0; i<ms; i++)
                            		for (j=0; j<120; j++);
                              }
                            
                            void ht(char mang[]);  
                            
                            void ui()
                            {
                            	SCON=0x50;
                            	TMOD&=0x0F;
                                TMOD|=0x20;
                                TH1=0xFD;
                                TL1=0xFD;
                                ES=1;
                            	EA=1;
                            	TR1=1;
                            }
                            
                            /*void send_data(char uart_data)//gui du lieu qua cong COM
                            {
                            	TI=0;
                            	SBUF=0x00;
                            	SBUF=uart_data;
                            	while(TI==0){}//cho trong khi dang gui du lieu
                            	TI=0;
                            } */
                            
                            void re() interrupt 4
                            {
                            	if(RI==1)
                            		{
                            			RI=0;
                            			if (kt==1) {ud1=SBUF;kt=2;}
                            			else {ud2=SBUF;kt=1;}
                            		}
                            }				 
                            	char p3[3][8] = {{0,1,0,1,0,1,0,1},{0,0,1,1,0,0,1,1},{0,0,0,0,1,1,1,1}};
                            	char col;	 	
                            main(void)
                            {
                            	ui();
                            	while(1)
                            	{
                            		P3_4=p3[0][col];
                            		P3_5=p3[1][col];
                            		P3_6=p3[2][col];
                            		P3_7=0x00;
                            		switch (ud1)
                            		{
                            			case 'a' : P0=a[col];
                            						break;
                            			case 'b' : P0=b[col];
                            						break;
                            			case '0' : P0=s0[col];
                            						break;
                            			case '1' : P0=s1[col];
                            						break;
                            			case '2' : P0=s2[col];
                            						break;
                            			case '3' : P0=s3[col];
                            						break;
                            			case '4' : P0=s4[col];
                            						break;
                            			case '5' : P0=s5[col];
                            						break;
                            			case '6' : P0=s6[col];
                            						break;
                            			case '7' : P0=s7[col];
                            						break;
                            			case '8' : P0=s8[col];
                            						break;			
                            /*			case '9' : P0=s9[col];
                            						break;*/				
                            		}
                            		switch (ud2)
                            		{
                            			case 'a' : P2=a[col];
                            						break;
                            			case 'b' : P2=b[col];
                            						break;
                            			case '0' : P2=s0[col];
                            						break;
                            			case '1' : P2=s1[col];
                            						break;
                            			case '2' : P2=s2[col];
                            						break;
                            			case '3' : P2=s3[col];
                            						break;
                            			case '4' : P2=s4[col];
                            						break;
                            			case '5' : P2=s5[col];
                            						break;
                            			case '6' : P2=s6[col];
                            						break;
                            			case '7' : P2=s7[col];
                            						break;
                            			case '8' : P2=s8[col];
                            						break;			
                            /*			case '9' : P2=s9[col];
                            						break;	*/
                            		}
                            		col++;	  
                            		if(col==8)col=0;
                            		delay(5);
                            	}
                            
                            }
                            Attached Files

                            Comment


                            • #15
                              - Để tiết kiệm RAM, bạn dùng phương pháp buffer đi. Nhưng phương pháp này sẽ hơi tốn ROM hơn 1 tí tí ti .

                              // Khai báo và khởi tạo buffer
                              Code:
                              typedef union
                              {
                              	long line_data;
                              	unsigned char line[4];
                              }DISPLAY_BUFFER;
                              DISPLAY_BUFFER displaybuffer[8];
                              ==> buffer của mình gồm 2 phần, 1 primary buffer và 1 secondary buffer (secondary buffer dùng để phục vụ chạy chữ thôi).


                              // Khởi tạo giá trị vào secondary buffer...
                              Code:
                              void addDataToSecondaryBuffer(unsigned char ch)
                              {
                              	switch(ch)
                              	{
                              	case 'A':
                              		{
                              			displaybuffer[0].line[3] = 24;
                              			displaybuffer[1].line[3] = 36;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 66;
                              			displaybuffer[4].line[3] = 126;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 66;
                              			break;
                              		}
                              	case 'B':
                              		{
                              			displaybuffer[0].line[3] = 124;
                              			displaybuffer[1].line[3] = 66;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 124;
                              			displaybuffer[4].line[3] = 66;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 124;
                              			break;
                              		}
                              	case 'D':
                              		{
                              			displaybuffer[0].line[3] = 120;
                              			displaybuffer[1].line[3] = 68;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 66;
                              			displaybuffer[4].line[3] = 66;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 68;
                              			displaybuffer[7].line[3] = 120;
                              			break;
                              		}
                              	case 'L':
                              		{
                              			displaybuffer[0].line[3] = 96;
                              			displaybuffer[1].line[3] = 96;
                              			displaybuffer[2].line[3] = 96;
                              			displaybuffer[3].line[3] = 96;
                              			displaybuffer[4].line[3] = 96;
                              			displaybuffer[5].line[3] = 96;
                              			displaybuffer[6].line[3] = 126;
                              			displaybuffer[7].line[3] = 126;
                              			break;
                              		}
                              	case 'E':
                              		{
                              			displaybuffer[0].line[3] = 126;
                              			displaybuffer[1].line[3] = 64;
                              			displaybuffer[2].line[3] = 64;
                              			displaybuffer[3].line[3] = 120;
                              			displaybuffer[4].line[3] = 64;
                              			displaybuffer[5].line[3] = 64;
                              			displaybuffer[6].line[3] = 64;
                              			displaybuffer[7].line[3] = 126;
                              			break;
                              		}
                              	case 'N':
                              		{
                              			displaybuffer[0].line[3] = 66;
                              			displaybuffer[1].line[3] = 98;
                              			displaybuffer[2].line[3] = 82;
                              			displaybuffer[3].line[3] = 74;
                              			displaybuffer[4].line[3] = 70;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 66;
                              			break;
                              		}
                              	case 'G':
                              		{
                              			displaybuffer[0].line[3] = 60;
                              			displaybuffer[1].line[3] = 66;
                              			displaybuffer[2].line[3] = 64;
                              			displaybuffer[3].line[3] = 78;
                              			displaybuffer[4].line[3] = 66;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 60;
                              			break;
                              		}
                              	case 'U':
                              		{
                              			displaybuffer[0].line[3] = 66;
                              			displaybuffer[1].line[3] = 66;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 66;
                              			displaybuffer[4].line[3] = 66;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 60;
                              			break;
                              		}
                              	case 'Y':
                              		{
                              			displaybuffer[0].line[3] = 66;
                              			displaybuffer[1].line[3] = 66;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 36;
                              			displaybuffer[4].line[3] = 24;
                              			displaybuffer[5].line[3] = 24;
                              			displaybuffer[6].line[3] = 24;
                              			displaybuffer[7].line[3] = 24;
                              			break;
                              		}
                              	case 'K':
                              		{
                              			displaybuffer[0].line[3] = 68;
                              			displaybuffer[1].line[3] = 72;
                              			displaybuffer[2].line[3] = 80;
                              			displaybuffer[3].line[3] = 96;
                              			displaybuffer[4].line[3] = 112;
                              			displaybuffer[5].line[3] = 72;
                              			displaybuffer[6].line[3] = 68;
                              			displaybuffer[7].line[3] = 66;
                              			break;
                              		}
                              	case 'H':
                              		{
                              			displaybuffer[0].line[3] = 66;
                              			displaybuffer[1].line[3] = 66;
                              			displaybuffer[2].line[3] = 66;
                              			displaybuffer[3].line[3] = 126;
                              			displaybuffer[4].line[3] = 66;
                              			displaybuffer[5].line[3] = 66;
                              			displaybuffer[6].line[3] = 66;
                              			displaybuffer[7].line[3] = 66;
                              			break;
                              		}
                              	}
                              }
                              // Nạp từng ký tự vào secondary buffer... (Mình dùng timer0 để nạp)...
                              Code:
                              void program_timer0() interrupt 1
                              {
                              	
                              	timer0_delay1++;
                              	if(timer0_delay1 > 2)
                              	{	
                              		char i;
                              		for(i = 0; i < 8; i++)
                              			displaybuffer[i].line_data =displaybuffer[i].line_data<<1;	
                              		timer0_delay1 = 0;
                              		timer0_delay2++;
                              	}
                              	if(timer0_delay2 > 7)
                              	{
                              		addDataToSecondaryBuffer(display_data[timer0_counter1]);
                              		timer0_delay2 = 0;
                              		timer0_counter1++;
                              		if(timer0_counter1 > 15)
                              			timer0_counter1 = 0;
                              	}
                              	TF0=0;
                              	TR0=1;
                              }
                              // Đưa ra màn hình:
                              Code:
                              while(1)
                              	{
                              		char i;
                              		unsigned int addr = 0x01;
                              		for(i = 0; i < 8; i++)
                              		{
                              			P1 = 0;
                              			P1_4 = 1;
                              			P2 = displaybuffer[7-i].line[2];
                              			P1 = (7-i)&(0x0F);
                              			delay(1);
                              		}
                              	}
                              => Nguyên chương trình của mình tốn tổng cộng 65byte RAM cho các biến flag và việc hiển thị chạy chữ "Le Nguyen Khanh Duy". => Còn dư kha khá nhỉ .

                              Comment

                              Về tác giả

                              Collapse

                              khanhduy301 Tìm hiểu thêm về khanhduy301

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X