找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的lcd1602一直是两排白板

[复制链接]
跳转到指定楼层
楼主
ID:1107089 发表于 2023-12-29 17:08 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  为什么我的lcd1602一直是两排白块,老师说我的是程序有问题但是我不会改有没有大佬帮忙看看。因为我是在网上找的别人51的程序,改成15的。老师说我的延时函数有问题但是我自己改了一下因为不知道原来是延时多久我也不会改。有没有大佬帮忙看看为什么我的lcd1602一直是两排白板
#include "stc15.h"
#include <intrins.h>
#define uchar unsigned char
#define unit unsigned int
       
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit key0=P1^0;//功能键
sbit key1=P1^1;//光标的移动
sbit key2=P1^2;//加
sbit key3=P1^3;//减
sbit buz=P2^7;//蜂鸣器
sbit in1=P1^4;
sbit in2=P1^6;
sbit led=P3^7;//led
sbit hood=P1^7;

unsigned char count=0;
unsigned int hour=0,min=0,sec=0;
unsigned int alarm_h=0,alarm_m=0;
unsigned char str_sw0[]={"off"};
unsigned char str_sw1[]={"on"};
unsigned char str[]={"0123456789"};
unsigned int readtemp=0;
unsigned char a[]={"alarm:"};
unsigned int w=-1,pattern=0,sw=0;
unsigned int i=0;
unsigned char s[]={"T:"};
void delay();
void beep();
void delay(unsigned int t);
void writecom(unsigned char com);
void writedat(unsigned char dat);       
void initlcd();
void display_time();
void display_alarm();
void inittimer();
void function();
void main();


void delayms(unsigned int q)//延时函数
{
        unsigned int w=0,e=0,k=1;
        k=10*q;
        for(w=0;w<k;w++)
        {
                for(e=0;e<120;e++);
        }
}

void delay(unsigned int t)//延时函数
{
        unsigned int i=0,j=0;

        for(i=0;i<t;i++)
        {
                for(j=0;j<120;j++);
        }
}

//************************LCD1602************************//
void writecom(unsigned char com)//写命令
{
        RS=0;
        RW=0;
        E=0;
        P0=com;
        delayms(2);
        E=1;
        E=0;       
}

void writedat(unsigned char dat)//写数据
{
        RS=1;
        RW=0;
        E=0;
        P0=dat;
        delayms(2);
        E=1;
        E=0;       
}

void initlcd() //  lcd1602初始化
{
        writecom(0x38);//设置16*2显示,5*7点阵,8位数据接口
        writecom(0x0c);//设置开显示,不显示光标
        writecom(0x06);//写一个字符后地址指针加1
        writecom(0x01);//显示清0,数据指针清0
}





void display_time()//时间显示
{
        unsigned char temp0=0,temp1=0,temp2=0,temp3=0,temp4=0,temp5=0;
        temp0=hour/10;//拆分个位十位
        temp1=hour%10;
        temp2=min/10;
        temp3=min%10;
        temp4=sec/10;
        temp5=sec%10;
        writecom(0x80+0x40);//第二行显示
        delay(2);
        writedat(str[temp0]);//显示时分秒
        delay(2);
        writedat(str[temp1]);
        delay(2);
        writedat(':');
        delay(2);
        writedat(str[temp2]);
        delay(2);
        writedat(str[temp3]);
        delay(2);
        writedat(':');
        delay(2);
        writedat(str[temp4]);
        delay(2);
        writedat(str[temp5]);
        delay(2);
}


void display_alarm()//闹钟显示
{
        unsigned char temp0=0,temp1=0,temp2=0,temp3=0,i=0,j=0;
        writecom(0x80);
        delay(2);
        temp0=alarm_h/10;//拆分个位十位
        temp1=alarm_h%10;
        temp2=alarm_m/10;
        temp3=alarm_m%10;
        while(a[i]!='\0')
        {
                writedat(a[i]);
                delay(5);
                i++;
        }
        writecom(0x80+15);
        delay(2);
        if(sw==0)
        {
                writedat('0');       
        }
        if(sw==1)
        {
                writedat('1');
        }
        delay(2);
        writecom(0x80+0x40+5);
        delay(2);
        writedat(str[temp0]);
        delay(2);
        writedat(str[temp1]);
        delay(2);
        writedat(':');
        delay(2);
        writedat(str[temp2]);
        delay(2);
        writedat(str[temp3]);
        delay(2);
}


//**************************定时器************************//
void inittimer()//定时器初始化
{
        TMOD=0x01;
        TH0=0x3c;//50ms
        TL0=0xb0;
        ET0=1;//开启定时器0的中断
        EA=1;//开启总中断
        TR0=1;//启动定时器0
}

