找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602只显示第一排黑块

  [复制链接]
跳转到指定楼层
楼主
芯片是好的,用的是开发板,开发板也是好的,应该是程序哪有问题。仿真没问题,但放到开发板上就不行了。
开发板用的是HC6800。
试过调对比度,但是没什么帮助。
芯片第一行第二行均可单独显示静态的内容。
出现黑块应该是初始化的问题,但又看不出哪有问题,所以请各位大佬能在百忙中看看,不胜感激。

#ifndef _LCD1602_H_
#define _LCD1602_H_

#define uchar unsigned char
#define uint unsigned int

#define data_1602 P0
uchar code table_num[]="0123456789abcdefg";

sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P2^6;         //片选信号   下降沿触发

/***********************延时函数************************/
void delay_uint(uint q){
        while(q--);
}

/***********************lcd1602写命令函数************************/
void write_com(uchar com){
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;
}

/***********************lcd1602写数据函数************************/
void write_data(uchar dat){
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;       
}

/***********************lcd1602初始化设置************************/
void init_1602()         //lcd1602初始化设置
{
        write_com(0x38);        //
        write_com(0x0c);
        write_com(0x06);
}

/***********************lcd1602上显示两位十进制数************************/
void write_sfm1(uchar hang,uchar add,uchar date)        ///***显示星期函数***从十位开始写///
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(table_num[date % 10]);       
}  

/***********************lcd1602上显示两位十进制数************************/
void write_sfm2(uchar hang,uchar add,uchar date)  ///***显示时分秒函数***从十位开始写///
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(table_num[date / 10 % 10]);       
        write_data(table_num[date % 10]);       
}


/***********************lcd1602上显示两位十进制数************************/
void write_sfm3_18B20(uchar hang,uchar add,uint date)  ///***显示温度函数***从十位开始写///
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data('.');
        write_data(0x30+date%10);       
}



/***********************lcd1602上显示两位十进制数************************/
void write_sfm2_ds1302(uchar hang,uchar add,uchar date){
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);          
        write_data(table_num[date/16]);
        write_data(table_num[date%16]);       
}

/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p){
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                while(1)                                                                                                                 
                {
                        if(*p == '\0')  break;
                        write_data(*p);
                        p++;
                }       
}

/*****************控制光标函数********************/
void write_guanbiao(uchar hang,uchar add,uchar date){               
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        if(date == 1)
                write_com(0x0f);     //显示光标并且闪烁       
        else
                write_com(0x0c);   //关闭光标
}       

/***********************lcd1602上显示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date){
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(date);       
}

/***********************lcd1602清除显示************************/
void clear_1602(){
        write_string(1,0,"                ");
        write_string(2,0,"                ");
}

/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf()  //初始化液晶
{
        write_string(1,0,"   :  :    00.0");               
        write_string(2,0,"20  -  -       ");       
        write_zifu(1,15,0xdf);  //显示度       
}
#endif










///////////***********************************************///////////////////////////
#ifndef _DS1302_H_
#define _DS1302_H_

/******************
        ds1302 内部RAM   RAM0  1100 000R/W   1读 0写
                                         RAM1  1100 001R/W  
                                               .......
                                         RAM30 1111 110R/W   
********************/

sbit clk = P3^6;          //ds1302时钟线定义
sbit io =  P3^4;          //数据线
sbit rst = P3^5;          //复位线
                                                //秒  分   时   日   月  年   星期        
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //写地址
uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //读地址
uchar code init_ds[]  ={0x58,0x00,0x00,0x01,0x01,0x13,0x01};

//uchar miao,fen,shi,ri,yue,week,nian;
uchar  miao,fen,shi,ri,yue,week,nian;       
uchar i;
uchar fen1=0x11,shi1=0;          //两个闹钟变量的定义
bit open1;

