Thông báo

Collapse
No announcement yet.

giúp em quét phím 4x3 hiển thị LCD với!!!!!!!!!!

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

  • giúp em quét phím 4x3 hiển thị LCD với!!!!!!!!!!

    em là dân mới vào nghề,em muốn quét bàn phím 3x4 hiển thị lên LCD các số 1,2,3...11
    sau 1 đêm loay hoay chỉnh sửa kết quả là em vẫn ko thể hiển thị chinh xác đc.
    mong mọi người giúp em với
    #include<reg52.h>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<intrins.h>
    #include<stdlib.h>
    sbit RS = P3^0;
    sbit RW = P3^1;
    sbit EN = P3^2;
    sbit cot0= P1^0;
    sbit cot1= P1^1;
    sbit cot2= P1^2;
    sbit hang0=P1^4;
    sbit hang1=P1^5;
    sbit hang2=P1^6;
    sbit hang3=P1^7;
    sbit led =P3^4;
    char m_hang[4];
    char m_cot[3];
    char quet[3]={0xfe,0xfd,0xfb};
    unsigned long str;
    unsigned long d=0;
    char x;
    void tre(unsigned long t){
    unsigned int i;
    for(i=0;i<=t;i++);
    }
    void delay_short(){
    unsigned int i;
    for(i=0;i<=3;i++);
    }
    void delay(void)
    {
    TMOD = 0x01; //Timer 0 che do 1
    TH0 = (65536-30000)/256;
    TL0 = (65536-30000)%256;
    TR0 = 1;
    while (!TF0);
    TR0 = 0;
    TF0 = 0;
    }
    void ktra_coban(){
    P2 = 0xff; // P2 muc cao LCD dang hoat dong;
    RS = 0; // Chon thanh ghi lenh
    RW = 1; // Doc tu LCD
    do {
    EN = 1; // Cho phep
    delay_short();
    EN = 0;
    x=P2;
    x=x&0x80; // Xoa 7 bit thap cua P2;
    }
    while(x==0x80);
    }
    void ghi_lenh(unsigned char command){
    ktra_coban();
    delay();
    P2 = command;
    RS = 0; //Chon thanh ghi lenh
    RW = 0; //ghi vao LCD
    EN = 1;
    delay_short();
    EN = 0;
    }
    void ghi_kytu(unsigned char kytu){
    ktra_coban();
    delay();
    P2 = kytu;
    RS = 1; // Chon thanh ghi du lieu
    RW = 0; // Ghi vao LCD
    EN =1;
    delay_short();
    EN = 0;
    }
    void ghi_chuoi(char *s){
    while(*s){
    ghi_kytu(*s);
    s++;
    }
    }
    void init(){ //khoi tao LCD
    ghi_lenh(0x01); //xoa man hinh,dua tro ve dau
    ghi_lenh(0x38); //che do 8bit,2dong
    ghi_lenh(0x06); //hien thi tang
    ghi_lenh(0x0e); //bat hien thi,con tro,tat nhay tro
    }
    void write_number(unsigned long number){ //Ham tao mot day so dem;
    int j,i;
    unsigned char array[12]; //Day 12 phan tu tren mot dong;
    for(j=0 ; j<12 ; j++)
    {
    array[j] = number%10; //chia lay du roi thuc hien dua vao mang
    number /= 10;
    if(number==0)
    {
    i=j;
    break;
    }
    }
    for(j=i ; j>=0 ; j--){ //Hien thi tu trai qua;
    ghi_kytu(array[j]+0x30); // cong ma ASCII hien thi len LCD
    }
    }
    void main()
    { unsigned char i,j,k;
    init();
    ghi_lenh(0x01);
    ghi_lenh(0x80);
    ghi_chuoi("so:");
    while(1)
    { led=0;
    hang0=1;
    hang1=1;
    hang2=1;
    hang3=1;
    m_hang[0]=hang0;
    m_hang[1]=hang1;
    m_hang[2]=hang2;
    m_hang[3]=hang3;
    k=0xfe;
    for(i=0;i<=2;i++)
    {
    P1=quet[i];
    //P1=k;
    //k=_crol_(k,1);
    for(j=0;j<=3;j++)
    {
    if(m_hang[j]==0)
    {
    led=1;
    str=j*3+i;
    write_number(str);
    tre(5000);
    }
    }
    }
    }}
    mophong:
    111111.rar

  • #2
    Bạn tham khảo code phím 4x4 hiển thị LCD này nha !

    #include <AT89X51.H>
    #include <stdio.h>
    #include<string.h>

    #define RS P3_5
    #define RW P3_6//RW=0 => ghi
    #define EN P3_7//RW=1 => doc
    //RS=0 => code
    //RS=1 => data
    #define LCD_PORT P1

    #define H1 P2_0
    #define H2 P2_1
    #define H3 P2_2
    #define H4 P2_3
    #define C1 P2_4
    #define C2 P2_5
    #define C3 P2_6
    #define C4 P2_7
    #define keyport P2 //keypad connected to P2
    #define TRUE 1 //some defines
    #define FALSE 0
    unsigned char i,k;
    //===========================
    void delay_ms(int n)
    {
    int k,j;
    for(k=0;k<n;k++)
    {
    for(j=0;j<500;j++);
    }

    }
    //=========================
    //==========================
    void delay_5ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<4;j++){}
    }
    //===========================
    void delay_15ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<100;j++){}
    }
    //============================
    void LCDWriteCmd(unsigned char c) //CT con ghi du lieu len LCD
    {
    RS=0;
    RW=0;
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //==============================
    void LCDWriteData(unsigned char c) //CT con doc du lieu tu LCD
    {
    RS=1;
    RW=0;
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //=============================
    void LCDcursorxy(int x, int y)
    {
    if((x<1||x>2)&&(y<1||y>16))
    {
    x=1;
    y=1;
    }
    if(x == 1)
    LCDWriteCmd(0x7F+y);
    else
    LCDWriteCmd(0xBF+y);
    }
    //===============================
    void LCD_init() // Khoi tao LCD
    {
    delay_15ms();

    LCDWriteCmd(0x38);
    LCDWriteCmd(0x0C);
    // LCDWriteCmd(0x06);
    LCDWriteCmd(0x01); // Xoa man hinh LCD
    }
    //================================
    void LCD_clear()
    {
    LCDWriteCmd(0x01);
    }
    //===============================
    void LCD_home()
    {
    LCDWriteCmd(0x80);
    }
    //=============================
    void LCD_putstr(unsigned char *s)
    {
    while (*s)
    {
    LCDWriteData(*s);
    s++;
    }
    }
    //============================
    //==********HAM DOC PHIM*************==//
    /*unsigned char DocPhim(void)
    {
    unsigned char phimnhan,dem,chot;
    phimnhan=0;
    chot=128;
    dem=4;
    while(dem--)
    {
    P2 = ~chot;
    if(!H1)
    {

    delay_ms(500);
    phimnhan=dem+1;
    delay_ms(500);
    }
    else if(!H2)
    {
    delay_ms(500);
    phimnhan=dem+5;
    delay_ms(500);;
    }
    else if(!H3)
    {
    delay_ms(500);
    phimnhan=dem+9;
    delay_ms(500);
    }
    else if(!H4)
    {
    delay_ms(500);
    phimnhan=dem+13;
    delay_ms(500);
    }
    chot>>1;
    }
    return phimnhan;
    } */
    /*unsigned char QuetPhim()
    {
    P2=0x0f;
    if((!H1)|(!H2)|(!H3)|(!H4))
    {
    if(H1==0)
    {
    P2=0xfe;
    if(!C1) sttphim=0;
    if(!C2) sttphim=1;
    if(!C3) sttphim=2;
    if(!C4) sttphim=3;
    }
    }
    } */
    void hienthi()
    {
    if(P2==0xee){LCDWriteCmd(0x01);
    LCDWriteCmd(0xC0);
    LCD_putstr(" phim so 1 ");
    P3=0xf1;}

    if(P2==0xde){LCDWriteCmd(0x01);
    LCDWriteCmd(0xC0);
    LCD_putstr(" \n phim so 2 ");P3=0xf2;}

    if(P2==0xbe){LCDWriteCmd(0x01);
    LCDWriteCmd(0xC0);
    LCD_putstr(" phim so 3 ");}

    if(P2==0x7e){LCDWriteCmd(0x01);
    LCDWriteCmd(0xC0);
    LCD_putstr(" phim so 4 ");}

    if(P2==0xed){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 5 ");}

    if(P2==0xdd){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 6 ");}

    if(P2==0xbd){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 7 ");}

    if(P2==0x7d){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 8 ");}

    if(P2==0xeb){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 9 ");}

    if(P2==0xdb){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 10 ");}

    if(P2==0xbb){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 11 ");}

    if(P2==0x7b){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 12 ");}

    if(P2==0xe7){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 13 ");}

    if(P2==0xd7){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 14 ");}

    if(P2==0xb7){LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr(" phim so 15 ");}

    if(P2==0x77)
    {
    LCDWriteCmd(0x01);
    LCDWriteCmd(0xC0);
    LCD_putstr(" phim so 16 ");}



    }
    //===========================
    /*void HienThiLCD(unsigned char key)
    {
    if(key<10)
    {
    LCDWriteData(key +48);
    }
    else
    {
    LCDWriteData(key/10 +48);
    LCDWriteData(key%10 +48);
    }

    } */
    void dieukhien(void)
    {
    int n[5] = {0xfe,0xfd,0xfb,0xf7};
    for (i=0; i<=3;++i)
    {
    P2 = n[i];
    hienthi();
    }
    }
    /*Lenh cuon tang tuyen tinh

    k = 0xfe;
    for(i=0;i<=3;++i)
    {
    P0 = k;
    k = _crol_(k,1);
    } */

    //==========================================


    void main (void)
    {
    LCD_init();
    LCD_putstr("8051&MaTran Phim");
    LCDWriteCmd(0xC0);
    while(1)
    {
    //key = quetphim();
    //key = get_key();
    //if(key)
    // {


    // LCD_putstr("Phim so:");
    dieukhien();
    delay_ms(200);
    //}
    }
    }

    Comment


    • #3
      nhìn code muốn sửa cho lắm nhưng chả onl đc lâu. mình gợi ý bạn lên machdientu.net có 1 mục về keypad 4x4 có cái ví dụ về phím bấm y sì thế này, có thể lấy tham khảo và về kiểm tra lại xem code mình lỗi ở đâu, hoặc có thể tham khảo đoạn code sau, mình đã chú thích trong code hết rồi, nhìn code có thẻ hình dung được cách nối ma trận phím
      void scan_matrix(void) //hàm quét bàn phím 4x4, cái này hôm nào gặp anh giải thích cụ thể cho dễ hiểu, còn giờ hiểu đc bn thì hiểu
      {
      unsigned char i,Key;
      i=1;
      i=i<<row; // dịch biến i đi row bit(row là 1 biến chạy từ 0 đến 3), nó giống như lệnh RCL trong vi xử lý, ví dụ 11110101 dịch 1 sẽ thành 11101010, 2 bít thành 11010100
      MATRIX=~i; // dấu ~ nghĩa là đảo bít, ví dụ 11001101 đảo thành 00110010
      delay(2); // tạo trễ 1 chút cho mạch
      Key=MATRIX&0xf0;// biến key dùng để kiểm tra bàn phím
      if(Key!=0xf0) // khi key khác 0xF0 tức là 4 bit cao nhất của P0 có 1 bít khác 1 có nghĩa là đã có 1 phím được nhấn, còn ko có phím nào được ấn thì P0=0xF0
      {
      delay(5000);//hàm tạo trễ, hàm này chỉ tầm vài micro giây
      while((MATRIX&0xf0)!=0xf0);// khi ấn phím sau đó nhả phím ra mới được coi là 1 thao tác ấn phím, tránh trường hợp giữ phím quá lâu gây ra hiện tượng máy nhận nhiều dữ liệu, ở đây hàm chờ cho biến key trở về =0xF0 nghĩa là phím đã được nhả ra
      delay(5000);//tạo trễ
      if(Key==0xe0) col = 0; //xác định được cột tương ứng được nhấn
      if(Key==0xd0) col = 1;
      if(Key==0xb0) col = 2;
      if(Key==0x70) col = 3;
      test=1;// biến này báo rằng đã quét hoàn thành 1 phím và cho phép thoát khỏi hàm quét
      }
      else
      {
      row++; //tăng row tức là hàng lên 1 giá trị để quét hàng khác, anh sẽ gửi nguyên lý quét cụ thể cho và hôm nào giảng thêm
      test=0;//báo rằng chưa quét phím nào và tiếp tục quét
      }
      if (row>3) row=0;//chỉ quét tất cả 4 lượt vì bàn phím dạng 4x4, lên biến hàng row =3 sau đó nếu lớn hơn lại chuyển về =0 quét lại
      }
      MATRIX: là 1 cổng vdk, bạn gắn cổng nào cũng đc
      p/s: code này là trước làm đồ án thuê nên viết giải thích rõ ràng
      Last edited by mast090; 29-03-2012, 09:09.
      Website chính thức đổi địa chỉ website thành
      Mời các bạn ghé thăm !!!

      Comment


      • #4
        cảm ơn 2 anh nhiều. em đã làm đc rùi,hihihi

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        • bqviet
          Trả lời cho Đấu tắt điện cho máy tính bảng
          bởi bqviet
          Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
          06-12-2025, 17:17
        • nguyendinhvan
          Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
          bởi nguyendinhvan
          Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
          05-12-2025, 19:59
        • afrendly
          Trả lời cho Đấu tắt điện cho máy tính bảng
          bởi afrendly
          Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
          04-12-2025, 01:27
        • nick22
          Trả lời cho Máy điện châm ?
          bởi nick22
          Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
          01-12-2025, 13:23
        Đang tải...
        X