//***********************调时功能*********************//
void function()//调时,闹钟功能
{
        unsigned int key1sum=0,key2sum=0;
        if(key0==0)//判断按键是否按下
        {
                delay(10);//消抖
                if(key0==0)
                {
                        if(pattern<1)
                        {
                                pattern++;
                        }
                        else pattern=0;                        
                        while(!key0);//等待松开
                }
        }
        if(pattern==0)//时间界面
        {
                if(key1==0)//判断是否按下
                {
                        delay(10);
                        if(key1==0)
                        {       
                                while(!key1);//等待松开
                                if(key1sum<3)//按几下光标移到哪一位
                                {key1sum++;
                                EA=0;}
                                else key1sum=0;
                               
                                if(key1sum==1)
                                {       
                                        writecom(0x80+0x40+7);//移动到秒
                                        writecom(0x0e);                //光标显示
                                        while(1)
                                        {
                                                if(key1==0)
                                                {
                                                        delay(10);
                                                        if(key1==0)
                                                        {
                                                                while(!key1);
                                                                key1sum=2;
                                                                break;
                                                        }
                                                }
                                                if(key2==0)         //秒归零
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                sec=0;       
                                                                display_time();
                                                                writecom(0x80+0x40+7);
                                                        }       
                                                }
                                                if(key3==0)          //秒归零
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                sec=0;
                                                                display_time();
                                                                writecom(0x80+0x40+7);
                                                        }
                                                }
                                        }
                                }
                                if(key1sum==2)
                                {
                                        writecom(0x80+0x40+4);//移动到分
                                        writecom(0x0e);                //光标显示
                                        while(1)
                                        {
                                                if(key1==0)
                                                {
                                                        delay(10);
                                                        if(key1==0)
                                                        {
                                                                while(!key1);
                                                                key1sum=3;
                                                                break;
                                                        }
                                                }
                                                if(key2==0)//加
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                min++;
                                                                if(min==60)//最高为60分
                                                                {min=0;}
                                                                display_time();
                                                                writecom(0x80+0x40+4);
                                                        }       
                                                }
                                                if(key3==0)        //减
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                if(min>0)
                                                                {min--;}
                                                                display_time();
                                                                writecom(0x80+0x40+4);
                                                        }
                                                }
                                        }
                                                       
                                }
                                if(key1sum==3)
                                {
                                        writecom(0x80+0x40+1);//移动到时
                                        writecom(0x0e);                //光标显示
                                        while(1)
                                        {
                                                if(key1==0)
                                                {
                                                        delay(10);
                                                        if(key1==0)
                                                        {
                                                                while(!key1);
                                                                key1sum=0;
                                                                break;
                                                        }
                                                }
                                                if(key2==0)//加
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                hour++;
                                                                if(hour==24)//最高为24时
                                                                {hour=0;}
                                                                display_time();
                                                                writecom(0x80+0x40+1);
                                                        }       
                                                }
                                                if(key3==0)        //减
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                if(hour>0)
                                                                {hour--;}
                                                                display_time();
                                                                writecom(0x80+0x40+1);
                                                        }
                                                }
                                        }       
                                }
                               
                                if(key1sum==0)//跑时钟
                                {
                                        EA=1;
                                        writecom(0x0c);
                                }
                        }
                }
        }
        if(pattern==1)//闹钟界面
        {
                if(key1==0)                                              //开关闹钟
                {
                        delay(10);
                        if(key1==0)//检验是否按下
                        {
                                while(!key1);//等待按键松开
                                if(sw==0)
                                {sw=1;}
                                else sw=0;
                                display_alarm();
                        }
                }
                if(key2==0)//检测key2是否摁下                         //设置闹钟
                {
                        delay(10);
                        if(key2==0)
                        {
                                while(!key2);//等待松开
                                if(key2sum<2)
                                {key2sum++;}
                                else key2sum=0;
                                if(key2sum==1)
                                {
                                        writecom(0x80+0x40+6);//移动到时
                                        writecom(0x0e);         //打开光标
                                        while(1)
                                        {
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                key2sum=2;
                                                                break;
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==0)
                                                        {
                                                                while(!key3);
                                                                alarm_h++;
                                                                if(alarm_h==24)
                                                                {alarm_h=0;}
                                                                display_alarm();
                                                                writecom(0x80+0x40+6);
                                                        }
                                                }
                                        }
                                }
                                if(key2sum==2)
                                {
                                        writecom(0x80+0x40+9);//移动到分
                                        writecom(0x0e);         //打开光标
                                        while(1)
                                        {
                                                if(key2==0)
                                                {
                                                        delay(10);
                                                        if(key2==0)
                                                        {
                                                                while(!key2);
                                                                key2sum=0;
                                                                break;
                                                        }
                                                }
                                                if(key3==0)
                                                {
                                                        delay(10);
                                                        if(key3==2)
                                                        {
                                                                while(!key3);
                                                                alarm_m++;
                                                                if(alarm_m==60)
                                                                {alarm_m=0;}
                                                                display_alarm();
                                                                writecom(0x80+0x40+9);
                                                        }
                                                }
                                        }
                                }
                                if(key2sum==0)                         //设置完毕,归位
                                {       
                                        writecom(0x0c);
                                }
                        }
                }
        }
}

