找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1628|回復(fù): 5
收起左側(cè)

為什么我的lcd1602一直是兩排白板

[復(fù)制鏈接]
ID:1107089 發(fā)表于 2023-12-29 17:08 來自觸屏版 | 顯示全部樓層 |閱讀模式
  為什么我的lcd1602一直是兩排白塊,老師說我的是程序有問題但是我不會(huì)改有沒有大佬幫忙看看。因?yàn)槲沂窃诰W(wǎng)上找的別人51的程序,改成15的。老師說我的延時(shí)函數(shù)有問題但是我自己改了一下因?yàn)椴恢涝瓉硎茄訒r(shí)多久我也不會(huì)改。有沒有大佬幫忙看看為什么我的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;//光標(biāo)的移動(dòng)
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)//延時(shí)函數(shù)
{
        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)//延時(shí)函數(shù)
{
        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)//寫數(shù)據(jù)
{
        RS=1;
        RW=0;
        E=0;
        P0=dat;
        delayms(2);
        E=1;
        E=0;       
}

void initlcd() //  lcd1602初始化
{
        writecom(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
        writecom(0x0c);//設(shè)置開顯示,不顯示光標(biāo)
        writecom(0x06);//寫一個(gè)字符后地址指針加1
        writecom(0x01);//顯示清0,數(shù)據(jù)指針清0
}





void display_time()//時(shí)間顯示
{
        unsigned char temp0=0,temp1=0,temp2=0,temp3=0,temp4=0,temp5=0;
        temp0=hour/10;//拆分個(gè)位十位
        temp1=hour%10;
        temp2=min/10;
        temp3=min%10;
        temp4=sec/10;
        temp5=sec%10;
        writecom(0x80+0x40);//第二行顯示
        delay(2);
        writedat(str[temp0]);//顯示時(shí)分秒
        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;//拆分個(gè)位十位
        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);
}


//**************************定時(shí)器************************//
void inittimer()//定時(shí)器初始化
{
        TMOD=0x01;
        TH0=0x3c;//50ms
        TL0=0xb0;
        ET0=1;//開啟定時(shí)器0的中斷
        EA=1;//開啟總中斷
        TR0=1;//啟動(dòng)定時(shí)器0
}

//***********************調(diào)時(shí)功能*********************//
void function()//調(diào)時(shí),鬧鐘功能
{
        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)//時(shí)間界面
        {
                if(key1==0)//判斷是否按下
                {
                        delay(10);
                        if(key1==0)
                        {       
                                while(!key1);//等待松開
                                if(key1sum<3)//按幾下光標(biāo)移到哪一位
                                {key1sum++;
                                EA=0;}
                                else key1sum=0;
                               
                                if(key1sum==1)
                                {       
                                        writecom(0x80+0x40+7);//移動(dòng)到秒
                                        writecom(0x0e);                //光標(biāo)顯示
                                        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);//移動(dòng)到分
                                        writecom(0x0e);                //光標(biāo)顯示
                                        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);//移動(dòng)到時(shí)
                                        writecom(0x0e);                //光標(biāo)顯示
                                        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時(shí)
                                                                {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)//跑時(shí)鐘
                                {
                                        EA=1;
                                        writecom(0x0c);
                                }
                        }
                }
        }
        if(pattern==1)//鬧鐘界面
        {
                if(key1==0)                                              //開關(guān)鬧鐘
                {
                        delay(10);
                        if(key1==0)//檢驗(yàn)是否按下
                        {
                                while(!key1);//等待按鍵松開
                                if(sw==0)
                                {sw=1;}
                                else sw=0;
                                display_alarm();
                        }
                }
                if(key2==0)//檢測(cè)key2是否摁下                         //設(shè)置鬧鐘
                {
                        delay(10);
                        if(key2==0)
                        {
                                while(!key2);//等待松開
                                if(key2sum<2)
                                {key2sum++;}
                                else key2sum=0;
                                if(key2sum==1)
                                {
                                        writecom(0x80+0x40+6);//移動(dòng)到時(shí)
                                        writecom(0x0e);         //打開光標(biāo)
                                        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);//移動(dòng)到分
                                        writecom(0x0e);         //打開光標(biāo)
                                        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)                         //設(shè)置完畢,歸位
                                {       
                                        writecom(0x0c);
                                }
                        }
                }
        }
}

void main()
{       

        unsigned int flag0=0,flag1=0,flag2=0;
  initlcd();
        inittimer();
        P0M1 = 0;        P0M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P2M1 = 0;        P2M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P3M1 = 0;        P3M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P4M1 = 0;        P4M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P5M1 = 0;        P5M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P6M1 = 0;        P6M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P7M1 = 0;        P7M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        buz=1;
        while(1)
        {
                        function();
                if(pattern==0)//時(shí)間界面
                {
                        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 //定時(shí)器中斷服務(wù)函數(shù)
{
       
        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;
        }

}
回復(fù)

使用道具 舉報(bào)

ID:235200 發(fā)表于 2023-12-29 18:56 | 顯示全部樓層
先調(diào)節(jié)LCD1602旁的電位器到有點(diǎn)陣出現(xiàn)為止
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2023-12-29 22:43 | 顯示全部樓層
E腳信號(hào)時(shí)間太短
STC15是1T單片機(jī)
以11.0592MHz速度運(yùn)行
E=1;E=0;只有90ns
2023-12-29_223828.png
2023-12-29_223842.png

回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2023-12-30 03:05 | 顯示全部樓層
來看一下51hei論壇里面解決此問題的痛苦經(jīng)歷吧:
51hei搜索框輸入"1602 方塊"或者"1602 黑塊"或者"1602 白塊"或者"1602 格":

這個(gè)是io口設(shè)置問題,最終搞定了:http://www.torrancerestoration.com/bbs/dpj-199732-1.html
http://www.torrancerestoration.com/bbs/dpj-168643-1.html
http://www.torrancerestoration.com/bbs/dpj-208189-1.html
http://www.torrancerestoration.com/bbs/dpj-210690-1.html

既有可能是軟件問題也有硬件問題
http://www.torrancerestoration.com/bbs/dpj-187378-1.html
http://www.torrancerestoration.com/bbs/dpj-160754-1.html
回復(fù)

使用道具 舉報(bào)

ID:517951 發(fā)表于 2023-12-30 07:51 | 顯示全部樓層
想要1602正常顯示, 需要調(diào)整V0腳電壓, 過高就是全黑塊, 過低就是什么都沒有. 在就是初始化時(shí)序不對(duì),導(dǎo)致的
回復(fù)

使用道具 舉報(bào)

ID:205485 發(fā)表于 2023-12-30 13:12 | 顯示全部樓層
這種情況大部分都是調(diào)整對(duì)比度解決
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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