1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Mô phỏng 8051 : Ma trận phím 4x4 + AT89C51 + LCD

Thảo luận trong 'Vi điều khiển - Mạch Số' bắt đầu bởi admin, 11 Tháng mười một 2010.

  1. admin Administrator

    Số bài viết: 683
    Đã được thích: 64
    Điểm thành tích: 28
    Có lẽ đây sẽ là bài cuối về loạt bài "Mô phỏng 8051 trên proteus" của mình! bài này mình sẽ up code và file mô phỏng về ma trận phím 4x4 giao tiếp 8051 hiển thị lên LCD. Code này mình sưu tầm được trên mạng (đã có chỉnh sửa), và bài này mình sẽ kô trình bày chi tiết như các bài khác, dưới đây là hình mạch mô phỏng:
    [IMG]

    Đây là ma trận phím 4x4 4 hàng , 4 cột. Và theo như đoạn code dưới đây thì là điều khiển theo hàng, và việc hiển thị LCD tương ứng luôn với từng sự kiện phím được nhấn.
    Mã:
    #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
    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++;
     }
    }        
    //============================
    
    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 dieukhien(void)
        { 
        int n[5] = {0xfe,0xfd,0xfb,0xf7};
        for (i=0; i<=3;++i)
        {
        P2 = n[i];
        hienthi();
        }
        }
    
    
    //==========================================
    
    
    void main (void)
    {
    LCD_init();
    LCD_putstr("8051&MaTran Phim");
    LCDWriteCmd(0xC0);
    while(1)      
    {    
         
        dieukhien();
            delay_ms(200);
           
    }
    }
    Để cho code ngắn gọn các bạn có thể cho các hàm của LCD vào 1 file LCD.h. Còn đây là link dow file mô phỏng:
    http://www.mediafire.com/file/tyyqmtdjhr2/8051_matran_phim.rar

    opera.com
  2. nnviet New Member

    Số bài viết: 1
    Đã được thích: 0
    Điểm thành tích: 0
    Sao cái chương trình C ấy lại không chạy nhĩ,chương trình lổi,tui potay cái ni,admin giải thích rỏ hơn về cái chưong trình C ấy dc không

Chia sẻ trang này