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

        Đang tải...
        X