找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19555|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

LCD1602只顯示第一排黑塊

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:308346 發(fā)表于 2018-4-26 12:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
芯片是好的,用的是開發(fā)板,開發(fā)板也是好的,應(yīng)該是程序哪有問題。仿真沒問題,但放到開發(fā)板上就不行了。
開發(fā)板用的是HC6800。
試過調(diào)對比度,但是沒什么幫助。
芯片第一行第二行均可單獨顯示靜態(tài)的內(nèi)容。
出現(xiàn)黑塊應(yīng)該是初始化的問題,但又看不出哪有問題,所以請各位大佬能在百忙中看看,不勝感激。

#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:數(shù)據(jù)寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit e =P2^6;         //片選信號   下降沿觸發(fā)

/***********************延時函數(shù)************************/
void delay_uint(uint q){
        while(q--);
}

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

/***********************lcd1602寫數(shù)據(jù)函數(shù)************************/
void write_data(uchar dat){
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;       
}

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

/***********************lcd1602上顯示兩位十進制數(shù)************************/
void write_sfm1(uchar hang,uchar add,uchar date)        ///***顯示星期函數(shù)***從十位開始寫///
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(table_num[date % 10]);       
}  

/***********************lcd1602上顯示兩位十進制數(shù)************************/
void write_sfm2(uchar hang,uchar add,uchar date)  ///***顯示時分秒函數(shù)***從十位開始寫///
{
        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上顯示兩位十進制數(shù)************************/
void write_sfm3_18B20(uchar hang,uchar add,uint date)  ///***顯示溫度函數(shù)***從十位開始寫///
{
        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上顯示兩位十進制數(shù)************************/
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上顯示這字符函數(shù)************************/
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++;
                }       
}

/*****************控制光標(biāo)函數(shù)********************/
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);     //顯示光標(biāo)并且閃爍       
        else
                write_com(0x0c);   //關(guān)閉光標(biāo)
}       

/***********************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,"                ");
}

/****************開機液晶顯示函數(shù) 初始化液晶的內(nèi)容********************************/
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 內(nèi)部RAM   RAM0  1100 000R/W   1讀 0寫
                                         RAM1  1100 001R/W  
                                               .......
                                         RAM30 1111 110R/W   
********************/

sbit clk = P3^6;          //ds1302時鐘線定義
sbit io =  P3^4;          //數(shù)據(jù)線
sbit rst = P3^5;          //復(fù)位線
                                                //秒  分   時   日   月  年   星期        
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;

/*************寫一個數(shù)據(jù)到對應(yīng)的地址里***************/
void write_ds1302(uchar add,uchar dat)
{               
        rst = 1;                         //把復(fù)位線拉高
        for(i=0;i<8;i++){                                     //低位在前
                clk = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
                io = add & 0x01;           
                add >>= 1;                 //把地址右移一位
                clk = 1;                 //時鐘線拿高
        }       
        for(i=0;i<8;i++){
                clk = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
                io = dat & 0x01;
                dat >>= 1;                 //把數(shù)據(jù)右移一位
                clk = 1;                 //時鐘線拿高
        }
        rst = 0;                         //復(fù)位線合低
        clk = 0;
        io = 0;
}

/*************從對應(yīng)的地址讀一個數(shù)據(jù)出來***************/
uchar read_ds1302(uchar add){
        uchar value,i;
        rst = 1;                         //把復(fù)位線拿高
        for(i=0;i<8;i++){                                     //低位在前
                clk = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
                io = add & 0x01;           
                add >>= 1;                 //把地址右移一位
                clk = 1;                 //時鐘線拿高
        }               
        for(i=0;i<8;i++){
                clk = 0;                 //時鐘線拿低開始讀數(shù)據(jù)
                value >>= 1;
                if(io == 1)
                        value |= 0x80;
                clk = 1;                 //時鐘線拿高
        }
        rst = 0;                         //復(fù)位線合低
        clk = 0;
        io = 0;
        return value;                 //返回讀出來的數(shù)據(jù)
}