/*************写一个数据到对应的地址里***************/
void write_ds1302(uchar add,uchar dat)
{               
        rst = 1;                         //把复位线拉高
        for(i=0;i<8;i++){                                     //低位在前
                clk = 0;                 //时钟线拿低开始写数据
                io = add & 0x01;           
                add >>= 1;                 //把地址右移一位
                clk = 1;                 //时钟线拿高
        }       
        for(i=0;i<8;i++){
                clk = 0;                 //时钟线拿低开始写数据
                io = dat & 0x01;
                dat >>= 1;                 //把数据右移一位
                clk = 1;                 //时钟线拿高
        }
        rst = 0;                         //复位线合低
        clk = 0;
        io = 0;
}

/*************从对应的地址读一个数据出来***************/
uchar read_ds1302(uchar add){
        uchar value,i;
        rst = 1;                         //把复位线拿高
        for(i=0;i<8;i++){                                     //低位在前
                clk = 0;                 //时钟线拿低开始写数据
                io = add & 0x01;           
                add >>= 1;                 //把地址右移一位
                clk = 1;                 //时钟线拿高
        }               
        for(i=0;i<8;i++){
                clk = 0;                 //时钟线拿低开始读数据
                value >>= 1;
                if(io == 1)
                        value |= 0x80;
                clk = 1;                 //时钟线拿高
        }
        rst = 0;                         //复位线合低
        clk = 0;
        io = 0;
        return value;                 //返回读出来的数据
}

/*************把要的时间 年月日 都读出来***************/
void read_time(){
        miao = read_ds1302(read_add[0]);        //读秒
        fen  = read_ds1302(read_add[1]);        //读分
        shi  = read_ds1302(read_add[2]);        //读时
        ri   = read_ds1302(read_add[3]);        //读日
        yue  = read_ds1302(read_add[4]);        //读月
        nian = read_ds1302(read_add[5]);        //读年
        week = read_ds1302(read_add[6]);        //读星期          
}

/*************把要写的时间 年月日 都写入ds1302里***************/
void write_time(){
        write_ds1302(0x8e,0x00);                        //打开写保护
        write_ds1302(write_add[0],miao);        //写秒
        write_ds1302(write_add[1],fen);                //写分
        write_ds1302(write_add[2],shi);                //写时
        write_ds1302(write_add[3],ri);                //写日
        write_ds1302(write_add[4],yue);                //写月
        write_ds1302(write_add[5],nian);        //写年
        write_ds1302(write_add[6],week);        //写星期
        write_ds1302(0x8e,0x80);                        //关闭写保护
}

/*************把数据保存到ds1302 RAM中**0-31*************/
void write_ds1302ram(uchar add,uchar dat){
        add <<= 1;     //地址是从第二位开始的
        add &= 0xfe;   //把最低位清零  是写的命令
        add |= 0xc0;   //地址最高两位为 1  
        write_ds1302(0x8e,0x00);
        write_ds1302(add,dat);       
        write_ds1302(0x8e,0x80);
}

/*************把数据从ds1302 RAM读出来**0-31*************/
uchar read_ds1302ram(uchar add){
        add <<= 1;     //地址是从第二位开始的
        add |= 0x01;   //把最高位置1  是读命令
        add |= 0xc0;   //地址最高两位为 1  
        return(read_ds1302(add));       
}

/*************初始化ds1302时间***************/
void init_ds1302(){
        uchar i;
        rst = 0;        //第一次读写数据时要把IO口拿低
        clk = 0;
        io = 0;
        i = read_ds1302ram(30);///***DS1302与RAM相关的寄存器,单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH~FDH***///
                                                   ///***把数据从30地址中毒出来***///
        if(i != 3){       
                i = 3;
                write_ds1302ram(30,i);                         //4050   4100                 3080

                write_ds1302(0x8e,0x00);                    //打开写保护
                for(i=0;i<7;i++)
                        write_ds1302(write_add[i],init_ds[i]);        //把最高位值0 允许ds1302工作
                write_ds1302(0x8e,0x80);        //关写保护
        }
}
#endif








////////////////***************************************//////////////////////////
#ifndef _EEPROM52_H_
#define _EEPROM52_H_
uchar a_a;
#include <intrins.h>

#define RdCommand 0x01 //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2;  //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;

/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void){
         EA = 0;       /* 关中断   */
         ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
         ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
         ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}

