找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机最小系统板 12864液晶无法显示 求解决

查看数: 11723 | 评论数: 11 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2014-10-3 22:12

正文摘要:

51单片机最小系统板 如图,写入程序后12864液晶无法显示,已经试过多次了。。唉。。    付上程序,看看哪时不行了?? #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P2^ ...

回复

ID:147415 发表于 2017-9-7 16:16
rst没有强制复位一次
ID:109647 发表于 2016-3-19 10:39
dgahz 发表于 2014-11-5 22:57
程序一点问题都没有,只改了3根控制线,正常显示。

你好  我也是这个程序  出的问题  请问您改了哪三根控制线?
ID:66729 发表于 2014-11-15 19:38
wyy450y 发表于 2014-11-8 21:26
是你接口没整清楚吧

已经正常,换个程序就好了。。呵呵
ID:68253 发表于 2014-11-8 21:26
是你接口没整清楚吧
ID:66840 发表于 2014-11-6 08:35
程序里由很多没加分号
ID:67992 发表于 2014-11-5 22:57
程序一点问题都没有,只改了3根控制线,正常显示。

评分

参与人数 1威望 +50 收起 理由
admin + 50

查看全部评分

ID:66729 发表于 2014-10-10 22:03
HEX文件

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 共享资料的积分奖励!

查看全部评分

ID:66729 发表于 2014-10-10 22:01
这个是我的板子上能正常显示的程序,你也可以改一下接口或者显示的字体。
//头文件:
#include <reg52.h>

/********IO引脚定义***********************************************************/
sbit LCD_RS=P2^3;//定义引脚
sbit LCD_RW=P2^4;
sbit LCD_E=P2^5;
sbit PSB =P2^6;                //PSB脚为12864-12系列的串、并通讯功能切换,使用8位并行接口,PSB=1

/********宏定义***********************************************************/
#define LCD_Data P0
#define Busy    0x80 //用于检测LCD状态字中的Busy标识

/********函数声明*************************************************************/
void WriteDataLCD(unsigned char WDLCD);
void WriteCommandLCD(unsigned char WCLCD,BuysC);
unsigned char ReadDataLCD(void);
unsigned char ReadStatusLCD(void);
void LCDInit(void);
void LCDClear(void);
void LCDFlash(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);

/********数据定义*************************************************************/
code unsigned char  uctech[] = {"5 1 单片机实验板"};
code unsigned char  net[] = {"lydz8.taobao.com"};
code unsigned char  mcu[] = {"自学单片机的首选"};
code unsigned char  qq[] = {"  QQ: 52927029  "};

/***********主函数开始********************************************************/
void main(void)
{
        Delay400Ms();         //启动等待,等LCD讲入工作状态
        LCDInit();                 //LCM初始化
        Delay5Ms();         //延时片刻(可不要)
        while(1){
                LCDClear();
                DisplayListChar(0,1,uctech);        //显示字库中的中文数字
                DisplayListChar(0,2,net);                //显示字库中的中文数字
                DisplayListChar(0,3,mcu);                //显示字库中的中文
                DisplayListChar(0,4,qq);                //显示字库中的中文数字
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                LCDFlash();                                                //闪烁效果
        }
}

/***********写数据********************************************************/
void WriteDataLCD(unsigned char WDLCD)
{
        ReadStatusLCD(); //检测忙
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_Data = WDLCD;
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;
}

/***********写指令********************************************************/
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
        if (BuysC) ReadStatusLCD(); //根据需要检测忙
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_Data = WCLCD;
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;  
}

/***********读数据********************************************************/
unsigned char ReadDataLCD(void)
{
        unsigned char LCDDA;
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E = 1;
        LCD_E = 1;
        LCDDA=LCD_Data;
        LCD_E = 0;
        return(LCDDA);
}

/***********读状态*******************************************************/
unsigned char ReadStatusLCD(void)
{
        LCD_Data = 0xFF;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_E = 1;
        LCD_E = 1;
        while (LCD_Data & Busy); //检测忙信号       
        LCD_E = 0;
        return(1);
}

/***********初始化********************************************************/
void LCDInit(void)
{
        WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
        WriteCommandLCD(0x01,1); //显示清屏
        WriteCommandLCD(0x06,1); // 显示光标移动设置
        WriteCommandLCD(0x0C,1); // 显示开及光标设置
}

/***********清屏********************************************************/       
void LCDClear(void)
{
        WriteCommandLCD(0x01,1); //显示清屏
        WriteCommandLCD(0x34,1); // 显示光标移动设置
        WriteCommandLCD(0x30,1); // 显示开及光标设置
}

/***********闪烁效果********************************************************/
void LCDFlash(void)
{
        WriteCommandLCD(0x08,1); //显示清屏
        Delay400Ms();
        WriteCommandLCD(0x0c,1); // 显示开及光标设置
        Delay400Ms();
        WriteCommandLCD(0x08,1); //显示清屏
        Delay400Ms();
        WriteCommandLCD(0x0c,1); // 显示开及光标设置
        Delay400Ms();
        WriteCommandLCD(0x08,1); //显示清屏
        Delay400Ms();
}

/***********按指定位置显示一个字符*******************************************/       
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
        if(Y<1)
                Y=1;
        if(Y>4)
                Y=4;
        X &= 0x0F;                         //限制X不能大于16,Y不能大于1
        switch(Y){
        case 1:X|=0X80;break;
        case 2:X|=0X90;break;
        case 3:X|=0X88;break;
        case 4:X|=0X98;break;
        }
        WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
        WriteDataLCD(DData);
}

/***********按指定位置显示一串字符*****************************************/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
        unsigned char ListLength,X2;
        ListLength = 0;
        X2=X;
        if(Y<1)
                Y=1;
        if(Y>4)
                Y=4;
        X &= 0x0F;                                 //限制X不能大于16,Y在1-4之内
        switch(Y){
        case 1:X2|=0X80;break;        //根据行数来选择相应地址
        case 2:X2|=0X90;break;
        case 3:X2|=0X88;break;
        case 4:X2|=0X98;break;
        }
        WriteCommandLCD(X2, 1);         //发送地址码
          while (DData[ListLength]>=0x20){ //若到达字串尾则退出
                   if (X <= 0x0F){                         //X坐标应小于0xF
                     WriteDataLCD(DData[ListLength]);
                     ListLength++;
                         X++;
                         Delay5Ms();
            }
          }
}

/***********短延时********************************************************/
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}

/***********长延时********************************************************/
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--){
                  TempCycB=7269;
                  while(TempCycB--);
        }
}
ID:44262 发表于 2014-10-10 11:37
能共享一下可用的程序吗?
ID:66729 发表于 2014-10-9 21:03
vohang 发表于 2014-10-9 16:19
刚试了你的程序 也没显示出来 ,我也刚学 没法帮你改呵呵,简单的会改

我换了其他的程序,,改了接口,现在可以显示了,,,唉开始以为LCD是坏的。。呵呵
ID:63094 发表于 2014-10-9 16:19
刚试了你的程序 也没显示出来 ,我也刚学 没法帮你改呵呵,简单的会改

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

Powered by 单片机教程网

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