找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电路,LCD1602全是黑块,对比度也调过了,会是什么问题导致的?

[复制链接]
跳转到指定楼层
楼主
ID:927554 发表于 2021-5-26 17:53 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
代码如下,仿真用stc89c52,实际用的是IAP15W4K58S4。
用protues仿真没有问题,电阻电容都能测出来。可实际用自己焊的液晶屏却全是黑块,对比度也调过了。
现在还有一个疑问是,4052数据选择器的输出端与单片机相连的引脚没有在代码里定义,不知道有没关系?可是没有定义时,proteus也能正常运行。
或者有没有存在其他问题?
求大佬指教。

1622022768123.jpg (688.86 KB, 下载次数: 26)

1622022768123.jpg

1622022798844.jpg (1.17 MB, 下载次数: 19)

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

使用道具 举报

沙发
ID:927554 发表于 2021-5-26 18:00 | 只看该作者
#include<STC15.h>

#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit R=P1^0;
sbit C=P1^1;

sbit A1=P1^3;          
sbit A0=P1^4;
sbit RW=P2^5;          //读写选择位,P2.5引脚
sbit RS=P2^6;          //寄存器选择位,P2.6引脚
sbit E=P2^7;          //使能信号位,P2.7引脚
#define FR P3^5

//sbit 位变量名=SFR名称^变量位地址值

#define LCD_data  P0    //定义P0.0至p0.7接口                                       
//uchar   code  table1[16]={0x52,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52};
//uchar   code  table2[16]={0x43,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x46};

uchar   code  table1[16]={"R=             R"};
uchar   code  table2[16]={"C=            pF"};

uchar code f_table[88]={13,14,15,16,17,        18,        19,        20,        21,        22,        23,        24,        25,        26,        27,        28,        29,        30,        31,        32,        33,        34,        35,        36,        37,        38,        39,        40,        41,        42,        43,        44,        45,        46,        47,        48,        49,        50,        51,        52,        53,        54,        55,        56,        57,        58,        59,        60,        61,        62,        63,        64,        65,        66,        67,        68,        69,        70,        71,        72,        73,        74,        75,        76,        77,        78,        79,        80,        81,        82,        83,        84,        85,        86,        87,        88,        89,        90,        91,        92,        93,        94,        95,        96,        97,        98,        99,        100};
uchar code f_correct[88]={9,10,        11,        12,        12,        12,        13,        14,        15,        16,        17,        18,        18,        18,        19,        20,        21,        21,        22,        23,        24,        25,        25,        26,        26,        27,        28,        29,        29,        30,        30,        31,        32,        33,        33,        34,        35,        35,        36,        37,        38,        38,        39,        40,        41,        41,        42,        42,        43,        44,        45,        45,        46,        47,        48,        49,        49,        50,        51,        51,        52,        53,        54,        54,        55,        55,        56,        57,        57,        58,        59,        60,        60,        62,        62,        63,        64,        64,        65,        66,        66,        67,        67,        68,        69,        70,        71,        71,};

uchar a8,a7,a6,a5,a4,a3,a2,a1,a0;
uchar flag;
unsigned long cnt,cnt1,cnt2;
unsigned m1, m2, m3, m4;

uchar f_cnt;

// char:8位字符型数据类型

/********************************/

void delay_us(); //18us
void delay_ms(uint);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_dat(uchar dat);
void lcd_init();
void lcd_display(uchar add,uchar dat);
/***********************************/

void delay_us()          //延时18us?
{
        uchar x;
        for(x=5;x>0;x--);    //5个时钟周期
}

void delay_ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=2460;y>0;y--);    //延迟时间为123*z
}

