Thông báo

Collapse
No announcement yet.

Thuật toán quét led 7 thanh

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

  • Thuật toán quét led 7 thanh

    Các bạn giúp mình chương trình này, trong có cả file mô phỏng. sao khi ấn nút để tăng số thì led 7 thanh nháy 1 phát rồi tăng. Làm sao để các led không bi như vậy nữa.
    lam sao để các led sáng ổn định không bi hiện tượng đó. link đây: http://www.mediafire.com/?sfrp8f8ggsps9ef
    /*====================khai bao thu vien lenh va dinh nghia chan vdk ===========*/
    #include<regx51.h> // thu vien lenh
    #define leddata P2 // dinh nghia duong du lieu le 7 thanh noi P2
    #define led1 P3_4 // dinh nghia nguon led1 noi voi P3.4
    #define led2 P3_5 // dinh nghia nguon led2 noi voi P3.5
    #define led3 P3_6 // dinh nghia nguon led3 noi voi P3.6
    #define led4 P3_7 // dinh nghia nguon led4 noi voi P3.7
    #define nut P1_3 // dinh nghia nut an noi voi P1.3
    /*============================khai bao bien ===========*/
    unsigned char sp,chuyen;
    unsigned char so[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // ma led 7 thanh anot chung tuong ung voi tu 0 den 9
    unsigned char a,b,c,d;
    /*============================chuong trinh con tao tre ===========*/
    void delay( unsigned int m )
    {
    unsigned int i,j;
    for(i=0;i<m;i++)
    {
    for(j=0;j<125;j++)
    {}
    }
    }
    /*============================chuong trinh con hien thi quet led===========*/
    void hien_thi(unsigned char chuyen,unsigned char sp)
    {
    a=chuyen/10;
    b=(chuyen-a*10);
    c=sp/10;
    d=(sp-c*10);

    led1=1;led2=0,led3=0,led4=0;
    leddata=so[a];
    delay(3);

    led1=0;led2=1,led3=0,led4=0;
    leddata=so[b];
    delay(3);

    led1=0;led2=0,led3=1,led4=0;
    leddata=so[c];
    delay(3);

    led1=0;led2=0,led3=0,led4=1;
    leddata=so[d];
    delay(3);

    }
    /*============================chuong trinh chinh ===========*/
    void main()
    {
    sp=0;
    chuyen=0;
    while(1)
    {
    if(nut==0)
    {
    delay(200);
    sp=sp+1;
    }
    if(sp==10)
    {
    sp=0;
    chuyen=chuyen+1;
    }
    if(chuyen==100)
    chuyen=0;
    hien_thi(chuyen,sp);
    }
    }

  • #2
    Bởi vì code bạn viết nó như thế, thì lúc chạy nó phải như thế thôi.
    code quét của bạn, 3 lệnh cuối là cho led 4 sáng. VÀ code quét phím, khi có phím thì delay(200)
    => nếu có phím bấm thì, chỉ led 4 được sáng, và thời gian đó được duy trì bằng delay(200);
    do đó, sau khi delay xong mới thấy các led khác sáng.
    cho nên bạn mới thấy khi bấm thì chỉ có led 4 sáng thôi, nháy một phát, các led khác mới sáng.

    Comment


    • #3
      Nguyên văn bởi hoadang Xem bài viết
      Bởi vì code bạn viết nó như thế, thì lúc chạy nó phải như thế thôi.
      code quét của bạn, 3 lệnh cuối là cho led 4 sáng. VÀ code quét phím, khi có phím thì delay(200)
      => nếu có phím bấm thì, chỉ led 4 được sáng, và thời gian đó được duy trì bằng delay(200);
      do đó, sau khi delay xong mới thấy các led khác sáng.
      cho nên bạn mới thấy khi bấm thì chỉ có led 4 sáng thôi, nháy một phát, các led khác mới sáng.
      vậy mình phải sửa như nào bây giờ. minh thử bỏ delay chỗ phím ấn rồi vẫn bị

      Comment


      • #4
        Tôi thường làm cách này nhé :

        Code:
        while(1)	
        {
        if(nut==0)	
        {
           sp=sp+1;
        if(sp==10)	
        {
        sp=0;	
        chuyen=chuyen+1;
        }
        if(chuyen==100)	
        chuyen=0;
        while(nut==0) hien_thi(chuyen,sp);
        }
        	
        hien_thi(chuyen,sp);	
        }
        thử xem sao
        Last edited by thientanvt; 26-12-2012, 18:44.

        Comment


        • #5
          Nguyên văn bởi thientanvt Xem bài viết
          Tôi thường làm cách này nhé :

          Code:
          while(1)	
          {
          if(nut==0)	
          {
             sp=sp+1;
          if(sp==10)	
          {
          sp=0;	
          chuyen=chuyen+1;
          }
          if(chuyen==100)	
          chuyen=0;
          while(nut==0) hien_thi(chuyen,sp);
          }
          	
          hien_thi(chuyen,sp);	
          }
          thử xem sao
          Viết như bạn, bấm phím một phát nó tăng những mấy lần,

          Comment


          • #6
            Bạn thử xem sao nhé, mình bổ sung một chút xíu code
            Code:
            /*============================chuong trinh chinh ===========*/ 
            void main()
            {
            char CountStatus=0;
            sp=0;		 
            chuyen=0;	
            while(1)	 
            {
            switch(CountStatus)
            {
            case 0:		// kiem tra xem co phim duoc bam khong
            		if(nut==0)
            			CountStatus=1;
            		break;
            case 1:
            		sp=sp+1; 
            		CountStatus=2;
            		break;
            case 2:	// doi cho nha phim	, reset trang thai bien CountStatus
            		if(nut==1)
            			CountStatus=0;
            		break;
            default: break;
            }	
            
            if(sp==10)	
            {
            sp=0;	
            chuyen=chuyen+1;
            }
            if(chuyen==100)	
            chuyen=0;		 
            hien_thi(chuyen,sp);		
            }
            }

            Comment


            • #7
              Hì hì cái lệnh:

              WHILE(nut==0)hien_thi(chuyen,sp);

              sờ sờ thế kia sao mà không thấy nhỉ.

              Comment


              • #8
                Nguyên văn bởi thientanvt Xem bài viết
                Tôi thường làm cách này nhé :

                Code:
                while(1)	
                {
                if(nut==0)	
                {
                   sp=sp+1;
                if(sp==10)	
                {
                sp=0;	
                chuyen=chuyen+1;
                }
                if(chuyen==100)	
                chuyen=0;
                while(nut==0) hien_thi(chuyen,sp);
                }
                	
                hien_thi(chuyen,sp);	
                }
                thử xem sao
                Hay, mình sửa như cậu được rồi. Vậy nó làm sao nhì giải thích hộ mình. Cảm ơn các bác nhiều

                Comment


                • #9
                  tiện đây cho mình hỏi nếu mình không dùng ấn nút để tăng mà muốn tăng tự động sau 1s thi tăng như kiểu đồng hồ thì làm sao cho hết hiện tượng nháy đó.
                  code
                  /*====================khai bao thu vien lenh va dinh nghia chan vdk ===========*/
                  #include<regx51.h>
                  #define leddata P2
                  #define led1 P3_0
                  #define led2 P3_1
                  #define led3 P3_2
                  #define led4 P3_3
                  #define led5 P3_4
                  #define led6 P3_5
                  #define cai_dat P1_0
                  #define tang P1_1
                  #define giam P1_2
                  /*============================khai bao bien ===========*/
                  unsigned char h,m,s;
                  unsigned char so[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // ma led 7 thanh anot chung tuong ung voi tu 0 den 9
                  unsigned char a,b,c,d,e,f,k;
                  /*============================chuong trinh con tao tre ===========*/
                  void delay( unsigned int m )
                  {
                  unsigned int i,j;
                  for(i=0;i<m;i++)
                  {
                  for(j=0;j<125;j++)
                  {}
                  }
                  }
                  /*============================chuong trinh con hien thi quet led===========*/
                  void hien_thi(unsigned char h,unsigned char m,unsigned char s)
                  {
                  a=h/10;
                  b=(h-a*10);

                  c=m/10;
                  d=(m-c*10);

                  e=s/10;
                  f=(s-e*10);

                  led1=1;led2=0,led3=0,led4=0,led5=0,led6=0;
                  leddata=so[a];
                  delay(3);

                  led1=0;led2=1,led3=0,led4=0,led5=0,led6=0;
                  leddata=so[b];
                  delay(3);

                  led1=0;led2=0,led3=1,led4=0,led5=0,led6=0;
                  leddata=so[c];
                  delay(3);

                  led1=0;led2=0,led3=0,led4=1,led5=0,led6=0;
                  leddata=so[d];
                  delay(3);

                  led1=0;led2=0,led3=0,led4=0,led5=1,led6=0;
                  leddata=so[e];
                  delay(3);

                  led1=0;led2=0,led3=0,led4=0,led5=0,led6=1;
                  leddata=so[f];
                  delay(3);

                  }


                  /*============================chuong trinh chinh ===========*/
                  void main()
                  {
                  h=0;
                  m=0;
                  s=0;
                  k=0;
                  while(1)
                  {
                  delay(1000);
                  s++;
                  if(s==60)
                  {
                  s=0;
                  m++;
                  }
                  if(m==60)
                  {
                  m=0;
                  h++;
                  if(h==24)
                  h=0;
                  }
                  hien_thi(h,m,s);

                  }
                  }
                  Last edited by datk6z; 27-12-2012, 13:13.

                  Comment


                  • #10
                    Thế này nhé khi nhấn nút thì làm cái gì đó làm xong thì while("còn nhấn")"làm gì đó(ở đây là hiển thị)"; vậy nhé.

                    còn muốn làm đồng hồ thì bạn hảy nghiên cứu sử dung ds1307 hay mấy con đông hồ khác là được.

                    còn nếu muốn làm đồng hồ bấm giờ thì phải dùng ngắt timer nhé đặt giá trị timer sau cho khi ngắt xảy ra = hoặc tuơng đương 1s rồi cộng dồn các giá trị sec->min->hour lên là có ngay nhé.

                    Comment


                    • #11
                      [QUOTE=thientanvt;651915]Thế này nhé khi nhấn nút thì làm cái gì đó làm xong thì while("còn nhấn")"làm gì đó(ở đây là hiển thị)"; vậy nhé.

                      còn muốn làm đồng hồ thì bạn hảy nghiên cứu sử dung ds1307 hay mấy con đông hồ khác là được.

                      còn nếu muốn làm đồng hồ bấm giờ thì phải dùng ngắt timer nhé đặt giá trị timer sau cho khi ngắt xảy ra = hoặc tuơng đương 1s rồi cộng dồn các giá trị sec->min->hour lên là có ngay nhé

                      cậu có đoạn code nao không cho mình xin với.mình chưa làm ngắt bao giờ. mình chỉ biết ngắt ngoài chứ chưa làm ngắt time bao giờ.

                      Comment


                      • #12
                        Bạn phải nghiên cứu chút ít đi chứ đừng có cái gì cũng nhờ người khác hết vậy. Đại loại là thế này :
                        Code:
                        // timer 0 , 1 chạy ở mode nào thì tự đọc tài liệu đi nhé .:-$
                        void timer () interrupt ussing 1{ // dùng timer 0 ussing 1
                          // tính toán thời gian sao cho gần được 1 s nhé rồi cộng dồn lên
                            sec++;
                            if(sec==60){sec=0;
                              min++;
                              if(min==60){mi=0;
                                hour++;if(hour==24)hour=0;
                              }
                            }        
                        }
                        
                        //trong chương trình chính thì khai báo ngắt timer
                        
                        void main(void){
                              TMOD = 0xxx;      // tự tìm cách cài mode của timer nhé.
                              THx=0xxx;           // cài giá trị timer nhé của byte cao. 
                              TLx=0xxx;           // cài giá trị timer nhé của byte thấp.
                              TRx=x;               // khởi chạy timer .
                              while(1){ // làm gì thì làm}
                        }
                        
                        P/s: cúp điện cả ngày nên không online được. Chút thành công nhé.:)):)):))

                        Comment


                        • #13
                          Nguyên văn bởi thientanvt Xem bài viết
                          Tôi thường làm cách này nhé :

                          Code:
                          while(1)	
                          {
                          if(nut==0)	
                          {
                             sp=sp+1;
                          if(sp==10)	
                          {
                          sp=0;	
                          chuyen=chuyen+1;
                          }
                          if(chuyen==100)	
                          chuyen=0;
                          while(nut==0) hien_thi(chuyen,sp);
                          }
                          	
                          hien_thi(chuyen,sp);	
                          }
                          thử xem sao
                          mình góp ý thêm cái này nhé: trong C bạn lên viết thêm { câu lệnh } sau lệnh IF chỗ mình in đậm đấy. bạn lên viết là if(chuyen==100) { chuyen=0;} thì VDK đọc sẽ không bị sai bạn à.
                          chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                          Everything should be made as simple as possible, but not simpler

                          Comment


                          • #14
                            Nguyên văn bởi lthuan2011
                            mình đang tập làm đồng hồ số bằng led đơn, có thời gian thực nưa, a,e nào có tài liệu chia sẽ nhé
                            nếu bước đầu làm, bạn nên dùng con led 7 đoạn chạy thử trước, rồi mới ghép bằng led đơn sau
                            - Mạch nạp vdk 8051, AVR, PIC, EEPROM
                            - Linh kiện điện tử cho sinh viên


                            Comment


                            • #15
                              thoi gian thuc thi bạn dùng ds1307 chạy cũng ok lắm rùi
                              chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                              Everything should be made as simple as possible, but not simpler

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X