找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W4K58S4与1602,12864显示失败解决方案之一

[复制链接]
跳转到指定楼层
楼主
ID:586048 发表于 2019-7-23 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我遇到的是时序图那个时间不对应,因为15w快89  6——12倍,所以那些时间也要快6——12倍,引脚也要相应的看原理图改。

下面是我的问题:
我的屏幕很暗,调了板子上的可调电阻还是很暗,又没有大佬帮帮我





延时测试.zip

699.63 KB, 下载次数: 28

1602与stc15w

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

使用道具 举报

沙发
ID:586048 发表于 2019-7-23 20:59 | 只看该作者
/*
**********************************************************************
*                         头文件包含
**********************************************************************
*/
#define         MAIN_Fosc                12000000UL        //定义主时钟  22.1184M晶振
//u8,u16,u32已在"STC15Fxxxx.h"定义
#include "STC15Fxxxx.h"

/*
**********************************************************************
*                         本地宏定义
**********************************************************************
*/
/*
void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口
       
        while(1);
}*/
/*
RS  RW E 引脚要自己定义
因为15W系列快89系列 6——12倍,时序图上面的时间也要
相应的加倍,具体多少要具体测试,我的大概快了8倍(IAP15W4K584S)
可以作为参考
*/

sbit LCD_RS=P5^0;//定义引脚
sbit LCD_RW=P5^1;
sbit LCD_E=P5^2;
sbit ledL = P5^5;
#define LCD_Data P4
#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 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);
void Delay4us(void);


unsigned char code uctech[] = {"ic2012.taobao.co"};
unsigned char code net[] = {"Happy every day!"};

void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //设置为准双向口
        P1M1 = 0;        P1M0 = 0;        //设置为准双向口
        P2M1 = 0;        P2M0 = 0;        //设置为准双向口
        P3M1 = 0;        P3M0 = 0;        //设置为准双向口
        P4M1 = 0;        P4M0 = 0;        //设置为准双向口
        P5M1 = 0;        P5M0 = 0;        //设置为准双向口
        P6M1 = 0;        P6M0 = 0;        //设置为准双向口
        P7M1 = 0;        P7M0 = 0;        //设置为准双向口
        //上面这些是必要的,除非用到PWM
       
        ledL = 0;
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)

DisplayListChar(0, 0, uctech);
DisplayListChar(0, 5, net);
ReadDataLCD();//测试用句无意义
while(1);{}
       
}

//写数据
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_Data = WDLCD;
LCD_RS = 1;
        Delay4us(); //延时  约4.25微秒
       
LCD_RW = 0;       
        Delay4us(); //延时
       
LCD_E = 0; //若晶振速度太高可以在这后加小的延时
        Delay4us();  //延时
       
LCD_E = 1;
}

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

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

//读状态
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
        Delay4us();  //延时
       
LCD_RW = 1;
        Delay4us();  //延时
       
LCD_E = 0;
        Delay4us(); //约4.25微秒
        Delay4us();        //两个约8微秒,自己测试一下
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
return(LCD_Data);
}

void LCDInit(void) //LCM初始化
{
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();

WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x08,1); //关闭显示
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); // 显示光标移动设置
WriteCommandLCD(0x0C,1); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;

  ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到达字串尾则退出
  {
   if (X <= 0xF) //X坐标应小于0xF
    {
     DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
     ListLength++;
     X++;
    }
  }
}

//5ms延时
void Delay5Ms(void)
{
        unsigned char i, j;

        i = 59;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}

//400ms延时
void Delay400Ms(void)
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 19;
        j = 62;
        k = 43;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay4us()                //@12.000MHz  精准延时4微妙
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 9;   //必须i>=8,大约6微秒(在229——237测试)实际上是3.9微秒
        while (--i);
}




回复

使用道具 举报

板凳
ID:480680 发表于 2019-7-25 11:22 | 只看该作者
电位器调节显示对比度!没有显示有三种能:
1、显示屏坏了
2、信号线没有连接好
3、程序问题
回复

使用道具 举报

地板
ID:586048 发表于 2019-7-26 14:34 | 只看该作者
周涛1331 发表于 2019-7-25 11:22
电位器调节显示对比度!没有显示有三种能:
1、显示屏坏了
2、信号线没有连接好

显示屏没有坏,信号线也没有问题,如果是程序问题会出在那里?
电位器也调过了,也是没有什么用,求大佬解答
回复

使用道具 举报

5#
ID:586048 发表于 2019-7-26 14:38 | 只看该作者
周涛1331 发表于 2019-7-25 11:22
电位器调节显示对比度!没有显示有三种能:
1、显示屏坏了
2、信号线没有连接好

可能说的不是很清楚,程序能过正常显示,但是屏幕很暗
回复

使用道具 举报

6#
ID:419264 发表于 2019-7-27 20:55 | 只看该作者
那个P5^5改为P5^4
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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