/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void){
         ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
         ISP_TRIG = 0x00;
         EA   =   1;   /* 开中断 */
}

/* ================ 公用的触发代码 ==================== */
void ISPgoon(void){
         ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
         ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
         ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
         _nop_();
}

/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
        EA = 0;
         ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
         ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
         ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
         ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
         ISPgoon();       /* 触发执行  */
         ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
         EA  = 1;
         return (ISP_DATA);    /* 返回读到的数据 */
}

/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr){
         unsigned int iSectorAddr;
         iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
         ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
         ISP_ADDRL = 0x00;
         ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
         ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
         ISPgoon();       /* 触发执行  */
         ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
}

/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data){
         EA  = 0;
//         SectorErase(byte_addr);
         ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
         ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
         ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
         ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 */
         ISP_DATA = original_data;   /* 写入数据准备 */
         ISPgoon();       /* 触发执行  */
         ISP_IAP_disable();     /* 关闭IAP功能 */
         EA =1;
}
#endif









//////////////**********************////////////////////////
#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
#include "eeprom52.h"

#include "intrins.h"

bit flag_200ms ;
bit flag_100ms ;

sbit dq   = P3^7;          //18b20 IO口的定义

uint temperature ;    //温度变量

uchar menu_1,menu_2;

#include "ds1302.h"
#include "lcd1602.h"

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom(){
        SectorErase(0x2000);
        byte_write(0x2000, fen1);
        byte_write(0x2001, shi1);
        byte_write(0x2002, open1);
        byte_write(0x2058, a_a);       
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom(){
        fen1  = byte_read(0x2000);
        shi1  = byte_read(0x2001);
        open1  = byte_read(0x2002);
        a_a      = byte_read(0x2058);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom(){
        read_eeprom();                //先读
        if(a_a != 1)                //新的单片机初始单片机内问eeprom
        {
                fen1  = 3;
                shi1  = 8;
                open1  = 1;
                a_a = 1;
                write_eeprom();           //保存数据
        }       
}

/***********************18b20初始化函数*****************************/
void init_18b20(){
        bit q;
        dq = 1;                                //把总线拿高
        delay_uint(1);            //15us
        dq = 0;                                //给复位脉冲
        delay_uint(80);                //750us
        dq = 1;                                //把总线拿高 等待
        delay_uint(10);                //110us
        q = dq;                                //读取18b20初始化信号
        delay_uint(20);                //200us
        dq = 1;                                //把总线拿高 释放总线
}

/*************写18b20内的数据***************/
void write_18b20(uchar dat){
        uchar i;
        for(i=0;i<8;i++){                                         //写数据是低位开始
                dq = 0;                         //把总线拿低写时间隙开始
                dq = dat & 0x01; //向18b20总线写数据了
                delay_uint(5);         // 60us
                dq = 1;                         //释放总线
                dat >>= 1;
        }       
}

/*************读取18b20内的数据***************/
uchar read_18b20(){
        uchar i,value;
        for(i=0;i<8;i++){
                dq = 0;                         //把总线拿低读时间隙开始
                value >>= 1;         //读数据是低位开始
                dq = 1;                         //释放总线
                if(dq == 1)                 //开始读写数据
                        value |= 0x80;
                delay_uint(5);         //60us        读一个时间隙最少要保持60us的时间
        }
        return value;                 //返回数据
}

/*************读取温度的值 读出来的是小数***************/
uint read_temp(){
        uint value;
        uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0x44);           //启动一次温度转换命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20
       
        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0xbe);           //发出读取暂存器命令
       
        EA = 0;
        low = read_18b20();           //读温度低字节
        value = read_18b20();  //读温度高字节
        EA = 1;
        value <<= 8;                   //把温度的高位左移8位
        value |= low;                   //把读出的温度低位放到value的低八位中
        value *= 0.625;               //转换到温度值 小数
        return value;                   //返回读出的温度 带小数
}

