51单片机矩阵按键控制液晶(普中实验板)

图一是矩阵按键控制数码管,图二是LCD1206的显示,现在想在矩阵按键控制数码管的基础上改为矩阵按键控制液晶,怎样改代码
图一

img


图二

img

  • 你看下这篇博客吧, 应该有用👉 :51单片机矩阵键盘控制LCD屏幕
  • 除此之外, 这篇博客: 51单片机 LCD液晶显示模块使用中的 LCD12864模块 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 12864LCD属于点阵图形液晶显示模块,不但能显示字符,还能显示汉字和图形,分带汉字库和不带那字库两种,价格也有差别。带汉字库的12864LCD使用起来非常方便,不需要编写复杂的汉字显示程序,只要按时序写入两个字节的汉字机内码,汉字就能显示出来了,驱动程序简单许多。本文例程就是基于带汉字库的12864液晶显示模块。DM12864M 汉字图形点阵液晶显示模块,可显示汉字及图形,内置 8192 个中文汉字(16X16 点阵)、128个字符 64X256 点阵显示 RAM。

  • 您还可以看一下 朱有鹏老师的巫妖王51单片机开发板配套视频课程课程中的 LCD12864工业液晶屏小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于如何将矩阵按键控制数码管的代码改为可以控制液晶屏幕,需要进行以下步骤:

    1. 修改程序的输入部分,从矩阵按键改为使用串口输入。修改部分代码如下:
    #include <reg51.h>
    #include <intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    #define BAUDRATE 9600
    #define FOSC 11059200L
    
    void InitUart();
    
    void SendByte(uchar dat);
    
    uchar RcvByte();
    
    sbit RS=P2^6;
    sbit RW=P2^5;
    sbit EN=P2^7;
    
    sbit K1=P1^0;
    sbit K2=P1^1;
    sbit K3=P1^2;
    sbit K4=P1^3;
    
    uchar code duanma[17]={0x3f,0x06,0x5b,0x4f,0x66,
                            0x6d,0x7d,0x07,0x7f,0x6f,
                            0x77,0x7c,0x39,0x5e,0x79,
                            0x71,0x00}; //code 用于常量定义,存储在rom中的,用于存储程序的只读变量
    
    void delay(uint time)
    {
        uint i,j;
        for(i=time;i>0;i--)
        for(j=110;j>0;j--);
    }
    
    void write_8bit_com(uchar com)
    {
        RS=0;
        RW=0;
        P1=com;
        EN=1;
        EN=0;
        delay(1);
    } 
    
    void write_8bit_dat(uchar dat)
    {
        RS=1;
        RW=0;
        P1=dat;
        EN=1;
        EN=0;
        delay(1);
    }
    
    void InitLcd()
    {
        write_8bit_com(0x38); //开显示,设置16*2的显示格式,为5*7点阵
        delay(10);
        write_8bit_com(0x0c); //开显示,并且不显示光标
        delay(10);
        write_8bit_com(0x06); //设置输入方式,光标移动后自动加1
        delay(10);
        write_8bit_com(0x01); //清屏
        delay(10);
    }
    
    void write_string(uchar x,uchar y,uchar *s)
    {
        uchar i=0;
        if(x<16)
        {
            if(y) //y=1,显示第二行
                write_8bit_com(0xc0+x);
            else  //y=0,显示第一行
                write_8bit_com(0x80+x);
        }
        while(s[i]!='\0')
        {
            write_8bit_dat(s[i]);
            i++;
        }
    }
    
    void display_number(int num)
    {
        uchar i;
        uchar wei[8]={0};
        if(num<0)
        {
            write_8bit_dat('-');
            num=-num;
        }
        for(i=0;i<8;i++)
        {
            wei[7-i] = num % 10;
            num /= 10;
            if(num == 0)
                break;
        }
        for(;i<8;i++)
            wei[7-i]=0;
        for(i=0;i<8;i++)
        {
            if(wei[i]==0&&i<7) //添加空格,使数字对齐
                write_8bit_dat(' ');
            else
                write_8bit_dat(wei[i]+'0');
        }
        write_8bit_dat(' ');
    }
    
    void main()
    {
        InitUart();
        InitLcd();
        while(1)
        {
            uchar c;
            int num;
            write_string(0,0,"Input a number:");
            num=0;
            while(1)
            {
                c=RcvByte();
                if(c=='\r') //等待回车符,表示输入结束
                    break;
                if('0'<=c&&c<='9') //只接受数字
                {
                    num=num*10+(c-'0');
                    display_number(num);
                }
            }
            write_string(0,1,"The number you input:");
            display_number(num);
            delay(1000);
            write_8bit_com(0x01); //清屏
        }
    }
    
    void InitUart()
    {
        SM0=0;
        SM1=1;
        TMOD|=0x20;
        TH1=256-(FOSC/(12*32*BAUDRATE));
        TR1=1;
        REN=1;
        EA=1;
        ES=1;
        TI=1;
    }
    
    void SendByte(uchar dat)
    {
        SBUF=dat;
        while(!TI);
        TI=0;
    }
    
    uchar RcvByte()
    {
        uchar c;
        while(!RI);
        RI=0;
        c=SBUF;
        SendByte(c); //将接收到的字节回送给PC
        return c;
    }
    
    void Uart() interrupt 4
    {
        if(RI)
            RI=0;
        if(TI)
            TI=0;
    }
    
    1. 修改程序的输出部分,从数码管切换到液晶屏。修改部分代码如下:
    void display_number(int num)
    {
        uchar i;
        uchar wei[8]={0};
        if(num<0)
        {
            write_8bit_dat('-');
            num=-num;
        }
        for(i=0;i<8;i++)
        {
            wei[7-i] = num % 10;
            num /= 10;
            if(num == 0)
                break;
        }
        for(;i<8;i++)
            wei[7-i]=0;
        for(i=0;i<8;i++)
        {
            write_8bit_dat(duanma[wei[i]]); //液晶屏使用数码管显示码表
        }
        write_8bit_dat(' ');
    }
    
    void main()
    {
        InitUart();
        InitLcd();
        while(1)
        {
            uchar c;
            int num;
            write_string(0,0,"Input a number:");
            num=0;
            while(1)
            {
                c=RcvByte();
                if(c=='\r') //等待回车符,表示输入结束
                    break;
                if('0'<=c&&c<='9') //只接受数字
                {
                    num=num*10+(c-'0');
                    display_number(num);
                }
            }
            write_string(0,1,"The number you input:");
            display_number(num);
            delay(1000);
            write_8bit_com(0x01); //清屏
        }
    }
    

    通过将数字和数码管的显示码表对应起来,就可以在液晶屏上显示数字了。以上两部分代码需要搭配使用,才能实现正确的功能。