void main()
{       

        unsigned int flag0=0,flag1=0,flag2=0;
  initlcd();
        inittimer();
        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;        //设置为准双向口
        buz=1;
        while(1)
        {
                        function();
                if(pattern==0)//时间界面
                {
                        if(flag0==0)
                        {
                                writecom(0x40);
                                flag0=2;
                        }
                        display_time();
                        flag1=0;

                }
                if(pattern==1)//闹钟界面
                {
                        if(flag1==0)
                        {
                                writecom(0x01);
                                flag1=2;
                        }
                        display_alarm();
                        flag0=0;
                }
       
                if((sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in1==1)||(sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in2==1))
                {
                        delay();
                        while((sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in1==1)||(sw==1&&hour==alarm_h&&min==alarm_m&&hood==1&&in2==1))
                        {
                                beep();
                        }
                }
                if((sw==1&&hour==alarm_h&&min>=alarm_m&&in1==1&&hood==1)||(sw==1&&hour==alarm_h&&min>=alarm_m&&in2==1&&hood==1))
                                {
                        delay();
                        while((sw==1&&hour==alarm_h&&min>=alarm_m&&in1==1&&hood==1)||(sw==1&&hour==alarm_h&&min>=alarm_m&&in2==1&&hood==1))
                        {
                                beep();
                        }
                }
                if((sw==1&&hour>=alarm_h&&in1==1&&hood==1)||(sw==1&&hour>=alarm_h&&in2==1&&hood==1))       
                        {
                        delay();
                        while((sw==1&&hour>=alarm_h&&in1==1&&hood==1)||(sw==1&&hour>=alarm_h&&in2==1&&hood==1))
                        {
                                beep();
                        }
                }
                        if(hood==1)
                                led=1;
                        if(hood==0)
                          led=0;
        }       
}
void beep()
{
       
        for(i=0;i<100;i++)
{
  delay();
        buz=~buz;
        EA=1;

}

}
void timer0_isr() interrupt 1 //定时器中断服务函数
{
       
        count++;
        if(count==19)//1s
        {
                sec++;
                count=0;
        }
        if(sec==60)
        {
                min++;
                sec=0;
        }
        if(min==60)
        {
                hour++;
                min=0;
        }
        if(hour==24)
        {
                hour=0;
        }

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

使用道具 举报

沙发
ID:235200 发表于 2023-12-29 18:56 | 只看该作者
先调节LCD1602旁的电位器到有点阵出现为止
回复

使用道具 举报

板凳
ID:161164 发表于 2023-12-29 22:43 | 只看该作者
E脚信号时间太短
STC15是1T单片机
以11.0592MHz速度运行
E=1;E=0;只有90ns



回复

使用道具 举报

地板
ID:262 发表于 2023-12-30 03:05 | 只看该作者
来看一下51hei论坛里面解决此问题的痛苦经历吧:
51hei搜索框输入"1602 方块"或者"1602 黑块"或者"1602 白块"或者"1602 格":

这个是io口设置问题,最终搞定了:http://www.51hei.com/bbs/dpj-199732-1.html
http://www.51hei.com/bbs/dpj-168643-1.html
http://www.51hei.com/bbs/dpj-208189-1.html
http://www.51hei.com/bbs/dpj-210690-1.html

既有可能是软件问题也有硬件问题
http://www.51hei.com/bbs/dpj-187378-1.html
http://www.51hei.com/bbs/dpj-160754-1.html
回复

使用道具 举报

5#
ID:517951 发表于 2023-12-30 07:51 | 只看该作者
想要1602正常显示, 需要调整V0脚电压, 过高就是全黑块, 过低就是什么都没有. 在就是初始化时序不对,导致的
回复

使用道具 举报

6#
ID:205485 发表于 2023-12-30 13:12 | 只看该作者
这种情况大部分都是调整对比度解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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