/*************把要的時間 年月日 都讀出來***************/
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);                        //關(guān)閉寫保護
}

/*************把數(shù)據(jù)保存到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);
}

/*************把數(shù)據(jù)從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;        //第一次讀寫數(shù)據(jù)時要把IO口拿低
        clk = 0;
        io = 0;
        i = read_ds1302ram(30);///***DS1302與RAM相關(guān)的寄存器,單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為COH~FDH***///
                                                   ///***把數(shù)據(jù)從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);        //關(guān)寫保護
        }
}
#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;       /* 關(guān)中斷   */
         ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
         ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
         ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
}

/* =============== 關(guān)閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void){
         ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
         ISP_TRIG = 0x00;
         EA   =   1;   /* 開中斷 */
}

/* ================ 公用的觸發(fā)代碼 ==================== */
void ISPgoon(void){
         ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
         ISP_TRIG = 0x46;  /* 觸發(fā)ISP_IAP命令字節(jié)1 */
         ISP_TRIG = 0xb9;  /* 觸發(fā)ISP_IAP命令字節(jié)2 */
         _nop_();
}

/* ==================== 字節(jié)讀 ======================== */
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();       /* 觸發(fā)執(zhí)行  */
         ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
         EA  = 1;
         return (ISP_DATA);    /* 返回讀到的數(shù)據(jù) */
}

/* ================== 扇區(qū)擦除 ======================== */
void SectorErase(unsigned int sector_addr){
         unsigned int iSectorAddr;
         iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
         ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
         ISP_ADDRL = 0x00;
         ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
         ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
         ISPgoon();       /* 觸發(fā)執(zhí)行  */
         ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
}

/* ==================== 字節(jié)寫 ======================== */
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;   /* 寫入數(shù)據(jù)準(zhǔn)備 */
         ISPgoon();       /* 觸發(fā)執(zhí)行  */
         ISP_IAP_disable();     /* 關(guān)閉IAP功能 */
         EA =1;
}
#endif









//////////////**********************////////////////////////
#include <reg52.h>                 //調(diào)用單片機頭文件
#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"

/******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/
void write_eeprom(){
        SectorErase(0x2000);
        byte_write(0x2000, fen1);
        byte_write(0x2001, shi1);
        byte_write(0x2002, open1);
        byte_write(0x2058, a_a);       
}

/******************把數(shù)據(jù)從單片機內(nèi)部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)                //新的單片機初始單片機內(nèi)問eeprom
        {
                fen1  = 3;
                shi1  = 8;
                open1  = 1;
                a_a = 1;
                write_eeprom();           //保存數(shù)據(jù)
        }       
}

/***********************18b20初始化函數(shù)*****************************/
void init_18b20(){
        bit q;
        dq = 1;                                //把總線拿高
        delay_uint(1);            //15us
        dq = 0;                                //給復(fù)位脈沖
        delay_uint(80);                //750us
        dq = 1;                                //把總線拿高 等待
        delay_uint(10);                //110us
        q = dq;                                //讀取18b20初始化信號
        delay_uint(20);                //200us
        dq = 1;                                //把總線拿高 釋放總線
}

/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat){
        uchar i;
        for(i=0;i<8;i++){                                         //寫數(shù)據(jù)是低位開始
                dq = 0;                         //把總線拿低寫時間隙開始
                dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
                delay_uint(5);         // 60us
                dq = 1;                         //釋放總線
                dat >>= 1;
        }       
}

/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20(){
        uchar i,value;
        for(i=0;i<8;i++){
                dq = 0;                         //把總線拿低讀時間隙開始
                value >>= 1;         //讀數(shù)據(jù)是低位開始
                dq = 1;                         //釋放總線
                if(dq == 1)                 //開始讀寫數(shù)據(jù)
                        value |= 0x80;
                delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
        }
        return value;                 //返回數(shù)據(jù)
}

/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp(){
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20
       
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發(fā)出讀取暫存器命令
       
        EA = 0;
        low = read_18b20();           //讀溫度低字節(jié)
        value = read_18b20();  //讀溫度高字節(jié)
        EA = 1;
        value <<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)
        return value;                   //返回讀出的溫度 帶小數(shù)
}

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

