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

                              • vi van pham
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi vi van pham
                                Cám ơn những lời chúc tốt đẹp của em.

                                Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

                                Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
                                hôm nay, 02:00
                              • nhathung1101
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi nhathung1101
                                Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                                Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                                Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                                Hôm qua, 22:18
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                                Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                                Hôm qua, 14:51
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                                Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                                Hôm qua, 14:39
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                                Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                                Hôm qua, 14:28
                              • bqviet
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi bqviet
                                Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                                21-02-2025, 20:26
                              • mèomướp
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi mèomướp
                                Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                                21-02-2025, 12:32
                              • vi van pham
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi vi van pham
                                Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                                Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                                20-02-2025, 21:31
                              • bqviet
                                Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                bởi bqviet
                                Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                                20-02-2025, 17:22
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.

                                Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...
                                20-02-2025, 11:52
                              Đang tải...
                              X