void lcd_write_com(uchar com)    //LCD写指令
{
  E=0;
  RS=0;
  RW=0;
  delay_us();
  LCD_data=com;
  E=1;           //高脉冲写入数据
  delay_us();
  E=0;
}
void lcd_write_dat(uchar dat)    //LCD写数据
{
  E=0;
  RS=1;
  RW=0;
  delay_us();
  LCD_data=dat;
  E=1;           //高脉冲写入数据
  delay_us();
  E=0;
}
void lcd_init()                  //lcd初始化
{
    delay_ms(15);
        lcd_write_com(0x38);    //十六进制数,设置16x2显示,5x7点阵,8位数据接口
        delay_ms(10);
        lcd_write_com(0x0c);    //设置开始显示不显示光标
        delay_ms(10);
        lcd_write_com(0x06);    //写一个字符后地址指针加1
        delay_ms(10);
        lcd_write_com(0x01);        //显示清零数据指针清零(清屏)
        delay_ms(2);
       
       
}
void timer_init(void)  //定时器初始化
{
        TMOD=0X51;
        PT0=1;     /*中断优先*/
        TH0=0x4c;
        TL0=0x00;
        TH1=0;
        TL1=0;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
        EA=1;       
}
void lcd_display(uchar add,uchar dat)           //lcd显示(地址,数据)
{

        lcd_write_com(add);    //地址
       
        lcd_write_dat(dat);    //数据
        delay_us();

}
void real_display(void)
{
                       
            if(!R)    //写“R=……R”
                        {
                        A1=A0=0;       
                lcd_display(0x80,table1[0]);    //R,0x80表示第一位地址
                        lcd_display(0x80+1,table1[1]);    //=
                        lcd_display(0x80+14,table1[14]);          //R,正常
                        lcd_display(0x80+15,table1[15]);          
                        }

                        else if(!C)    //写“C=……pF”
                        {
                        A0=0;A1=1;
                        lcd_display(0x80,table2[0]);    //C
                        lcd_display(0x80+1,table2[1]);    //=
                        lcd_display(0x80+14,table2[14]);          //P
                        lcd_display(0x80+15,table2[15]);          //F
                        }
                       
                        //由高位往低位写入数据
                        if(a8)
                                lcd_display(0x80+2,0x30+a8);        //0x30表示0
                        else
                                lcd_display(0x80+2,' ');

                        if(a8||a7)
                                  lcd_display(0x80+3,0x30+a7);
                        else
                                  lcd_display(0x80+3,' ');

                        if(a8||a7||a6)
                                  lcd_display(0x80+4,0x30+a6);   
                        else
                                  lcd_display(0x80+4,' ');

                        if(a8||a7||a6||a5)
                                lcd_display(0x80+5,0x30+a5);   
                        else
                                 lcd_display(0x80+5,' ');

                        if(a8||a7||a6||a5||a4)
                                lcd_display(0x80+6,0x30+a4);       
                        else
                                   lcd_display(0x80+6,' ');

                        if(a8||a7||a6||a5||a4||a3)
                                lcd_display(0x80+7,0x30+a3);       
                        else
                            lcd_display(0x80+7,' ');

                        if(a8||a7||a6||a5||a4||a3||a2)
                                lcd_display(0x80+8,0x30+a2);
                        else
                                lcd_display(0x80+8,' ');

                        lcd_display(0x80+9,0x30+a1);

                        lcd_display(0x80+10,0x2e);    //0x2e表示小数点
                        lcd_display(0x80+11,0x30+a0);               





}


void correct(void)                        //误差修正函数
{
        uchar i,k;
        unsigned long wucha;
        if(cnt<1000000)                   //100KHz以内的修正
        {
                if(cnt>9800&&cnt<21000)   cnt-=1;
                if(cnt>=21000&&cnt<39000)   cnt-=2;
                if(cnt>=39000&&cnt<48000)   cnt-=3;
                if(cnt>=48000&&cnt<57000)   cnt-=4;
                if(cnt>=57000&&cnt<80000)   cnt-=5;
                if(cnt>=80000&&cnt<91000)          cnt-=6;
                if(cnt>=91000&&cnt<109000)  cnt-=7;
                if(cnt>=109000&&cnt<119000) cnt-=8;
                if(cnt>=119000&&cnt<130000) cnt-=9;
                if(cnt>=130000&&cnt<=1000000)
                {
                        k=cnt/1000;
                        for(i=0;i<88;i++)
                        {
                                if(k==f_table[i])
                                {
                                        cnt-=f_correct[i];
                                }
                        }
                }
               
               
        }
        if(cnt>10000000)         
        {
                wucha=(cnt/1000)*73065/100000;
                cnt-=wucha;
        }
}



