找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1014|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机关于12864液晶按键串行显示字符和清屏的程序帮忙看看有什么错误

[复制链接]
跳转到指定楼层
楼主
ID:986164 发表于 2021-11-30 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>                                                 //52系列单片机头文件
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char                                //宏定义
#define uint  unsigned int
#define LCD_data P1                                                //数据口
uchar i;
sbit key1=P3^0;
sbit key2=P3^1;
sbit LCD_PSB=P3^4;                                                //串行,并行选择接口
sbit LCD_CS=P3^5;                                            //串行片选信号
sbit LCD_SID=P3^6;                                                //串行数据输入
sbit LCD_SCLK=P3^7;
void lcd_sbyte();                                                //串行时钟
uchar code dis1[]={"物电创新基地"};
uchar code dis2[]={"姓名;刘冰冰"};
uchar code dis3[]={"202107044138"};
uchar code dis4[]={"xzxdbb"};
void keyscan();                                                        //函数声明
//void delay_1ms(uint x);
void delayms(uint xms);
void lcd_sbyte();                                                                         
void write_cmd(uchar cmd);
void write_dat(uchar dat);
void lcd_init();                                                //LCD初始化设定
void lcd_pos(uchar x,uchar y);
void main()                                                                //主函数
{
        lcd_init();                                                        //调用清屏函数
        while(1)
        keyscan();
                                                                              //循环执行按键扫描函数
}
void keyscan()                                                         //按键循环函数
{
        uchar i;                                                               
        if(key1==0)                                                          //按键1开始,程序检测key1==0,执行下面的指令
        {  
                delayms(10);                                          //按键去抖延时
                if(key1==0)
                {
                        lcd_pos(0,0);                                  //设置显示位置为第一行的第一个字符                       
                        i=0;
                        while(dis1[i]!='\0')                  //当查到空字符时退出循环
                        {                                                                                 
                                write_dat(dis1[i]);                  //显示字符
                                i++;
                        }
                        lcd_pos(1,0);                                       //设置显示位置为第二行的第一个字符
                        i=0;
                        while(dis2[i]!='\0')                        //当查到空字符时退出循环
                        {
                                write_dat(dis2[i]);                        //显示字符
                                i++;
                        }
                        lcd_pos(2,0);                                        //设置显示位置为第三行的第一个字符
                        i=0;
                        while(dis3[i]!='\0')                        //当查到空字符时退出循环
                        {
                                write_dat(dis3[i]);                        //显示字符
                                i++;
                        }
                        lcd_pos(3,0);                                        //设置显示位置为第四行的第一个字符
                        i=0;
                        while(dis4[i]!='\0')                        //当查到空字符时退出循环
                        {
                                write_dat(dis4[i]);                        //显示字符
                                i++;
                        }
                }

        }
        if(key2==0)                                                                //程序检测key2==0,执行下面的指令
        {  
                delayms(10);                                                //按键去抖延时
                if(key2==0)
                {
                        LCD_PSB=0;                                                //串口方式
                        write_cmd(0x01);                                //清除LCD显示内容

                }
         
         }
}
void delayms(uint xms)                        //延时函数
{
        int i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);                                 
}
void lcd_sbyte(uchar by)            //输出串行数据
{
        uchar s;
        for(s=0;s<8;s++)
        {
                LCD_SID=by&0x80;                //将by的最高位取出来赋给SID
                by=by<<1;                                //依次将by的每一位从高到低在SCLK的作用送给SID
                LCD_SCLK=0;                                //输入数据
                LCD_SCLK=1;
        }
}       
void write_cmd(uchar cmd)                //写指令数据到LCD
{       
        LCD_CS=1;
        lcd_sbyte(0Xf8);                        //发送指令
        lcd_sbyte(cmd&0xf0);                //将所发送字节的高四位取出,低四位补0
        lcd_sbyte(cmd<<4);                    //将所发送的字节低四位移到高四位的位置上,原来的低四位自动补0
        LCD_SCLK=0;                                        //输入数据
        LCD_SCLK=1;
        LCD_CS=1;
        delayms(100);
}
void write_dat(uchar dat)                //写显示数据到LCD
{       
        LCD_CS=1;
        lcd_sbyte(0Xfa);                        //发送数据
        lcd_sbyte(dat&0xf0);                //将所发送字节的高四位取出,低四位补0
        lcd_sbyte(dat<<4);                        //将所发送的字节低四位移到高四位的位置上,原来的低四位自动补0
        LCD_SCLK=0;                                        //输入数据
        LCD_SCLK=1;
        LCD_CS=0;
        delayms(100);

}
void lcd_pos(uchar x,uchar y)        //设定显示位置
{
        uchar pos;
        switch(x)
        {                                                        //x的范围为0-3,y的范围为0-7
                case 0: x=0x80;break;
                case 1: x=0x90;break;
                case 2: x=0x88;break;
                case 3: x=0x98;break;
                default: break;
        }
        pos=x+y;
        write_cmd(pos);                             //显示地址
}
//void lcd_init()                                //LCD初始化设定
//{
//        LCD_PSB=0;                                        //串口方式
//        write_cmd(0x30);                        //基本指令操作
//        delayms(5);                                                       
//        write_cmd(0x0c);                        //显示开,关光标
//        delayms(5);
//        write_cmd(0x01);                        //清除LCD显示内容
//        delayms(5);
//}
void lcd_init()
{
        delayms(5);
        write_cmd(0x30);                        //基本指令操作
        write_cmd(0x02);
        write_cmd(0x06);
        write_cmd(0x0c);
        write_cmd(0x01);
        write_cmd(0x80);
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2021-11-30 18:23 | 只看该作者
编译器提示的什么错误,贴图看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表