Thông báo

Collapse
No announcement yet.

Máy tính điện tử hiển thị LCD16x2

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

  • Máy tính điện tử hiển thị LCD16x2

    Máy tính bỏ túi là một công cụ học tập quen thuộc củahọc sinh, sinh viên, đặt biệt là sinh viên kỹ thuật. Trong đời sống hàng ngày, nó là một vật cần thiết cho việc tính tiền trong các vụ mua bán. Trong sản xuất, nó được dùng để tính toán số sản phẩm làm ra. Và còn rất nhiều ứng dụng khác của máy tính bỏ túi, cho thấy sự phổ biến, cần thiết của nó
    Bài Viết dưới đây tôi xon trình bày về lưu đồ thuật toán và code chương trình thực hiện chức năng tính toán +,-,*,% tronh máy tính .

    Lưu đồ giải thuật cho khối nhập dữ liệu (ma trận phím)

    Với giải thuật quét cả hàng và cột để tìm ra phím được nhấn.

    Lưu đồ giải thuật quét các hàng của ma trận phím


    Lưu đồ giải thuật cho khối hiển thị (LCD):



    Lưu đồ giải thuật cho khối xử lý (VDK):








    Code chương trình:

    #include <REGX52.H>

    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define RS P3_0
    #define RW P3_1 //RW=0 => ghi
    #define EN P3_2 //RW=1 => doc
    //RS=0 => code
    //RS=1 => data
    #define LCD_PORT P0
    sbit cot0=P2^0;
    sbit cot1=P2^1;
    sbit cot2=P2^2;
    sbit cot3=P2^3;
    sbit hang0=P2^4;
    sbit hang1=P2^5;
    sbit hang2=P2^6;
    sbit hang3=P2^7;
    int sttphim;
    unsigned char dau;


    void wait(void)
    {
    long n = 0;
    EN=1;// Dua chan cho fep len cao
    RS=0;// Chon thanh ghi lenh
    RW=1;// Doc tu LCD
    LCD_PORT=0xFF;// Gia tri 0xFF
    while(1){n++; if(n>100) break;}// Kiem tra co ban
    // Neu ban dem n den 100 roi thoat khoi while
    EN=0;// Dua xung cao xuong thap de chot
    RW=0;// Doc tu LCD
    }

    void delay(long time) /* ham delay */
    {
    long n;
    for(n=0;n<time;n++)
    {;}
    }


    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)
    {
    RS=0;
    RW=0;
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();

    }

    void LCDWriteData(unsigned char c)
    {
    RS=1;
    RW=0;
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay(1000);
    }


    void LCD_init()
    {
    delay_15ms();
    LCDWriteCmd(0x30); //che do 8 bit
    LCDWriteCmd(0x30);
    LCDWriteCmd(0x30);

    LCDWriteCmd(0x38); //hien thi 2 dong
    LCDWriteCmd(0x0C); //bat con tro
    // LCDWriteCmd(0x06); //dich con tro sang ben phai
    LCDWriteCmd(0x01); // Xoa man hinh LCD
    }

    void LCD_clear()
    {
    LCDWriteCmd(0x01);
    }

    void LCD_home()
    {
    LCDWriteCmd(0x80); //ep con tro ve dau dong
    }

    void LCD_putstr(unsigned char *s)
    {
    while (*s)
    {
    LCDWriteData(*s);
    s++;

    }
    }

    void LCDwritei(long d)
    { unsigned int i,j;
    unsigned char a[7];
    a[6]=d%10;
    d=d/10;
    a[5]=d%10;
    d=d/10;
    a[4]=d%10;
    d=d/10;
    a[3]=d%10;// Chia lay phan du, duoc chu so hang don vi
    d=d/10;// Chia lay phan nguyen, duoc nhung chu so da bo hang don vi
    a[2]=d%10;// Duoc chu so hang chuc
    d=d/10;// Nhung chu so da bo hang don vi va hang chuc
    a[1]=d%10;// Duoc hang tram
    d=d/10;// Duoc chu so da bo hang don vi, chuc, tram
    a[0]=d%10;// Duoc hang ngan

    for(i=0;i<7;i++)
    {
    if(a[i]!=0)
    break;
    }
    for(j=i;j<7;j++)
    {
    LCDWriteData(48+a[j]);
    }
    }


    /***************************Ham quet phim************************/

    void quetphim()
    { int y;
    P2=0x0f;
    if((!cot0)|(!cot1)|(!cot2)|(!cot3))
    {
    for(y=0;y<5000;y++){
    if(cot0==0) //neu la hang 0
    {
    hang0=1;
    hang1=1;
    hang2=1;
    hang3=1;
    cot0=0;
    if(!hang0) sttphim=0;
    if(!hang1) sttphim=1;
    if(!hang2) sttphim=2;
    if(!hang3) sttphim=3;

    }
    else if(cot1==0) //neu la hang 1
    {
    hang0=1;
    hang1=1;
    hang2=1;
    hang3=1;
    cot1=0;
    if(!hang0) sttphim=4;
    if(!hang1) sttphim=5;
    if(!hang2) sttphim=6;
    if(!hang3) sttphim=7;

    }
    if(cot2==0)
    {
    hang0=1;
    hang1=1;
    hang2=1;
    hang3=1;
    cot2=0;
    if(!hang0) sttphim=8;
    if(!hang1) sttphim=9;
    if(!hang2) dau='+';
    if(!hang3) dau='-';
    }
    if(cot3==0)
    {
    hang0=1;
    hang1=1;
    hang2=1;
    hang3=1;
    cot3=0;
    if(!hang0) dau='*';
    if(!hang1) dau='/';
    if(!hang2) dau='C';
    if(!hang3) dau='=';
    }
    }
    }
    }

    /**************************Chương tr?nh chính***********************/


    void main(void)
    { long fnumber;
    long lnumber;
    long result,sodu,dev;
    unsigned char sign;
    unsigned char hienthi;
    int i,kt,j;
    kt=0;
    i=0;

    LCD_init();
    LCDWriteCmd(0x01);
    LCDWriteCmd(0x80);
    LCD_putstr("CALCULATOR VER 1");


    while(1)
    {
    dau='w';
    sttphim=10;
    quetphim();
    if(sttphim!=10)
    {

    if(kt==0){
    if(i==0)
    {LCD_clear();}
    fnumber=fnumber*10+sttphim;
    i=1;
    }
    else{

    lnumber=lnumber*10+sttphim;

    }
    hienthi=sttphim+48;
    LCDWriteData(hienthi);
    }
    else
    {
    switch(dau)
    {

    case 'C':
    {
    LCDWriteCmd(0x01);
    break;
    }

    case '+':
    {
    LCDWriteData(dau);

    kt=1;
    sign='+';

    break;
    }
    case '-':
    {
    LCDWriteData(dau);
    kt=1;
    sign='-';


    break;
    }
    case '*':
    {
    LCDWriteData(dau);
    kt=1;
    sign='*';


    break;
    }
    case '/' :
    {
    LCDWriteData(dau);
    kt=1;
    sign='/';


    break;
    }
    case '=' :
    {
    if(sign=='+')
    {
    LCDWriteData(dau);
    result = fnumber+lnumber;
    LCDwritei(result);
    kt=0;
    fnumber=0;
    lnumber=0;
    i=0;
    }
    else if(sign=='-')
    {
    LCDWriteData(dau);
    if(fnumber>lnumber)
    result = fnumber-lnumber;
    else{
    LCDWriteData('-');
    result = lnumber-fnumber;
    }
    LCDwritei(result);
    kt=0;
    fnumber=0;
    lnumber=0;
    i=0;
    }
    else if(sign=='*')
    {
    LCDWriteData(dau);
    result = fnumber*lnumber;
    LCDwritei(result);
    kt=0;
    fnumber=0;
    lnumber=0;
    i=0;
    }
    else if(sign=='/')
    {
    LCDWriteData(dau);
    if(lnumber==0)
    {
    LCDWriteCmd(0x01);
    LCD_putstr("ERROR");
    }
    else
    {
    result = fnumber/lnumber;
    LCDwritei(result);
    sodu = fnumber%lnumber;
    }
    if(sodu!=0)
    {
    LCDWriteData(',');
    for(j=0;j<5;j++)
    {

    dev=(sodu*10)/lnumber;
    LCDwritei(dev);
    dev=(sodu*10)%lnumber;
    sodu=dev;
    }
    kt=0;
    fnumber=0;
    lnumber=0;
    i=0;
    }
    else
    {
    kt=0;
    fnumber=0;
    lnumber=0;
    i=0;
    }
    }
    else

    break;
    }
    default :
    break;
    }
    }

    }
    }
    Còn đấy là Video sản phẩm


    Mình mong bài viết này sẽ giúp đỡ được các bạn nhiều hơn trong quá trình làm việc với VĐK.Nếu có nhu cầu tìm hiểu nhiều hơn nữa về các dòng VĐK và các kiến thức điện tử khác các có thể ghé thăm website của mình để tham khảo.
    Máy tính điện tử hiển thị Lcd16x2
    Thanks!

  • #2
    mình góp ý như sau, về thuật toán quét bàn phím của bạn ko tối ưu lắm. khá là dài. vs ma trận 4x4 bạn xét 4 cột như thế kia thì đúng nhưng ko nên. bạn cho vào vòng lặp 4 lần sẽ gọn gàng hơn. nhưng cái chính là mình có xem qua code, dường như code chưa có đoạn thông báo 1 số lỗi cơ bản ví dụ như chia cho 0 chẳng hạn, hay phép trừ có âm...
    Website chính thức đổi địa chỉ website thành
    Mời các bạn ghé thăm !!!

    Comment


    • #3
      @@ cho code vào thẻ đi cậu.. xem hoa cả mắt

      Comment


      • #4
        cảm ơn bạn đã đóng góp ý kiến.đúng lá như vậy dùng vòng lặp sẽ tối ưu hơn.mình sẽ cố gắng cải tiến trong thời gian sớm nhất .thanks

        Comment


        • #5
          Cho Em hỏi đây là làm với con VĐk gì đấy ạ.

          Comment


          • #6
            Nguyên văn bởi ketamthuong Xem bài viết
            Cho Em hỏi đây là làm với con VĐk gì đấy ạ.
            VĐK 89xx đó
            Nick yahoo: nguyenphuocho
            Mail:
            Web:
            PICKIT2

            Comment


            • #7
              Cộng thêm là Anh làm việc với phần mềm lập trình nào, ngôn ngữ nào ạ. Bản Isis Anh dùng là bản bao nhiêu ạ. Em hơi gà. Nếu được Anh có thể hướng dẫn em thêm không ạ. Hì hì. Cảm ơn anh.
              Mail: ducthuanpham@gmail.com

              Comment


              • #8
                các anh chị giải thích cho em cái dòng lệnh này vơi! theo em biết thì đây là đoạn để dưa ra 1 số : nhưng em ko hiểu cái if(kt==0) hay là cái if(i=0) có ý nghĩa gì !
                while(1)
                {
                dau='w';
                sttphim=10;
                quetphim();
                if(sttphim!=10)
                {

                if(kt==0){
                if(i==0)
                {LCD_clear();}
                fnumber=fnumber*10+sttphim;
                i=1;
                }
                else{

                lnumber=lnumber*10+sttphim;

                }
                hienthi=sttphim+48;
                LCDWriteData(hienthi);

                Comment


                • #9
                  code dai quá bạn ak`..sử dụng lặp ngắn hơn nhìu..! thank post bài

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X