/******************1ms 延时函数*******************/
void delay_1ms(uint q){
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/******************写星期函数*******************/
void write_week(uchar hang,uchar add,uchar week)//写星期函数
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);          
        switch(week){
                case 1:write_data('M');//星期数为1时,显示
                           write_data('O');
                           write_data('N');
                           break;
          
                case 2:write_data('T');//星期数据为2时显示
                           write_data('U');
                           write_data('E');
                           break;
               
                case 3:write_data('W');//星期数据为3时显示
                           write_data('E');
                           write_data('D');
                           break;
               
                case 4:write_data('T');//星期数据为4是显示
                           write_data('H');
                           write_data('U');
                           break;
               
                case 5:write_data('F');//星期数据为5时显示
                           write_data('R');
                           write_data('I');
                           break;
               
                case 6:write_data('S');//星期数据为6时显示
                           write_data('T');
                           write_data('A');
                           break;
               
                case 7:write_data('S');//星期数据为7时显示
                           write_data('U');
                           write_data('N');
                           break;
        }
}

/*************时钟显示***************/
void init_1602_ds1302(){
        write_sfm2_ds1302(1,1,shi);                   //显示时
        write_sfm2_ds1302(1,4,fen);                   //显示分
        write_sfm2_ds1302(1,7,miao);           //显示秒
        write_week(2,12,week);
  //write_sfm1(1,14,week);                           //显示星期
        write_sfm3_18B20(1,11,temperature);           //显示温度
       
        write_sfm2_ds1302(2,2,nian);   //显示年
        write_sfm2_ds1302(2,5,yue);           //显示月       
        write_sfm2_ds1302(2,8,ri);           //显示日        
}                                                                          

/*************定时器0初始化程序***************/
void init_time0()          {
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}

/*****************主函数********************/
void main(){       
        delay_1ms(150);
        P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
        init_time0();                 //初始化定时器
        init_ds1302();                 //ds1302初始化
        init_1602();                 //lcd1602初始化
        init_1602_dis_csf(); //lcd1602初始化显示
        init_eeprom();       //开始初始化保存的数据
        temperature = read_temp();        //先读出温度的值
        delay_1ms(650);
        temperature = read_temp();        //先读出温度的值
        while(1){
                if(flag_200ms == 1){       
                        flag_200ms = 0;
                        if(menu_1 == 0){
                                read_time();                  //读时间
                                temperature = read_temp();        //先读出温度的值
                                init_1602_ds1302();   //显示时钟
                        }
                }
                delay_1ms(1);
        }
}

/**************定时器0中断程序*****************/
void time0() interrupt 1{                         
        static uchar value;
        TH0 = 0X3C;
        TL0 = 0XB0;           //50ms
        value ++;          
        if((value % 2) == 0)         //100ms  
                flag_100ms = 1;         
        if(value >= 6)                         //200ms
        {
                value = 0;
                flag_200ms = 1;
        }
}




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

使用道具 举报

沙发
ID:303383 发表于 2018-4-26 16:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:213173 发表于 2018-4-26 17:41 | 只看该作者
void init_1602()         //lcd1602初始化设置
{
        write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
        write_com(0x01);//显示清零,数据指针清零
        write_com(0x0c);//设置开显示,不显光标
        write_com(0x06);//设置写一个字符后地址指针加1
}
回复

使用道具 举报

