Thông báo

Collapse
No announcement yet.

hỏi đáp ý tưởng lập trình code C.

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

  • hỏi đáp ý tưởng lập trình code C.

    Dưới đây là code C của em, chương trình này có chức năng nhập số từ bàn phím, phát ra loa tần số giá trị nhập vào từ bàn phím, em gặp các vấn đề sau:
    + Hàm hiển thị led của em tách hàng đơn vị, hàng chục riêng---> không thể giữ trạng thái Led sáng cùng lúc (em dùng con 7seg-LPX2-CC) khi nhấn phím.
    + Em làm gần xong rồi nhưng yêu cầu của Thầy dạy vi xử lí là tạo thêm một nút stop (ở đây em chọn phím 0) khi nhấn nút stop-->Loa ngừng kêu.
    Các Anh có ý tưởng xin hướng dẫn cho em với, gần tới ngày báo cáo rồi, còn vướng chỗ này thôi.
    Code:
    #include <REGX51.H>
    sbit led1 = P2^0;
    sbit led2 = P2^1;
    sbit loa  = P1^7;
    
    //HAM DELAY CO BAN
    void delay_us(int time)
    {
    while(time--);
    }
    
      //CAC GIA TRI THEO HEX XUAT RA LED 0-->9
    unsigned char seg7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    void sang(int n)
         {
    int c,dv,i;
    c=n/10;
    dv=n%10;
     
      P0=seg7[c];
      led1=1;led2=0;
      delay_us(500);
     
      P0=0xff; delay_us(200);
      
      P0=seg7[dv];
      led2=1;led1=0;
      delay_us(500);
    
      P0=0xff;delay_us(200);
      
    
             
     
        }
    void delay(unsigned char time){//Chuong trinh tao tre
            unsigned int t;
            for(t=0;t<time;t++){
                    TMOD=0x01;
                    TH0=0xff;
                    TL0=0xce;
                    TR0=1;
                    while(!TF0);
                    TF0=TR0=0;
            }
    }
    //phimduocan
     void phim_duoc_an(unsigned char phim)
       {
    switch(phim)// Tuy vao so lan
           {
    case 0: { sang(0); break; }
    case 1: { {sang(1); loa=1; delay(20);loa=0;delay(20);  break; }}
    case 2: { {sang(2); loa=1; delay(40);loa=0;delay(40);  break; } }
    case 3: { {sang(3); loa=1; delay(60);loa=0;delay(60);  break; } }
    case 4: { {sang(4); loa=1; delay(80);loa=0;delay(80);  break; } }
    case 5: { {sang(5); loa=1; delay(100);loa=0;delay(100);  break; } }
    case 6: {{sang(6); loa=1; delay(120);loa=0;delay(120);  break; } }
    case 7: { {sang(7); loa=1; delay(140);loa=0;delay(140);  break; } }
    case 8: { {sang(8); loa=1; delay(160);loa=0;delay(160);  break; } }
    case 9: { {sang(9); loa=1; delay(180);loa=0;delay(180);  break; } }
    case 10:{{sang(10); loa=1; delay(200);loa=0;delay(200);  break; }}
    case 11:{{sang(11); loa=1; delay(220);loa=0;delay(220);  break; }}
    case 12:{{sang(12); loa=1; delay(240);loa=0;delay(240);  break; }}
    case 13:{{sang(13); loa=1; delay(260);loa=0;delay(260);  break; }}
    case 14:{{sang(14); loa=1; delay(280);loa=0;delay(280);  break; }}
    case 15:{{sang(15); loa=1; delay(300);loa=0;delay(300);  break; }}
           }
        }
    unsigned char quetphim[4]={0xFE,0xFD,0xFB,0xF7};
    //HAM Quet PHIM
    #define solanquetphim 100 
    unsigned char quetbanphim(void)
         {
    unsigned char giatribanphim;
    unsigned char x,y;
    
    for(x=0; x<4;x++)
     {
    P3=quetphim[x];// Dua lan luot cac hang xuong 0
    for(y=0;y<solanquetphim;y++)// Kiem tra solanquetphim lan
       {
    if(P3_4==0) giatribanphim=0+4*x;// Gia tri phim tuong ung
    if(P3_5==0) giatribanphim=1+4*x;// Tuy thuoc vao hang x
    if(P3_6==0) giatribanphim=2+4*x;// La may ma gia tri cua
    if(P3_7==0) giatribanphim=3+4*x;// gia tri ban phim tuong ung.
        }
     }
    return(giatribanphim);
         }
    
    
    //Hàm Main.
    void main(void)
     {
    unsigned char i;
    while(1)
      {
    i=quetbanphim();
    phim_duoc_an(i);
       }
     }
    Em đã thử sửa lại vd :case 1: { keep: {sang(1); loa=1; delay(20);loa=0;delay(20); while (1) {goto keep; } break; }} thì đèn đã giữ được trạng thái sáng, và loa (p1.7) kêu, nhưng không làm sao cho nó thoát được, nhấn phím khác thì không ăn thua.

  • #2
    Nguyên văn bởi doublemint_1 Xem bài viết
    Dưới đây là code C của em, chương trình này có chức năng nhập số từ bàn phím, phát ra loa tần số giá trị nhập vào từ bàn phím, em gặp các vấn đề sau:
    + Hàm hiển thị led của em tách hàng đơn vị, hàng chục riêng---> không thể giữ trạng thái Led sáng cùng lúc (em dùng con 7seg-LPX2-CC) khi nhấn phím.
    + Em làm gần xong rồi nhưng yêu cầu của Thầy dạy vi xử lí là tạo thêm một nút stop (ở đây em chọn phím 0) khi nhấn nút stop-->Loa ngừng kêu.
    Các Anh có ý tưởng xin hướng dẫn cho em với, gần tới ngày báo cáo rồi, còn vướng chỗ này thôi.
    Code:
    #include <REGX51.H>
    sbit led1 = P2^0;
    sbit led2 = P2^1;
    sbit loa  = P1^7;
    
    //HAM DELAY CO BAN
    void delay_us(int time)
    {
    while(time--);
    }
    
      //CAC GIA TRI THEO HEX XUAT RA LED 0-->9
    unsigned char seg7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    void sang(int n)
         {
    int c,dv,i;
    c=n/10;
    dv=n%10;
     
      P0=seg7[c];
      led1=1;led2=0;
      delay_us(500);
     
      P0=0xff; delay_us(200);
      
      P0=seg7[dv];
      led2=1;led1=0;
      delay_us(500);
    
      P0=0xff;delay_us(200);
      
    
             
     
        }
    void delay(unsigned char time){//Chuong trinh tao tre
            unsigned int t;
            for(t=0;t<time;t++){
                    TMOD=0x01;
                    TH0=0xff;
                    TL0=0xce;
                    TR0=1;
                    while(!TF0);
                    TF0=TR0=0;
            }
    }
    //phimduocan
     void phim_duoc_an(unsigned char phim)
       {
    switch(phim)// Tuy vao so lan
           {
    case 0: { sang(0); break; }
    case 1: { {sang(1); loa=1; delay(20);loa=0;delay(20);  break; }}
    case 2: { {sang(2); loa=1; delay(40);loa=0;delay(40);  break; } }
    case 3: { {sang(3); loa=1; delay(60);loa=0;delay(60);  break; } }
    case 4: { {sang(4); loa=1; delay(80);loa=0;delay(80);  break; } }
    case 5: { {sang(5); loa=1; delay(100);loa=0;delay(100);  break; } }
    case 6: {{sang(6); loa=1; delay(120);loa=0;delay(120);  break; } }
    case 7: { {sang(7); loa=1; delay(140);loa=0;delay(140);  break; } }
    case 8: { {sang(8); loa=1; delay(160);loa=0;delay(160);  break; } }
    case 9: { {sang(9); loa=1; delay(180);loa=0;delay(180);  break; } }
    case 10:{{sang(10); loa=1; delay(200);loa=0;delay(200);  break; }}
    case 11:{{sang(11); loa=1; delay(220);loa=0;delay(220);  break; }}
    case 12:{{sang(12); loa=1; delay(240);loa=0;delay(240);  break; }}
    case 13:{{sang(13); loa=1; delay(260);loa=0;delay(260);  break; }}
    case 14:{{sang(14); loa=1; delay(280);loa=0;delay(280);  break; }}
    case 15:{{sang(15); loa=1; delay(300);loa=0;delay(300);  break; }}
           }
        }
    unsigned char quetphim[4]={0xFE,0xFD,0xFB,0xF7};
    //HAM Quet PHIM
    #define solanquetphim 100 
    unsigned char quetbanphim(void)
         {
    unsigned char giatribanphim;
    unsigned char x,y;
    
    for(x=0; x<4;x++)
     {
    P3=quetphim[x];// Dua lan luot cac hang xuong 0
    for(y=0;y<solanquetphim;y++)// Kiem tra solanquetphim lan
       {
    if(P3_4==0) giatribanphim=0+4*x;// Gia tri phim tuong ung
    if(P3_5==0) giatribanphim=1+4*x;// Tuy thuoc vao hang x
    if(P3_6==0) giatribanphim=2+4*x;// La may ma gia tri cua
    if(P3_7==0) giatribanphim=3+4*x;// gia tri ban phim tuong ung.
        }
     }
    return(giatribanphim);
         }
    
    
    //Hàm Main.
    void main(void)
     {
    unsigned char i;
    while(1)
      {
    i=quetbanphim();
    phim_duoc_an(i);
       }
     }
    Em đã thử sửa lại vd :case 1: { keep: {sang(1); loa=1; delay(20);loa=0;delay(20); while (1) {goto keep; } break; }} thì đèn đã giữ được trạng thái sáng, và loa (p1.7) kêu, nhưng không làm sao cho nó thoát được, nhấn phím khác thì không ăn thua.
    Đến giờ thì sao rồi bạn? đã làm được chưa?

    Comment


    • #3
      em học vi xử lí cơ bản thôi, nghành của em là Điện tử viễn thông mà Thầy cho bt ngon thật,hehe đến giờ vẫn chưa làm được,

      Comment


      • #4
        Nguyên văn bởi doublemint_1 Xem bài viết
        em học vi xử lí cơ bản thôi, nghành của em là Điện tử viễn thông mà Thầy cho bt ngon thật,hehe đến giờ vẫn chưa làm được,
        thầy có tâm quá rồi còn gì

        Comment


        • #5
          Bài này thực chất không khó nhưng cách mà bạn thực hiện làm cho bài trở lên khó mà thôi. Bạn còn bao lâu nữa để làm cái này? và đã hiểu được nhiều về 89xx chưa? biết dùng timer chưa? vì cái này nếu làm theo hướng timer thì nhẹ nhàng và đơn giản hơn rất nhiều, quét phím và quét LED bạn đổi sang dùng timer thì không cần đến delay nữa mà khi nhấn nhả phím thì "thời gian đáp ứng gần như tức thời".

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X