weixin_43331927 2020-03-11 20:47 采纳率: 0%
浏览 1015

LCD12864不显示,求教程序问题出在哪

程序下载之后:

图片说明

电路:

图片说明

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS = P3^6;                    //LCD12864寄存器选择位
sbit RW = P3^7;                    //LCD12864读写控制口
sbit SCLK = P3^4;                    //LCD12864使能控制口

//************************延时************************//
void delayms(uint x)                    //延时程序
{
    uint m,n;
    for(m=0;m<x;m++)
        for(n=0;n<110;n++);
}

//********************LCD12864模块**********************//
void write_cmd(uchar zhiling)           //写指令
{
    RS = 0;
    RW = 0;                      //同时为0,可写入指令
    SCLK = 0;                   //E从0跳变到1,进行写指令
    delayms(5);
    P2 = zhiling;               //数据送入P2,写入指令
    delayms(5);
    SCLK = 1;                   //E从0跳变到1,进行写指令
    delayms(5);
    SCLK = 0;                   //E从1跳到0,LCD开始执行命令
}
void write_data(uchar shuju)            //写数据
{
    RS = 1;
    RW = 0;                             //写入数据
    SCLK = 0;
    delayms(5);
    P2 = shuju;                         //数据写入LCD
    delayms(5);
    SCLK = 1;
    delayms(5);
    SCLK = 0;                           //LCD开始执行命令
}
void LCD_init()                         //LCD初始化
{
    write_cmd(0x30);            //设置8位并行口,基本指令集
    delayms(10);
    write_cmd(0x30);                    //再次设置
    delayms(10);
    write_cmd(0x0c);                    //显示开,光标关
    delayms(10);
    write_cmd(0x01);                    //清除LCD显示
    delayms(10);                            
}

void LCDPos(uchar x,uchar y)            //定义LCD显示地址
{
    uchar pos;
    if(x == 1)                          //第一行
    {
        x = 0x80;
    }else if(x == 2)                    //第二行
    {
        x = 0x90;
    }else if(x == 3)                    //第三行
    {
        x = 0x88;
    }else if(x == 4)                    //第四行
    {
        x = 0x98;
    }
    pos = x + y - 1;
    write_cmd(pos);
}

void write_str(unsigned char *str)      //显示数组
{
        while(*str != "")
        {
                write_data(*str++);
                delayms(5);
        }
}
void LCD_display()                      //LCD显示
{
    while(1)
    {
        LCDPos(1,1);                    //第一行显示
        write_str("速度:");
        delayms(10);
        LCDPos(2,1);                    //第二行显示
        write_str("里程:");
        delayms(10);
        LCDPos(3,1);                    //第三行显示
        write_str("热量消耗:");
        delayms(10);
        LCDPos(4,1);                    //第四行显示
        write_str("骑行时间:");
        delayms(500);
     }
}

//**************************主函数************************//
void main()
{
    LCD_init();
    delayms(10);
    TMOD = 0x01;                        //设置定时器工作方式1
    EA = 1;                          //开总中断                           
    ET0 = 1;                            //开T1定时器0中断
    TR0 = 1;                            //开定时器0
    while(1);
}

//*************************中断**************************//
void EX0_INT(void) interrupt 1          
{
    LCD_display();            
}


  • 写回答

1条回答 默认 最新

  • luoyesuifengfei 2020-03-14 14:52
    关注

    原理图显示使用的并行通信,屏幕的psb应该为高电平或者在屏幕背面选自短接P点的跳线

    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题