地板
ID:308346 发表于 2018-4-30 09:48 | 只看该作者
wulin 发表于 2018-4-26 17:41
void init_1602()         //lcd1602初始化设置
{
        write_com(0x38);//设置16*2显示,5*7点阵,8位数据接 ...

还是和原来一样诶
回复

使用道具 举报

5#
ID:308346 发表于 2018-4-30 09:49 | 只看该作者
小猫猫爱吃鱼 发表于 2018-4-26 16:26
你好!检查液晶对应开发板的接口吧

你好,接口是按照开发板给的原理图接的,核实了很多遍没有错啊
回复

使用道具 举报

6#
ID:319274 发表于 2018-4-30 11:34 | 只看该作者
可能排线出现了问题
回复

使用道具 举报

7#
ID:213173 发表于 2018-4-30 12:43 | 只看该作者

还是没有仔细看,难怪玩不转。
回复

使用道具 举报

8#
ID:319344 发表于 2018-4-30 14:28 | 只看该作者
问题解决了吗?你说第一行和第二行都能静态显示,我很好奇黑块还能出现在什么地方,贴个图才好帮你更好的分析呀
回复

使用道具 举报

9#
ID:111634 发表于 2018-4-30 21:18 | 只看该作者
本帖最后由 zl2168 于 2018-4-30 21:20 编辑

给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例67  LCD1602显示屏显示
⒈ LCD1602显示屏简介
⑴ 引脚功能    …
⑵ 内部寄存器    …
⑶ 控制指令    …
⑷ 操作时序    …
⒉ 电路设计    …
⒊ 程序设计    …
⒋ Keil调试    …
⒌ Proteus仿真    …
Proteus仿真一下,确认有效。
实例61 LCD1602显示屏显示.rar (49.26 KB, 下载次数: 135)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

10#
ID:308346 发表于 2018-5-1 12:54 | 只看该作者
实际图就是这样,第一行显示黑块,但是它是有频率的闪

0.JPG (2.02 MB, 下载次数: 53)

0.JPG
回复

使用道具 举报

11#
ID:302494 发表于 2018-8-6 20:56 | 只看该作者
兄弟,你解决问题了没有?我遇见同样的问题了
回复

使用道具 举报

12#
ID:96682 发表于 2018-8-7 12:04 | 只看该作者
检查端口是否设置正确,从图片上看连数码管和 LED 都显示了实为不该,正确应为只有 LCD 液晶屏显示
回复

使用道具 举报

13#
ID:389903 发表于 2018-9-5 15:45 | 只看该作者
sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P2^6;         //片选信号   下降沿触发
回复

使用道具 举报

14#
ID:389903 发表于 2018-9-5 15:47 | 只看该作者
sbit rs=P2^5;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
sbit e =P2^6;         //片选信号   下降沿触发

这几个端口对照开发板的电路图查一下。我记得好像是
sbit rs=P2^6;         
sbit rw=P2^5;         
sbit e =P2^7;         

只显第一排黑块是没有LCD1602没有正常初始化

回复

使用道具 举报

15#
ID:308437 发表于 2018-9-5 16:41 | 只看该作者
小猫猫爱吃鱼 发表于 2018-4-26 16:26
你好!检查液晶对应开发板的接口吧

同意这个说法
回复

使用道具 举报

16#
ID:468289 发表于 2019-1-15 22:59 | 只看该作者
刚刚遇到了,最后通过一根根线排查接好就行了。
不接单片机是显示一排黑方块的,lz一闪一闪的可能是接触不良,,
其他有些人说是延时问题,但程序我看着没问题...
回复

使用道具 举报

17#
ID:449525 发表于 2019-2-23 11:06 | 只看该作者
小伙,之前在论坛看到你的问题。我没事自己画的电路板也出现了,在洞洞板上是可以的。软件也是可以用的,最后查到是硬件问题,有2个引脚连接到一起了。如果有别人遇到,可以查下管脚。
回复

使用道具 举报

18#
ID:69072 发表于 2019-2-23 12:12 | 只看该作者
考虑第二排地址错误
回复

使用道具 举报

19#
ID:704182 发表于 2020-3-7 18:09 来自手机 | 只看该作者
一样的开发板,一样的问题
回复

使用道具 举报

20#
ID:704304 发表于 2020-3-7 21:58 | 只看该作者
Hellen_z 发表于 2020-3-7 18:09
一样的开发板,一样的问题

他是插口插反了,你可以去检查试试看
回复

使用道具 举报

21#
ID:708010 发表于 2020-3-28 21:07 | 只看该作者
我也遇到了这个问题,然后拔掉了单片机,测了一下D0~D7的电压,只有D6的电压为0,请问是这个原因吗?
回复

使用道具 举报

22#
ID:973855 发表于 2022-2-22 08:48 | 只看该作者
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;
}
这些是定义起来干嘛的
回复

使用道具 举报

23#
ID:514901 发表于 2022-2-22 09:10 | 只看该作者
马克扎西 发表于 2018-5-1 12:54
实际图就是这样,第一行显示黑块,但是它是有频率的闪

屏幕接反了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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