/******************寫星期函數(shù)*******************/
void write_week(uchar hang,uchar add,uchar week)//寫星期函數(shù)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);          
        switch(week){
                case 1:write_data('M');//星期數(shù)為1時,顯示
                           write_data('O');
                           write_data('N');
                           break;
          
                case 2:write_data('T');//星期數(shù)據(jù)為2時顯示
                           write_data('U');
                           write_data('E');
                           break;
               
                case 3:write_data('W');//星期數(shù)據(jù)為3時顯示
                           write_data('E');
                           write_data('D');
                           break;
               
                case 4:write_data('T');//星期數(shù)據(jù)為4是顯示
                           write_data('H');
                           write_data('U');
                           break;
               
                case 5:write_data('F');//星期數(shù)據(jù)為5時顯示
                           write_data('R');
                           write_data('I');
                           break;
               
                case 6:write_data('S');//星期數(shù)據(jù)為6時顯示
                           write_data('T');
                           write_data('A');
                           break;
               
                case 7:write_data('S');//星期數(shù)據(jù)為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定時
}

/*****************主函數(shù)********************/
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();       //開始初始化保存的數(shù)據(jù)
        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 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:303383 發(fā)表于 2018-4-26 16:26 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復(fù)

使用道具 舉報

板凳
ID:213173 發(fā)表于 2018-4-26 17:41 | 只看該作者
void init_1602()         //lcd1602初始化設(shè)置
{
        write_com(0x38);//設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口
        write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
        write_com(0x0c);//設(shè)置開顯示,不顯光標(biāo)
        write_com(0x06);//設(shè)置寫一個字符后地址指針加1
}
回復(fù)

使用道具 舉報