void main()
{  
        P1M1 = 0x00;
        P1M0 = 0x00;
        P0M1 = 0x00;
        P0M0 = 0x00;
        P2M1 = 0x00;
        P2M0 = 0x00;
        P3M1 = 0x00;
        P3M0 = 0x00;

    timer_init();    //定时器初始化
        lcd_init();    //lcd初始化
        while(1)
        {               
                   if(flag==1)
                   {
                        real_display();
                        flag=0;
                        }
        }
       
}

void timer0() interrupt 1    //定时器0的中断函数,interrupt中断关键字,1定时器0的中断号
{
        uchar timer0;

        //定时时间50ms,主振频率11.0592MHz
        //机器周期=12/主振频率
        //计数次数=定时时间/机器周期=46080
        //65536-46080=19456
        //4c00

        TH0=0x4c;          //高位
        TL0=0x00;          //低位
        timer0++;
        if(timer0==20)    //60-32+1=19
        {
                TR1=0;          //关闭的计数器
                EA=0;
                cnt=TL1+TH1*256+f_cnt*65536;
                correct();
                if(!R)
                {                                                                    //cnt1为待测值
                cnt1=10000000/(2*0.693*cnt)-165;    //1/cnt为NE555脉冲周期,1/cnt1=0.693*(R+2RX)*10^(-7)

//                cnt1=1/(1/(10000000/(2*0.693*cnt)-(1000+2*560)/2)-1/(47*1000000))/11.0592*12;
                }
                else if(!C)
                {
                cnt1=1000000000/(0.693*3*510*cnt);    //1/cnt=0.644*(3*510*10^3)*CX

                }
                timer0=0;

                a8=cnt1%100000000/10000000;
                a7=cnt1%10000000/1000000;
                a6=cnt1%1000000/100000;
                a5=cnt1%100000/10000;
                a4=cnt1%10000/1000;
                a3=cnt1%1000/100;
                a2=cnt1%100/10;
                a1=cnt1%10;

                if(!R)
                {
                cnt2=10000000*10/(2*0.693*cnt)-165;
                  a0=cnt2%10;
                }
                else if(!C)
                {
                cnt2=1000000000*10/(0.693*3*510*cnt);
                a0=cnt2%10;
                }

                flag=1;
             TH1=0;
                TL1=0;
                TH0=0x4c;
             TL0=0x00;
                cnt=0;
                f_cnt=0;
                EA=1;
                TR1=1;           //打开计数器
       
        }

}       

void int1() interrupt 3
{
         f_cnt++;
}
回复

使用道具 举报

板凳
ID:277948 发表于 2021-5-27 10:39 | 只看该作者
我测试过可以的,我用的是24m晶振,你把时间该小一些试试
回复

使用道具 举报

地板
ID:927554 发表于 2021-5-27 11:13 来自手机 | 只看该作者
liqingb 发表于 2021-5-27 10:39
我测试过可以的,我用的是24m晶振,你把时间该小一些试试

是要把delay函数改掉吗?里面的值是要改小还是改大?
改delay_us还是改delay_ms?
回复

使用道具 举报

5#
ID:71233 发表于 2021-5-27 11:14 | 只看该作者
通常是某个接线错误导致,软件无问题,就先再次认真核对接线吧。
回复

使用道具 举报

6#
ID:927554 发表于 2021-5-27 11:17 来自手机 | 只看该作者
liqingb 发表于 2021-5-27 10:39
我测试过可以的,我用的是24m晶振,你把时间该小一些试试

如果是改delay的话,应该在原有基础上如何改进?
回复

使用道具 举报

7#
ID:928067 发表于 2021-5-27 11:54 | 只看该作者
是要把delay函数改掉吗?里面的值是要改小还是改大?
改delay_us还是改delay_ms?
回复

使用道具 举报

8#
ID:927554 发表于 2021-5-27 11:58 来自手机 | 只看该作者
新新科技 发表于 2021-5-27 11:14
通常是某个接线错误导致,软件无问题,就先再次认真核对接线吧。

两个555和数据选择器的输出都没错,会不会主要是芯片哪里的代码有冲突,或者是延时函数的问题?
回复

使用道具 举报

9#
ID:57657 发表于 2021-5-27 12:19 | 只看该作者
杜邦线压线的时候,可能有一股导线没压进去,与另一根短路,90%都是此问题导致的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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