地板
ID:308346 發(fā)表于 2018-4-30 09:48 | 只看該作者
wulin 發(fā)表于 2018-4-26 17:41
void init_1602()         //lcd1602初始化設(shè)置
{
        write_com(0x38);//設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接 ...

還是和原來一樣誒
回復(fù)

使用道具 舉報

5#
ID:308346 發(fā)表于 2018-4-30 09:49 | 只看該作者
小貓貓愛吃魚 發(fā)表于 2018-4-26 16:26
你好!檢查液晶對應(yīng)開發(fā)板的接口吧

你好,接口是按照開發(fā)板給的原理圖接的,核實了很多遍沒有錯啊
回復(fù)

使用道具 舉報

6#
ID:319274 發(fā)表于 2018-4-30 11:34 | 只看該作者
可能排線出現(xiàn)了問題
回復(fù)

使用道具 舉報

7#
ID:213173 發(fā)表于 2018-4-30 12:43 | 只看該作者

還是沒有仔細看,難怪玩不轉(zhuǎn)。
回復(fù)

使用道具 舉報

8#
ID:319344 發(fā)表于 2018-4-30 14:28 | 只看該作者
問題解決了嗎?你說第一行和第二行都能靜態(tài)顯示,我很好奇黑塊還能出現(xiàn)在什么地方,貼個圖才好幫你更好的分析呀
回復(fù)

使用道具 舉報

9#
ID:111634 發(fā)表于 2018-4-30 21:18 | 只看該作者
本帖最后由 zl2168 于 2018-4-30 21:20 編輯

給你介紹一個正確有效看得懂的案例,自己對照查錯吧!
實例67  LCD1602顯示屏顯示
⒈ LCD1602顯示屏簡介
⑴ 引腳功能    …
⑵ 內(nèi)部寄存器    …
⑶ 控制指令    …
⑷ 操作時序    …
⒉ 電路設(shè)計    …
⒊ 程序設(shè)計    …
⒋ Keil調(diào)試    …
⒌ Proteus仿真    …
Proteus仿真一下,確認有效。
實例61 LCD1602顯示屏顯示.rar (49.26 KB, 下載次數(shù): 135)

以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1。書中電路和程序設(shè)計有詳細說明,程序語句條條有注解。
回復(fù)

使用道具 舉報

10#
ID:308346 發(fā)表于 2018-5-1 12:54 | 只看該作者
實際圖就是這樣,第一行顯示黑塊,但是它是有頻率的閃

0.JPG (2.02 MB, 下載次數(shù): 82)

0.JPG
回復(fù)

使用道具 舉報

11#
ID:302494 發(fā)表于 2018-8-6 20:56 | 只看該作者
兄弟,你解決問題了沒有?我遇見同樣的問題了
回復(fù)

使用道具 舉報

12#
ID:96682 發(fā)表于 2018-8-7 12:04 | 只看該作者
檢查端口是否設(shè)置正確,從圖片上看連數(shù)碼管和 LED 都顯示了實為不該,正確應(yīng)為只有 LCD 液晶屏顯示
回復(fù)

使用道具 舉報

13#
ID:389903 發(fā)表于 2018-9-5 15:45 | 只看該作者
sbit rs=P2^5;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit e =P2^6;         //片選信號   下降沿觸發(fā)
回復(fù)

使用道具 舉報

14#
ID:389903 發(fā)表于 2018-9-5 15:47 | 只看該作者
sbit rs=P2^5;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit rw=P2^4;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit e =P2^6;         //片選信號   下降沿觸發(fā)

這幾個端口對照開發(fā)板的電路圖查一下。我記得好像是
sbit rs=P2^6;         
sbit rw=P2^5;         
sbit e =P2^7;         

只顯第一排黑塊是沒有LCD1602沒有正常初始化

回復(fù)

使用道具 舉報

15#
ID:308437 發(fā)表于 2018-9-5 16:41 | 只看該作者
小貓貓愛吃魚 發(fā)表于 2018-4-26 16:26
你好!檢查液晶對應(yīng)開發(fā)板的接口吧

同意這個說法
回復(fù)

使用道具 舉報

16#
ID:468289 發(fā)表于 2019-1-15 22:59 | 只看該作者
剛剛遇到了,最后通過一根根線排查接好就行了。
不接單片機是顯示一排黑方塊的,lz一閃一閃的可能是接觸不良,,
其他有些人說是延時問題,但程序我看著沒問題...
回復(fù)

使用道具 舉報

17#
ID:449525 發(fā)表于 2019-2-23 11:06 | 只看該作者
小伙,之前在論壇看到你的問題。我沒事自己畫的電路板也出現(xiàn)了,在洞洞板上是可以的。軟件也是可以用的,最后查到是硬件問題,有2個引腳連接到一起了。如果有別人遇到,可以查下管腳。
回復(fù)

使用道具 舉報

18#
ID:69072 發(fā)表于 2019-2-23 12:12 | 只看該作者
考慮第二排地址錯誤
回復(fù)

使用道具 舉報

19#
ID:704182 發(fā)表于 2020-3-7 18:09 來自手機 | 只看該作者
一樣的開發(fā)板,一樣的問題
回復(fù)

使用道具 舉報

20#
ID:704304 發(fā)表于 2020-3-7 21:58 | 只看該作者
Hellen_z 發(fā)表于 2020-3-7 18:09
一樣的開發(fā)板,一樣的問題

他是插口插反了,你可以去檢查試試看
回復(fù)

使用道具 舉報

21#
ID:708010 發(fā)表于 2020-3-28 21:07 | 只看該作者
我也遇到了這個問題,然后拔掉了單片機,測了一下D0~D7的電壓,只有D6的電壓為0,請問是這個原因嗎?
回復(fù)

使用道具 舉報

22#
ID:973855 發(fā)表于 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;
}
這些是定義起來干嘛的
回復(fù)

使用道具 舉報

23#
ID:514901 發(fā)表于 2022-2-22 09:10 | 只看該作者
馬克扎西 發(fā)表于 2018-5-1 12:54
實際圖就是這樣,第一行顯示黑塊,但是它是有頻率的閃

屏幕接反了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表