久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機電路,LCD1602全是黑塊,對比度也調過了,會是什么問題導致的?

查看數: 4120 | 評論數: 8 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-5-26 17:53

正文摘要:

代碼如下,仿真用stc89c52,實際用的是IAP15W4K58S4。 用protues仿真沒有問題,電阻電容都能測出來。可實際用自己焊的液晶屏卻全是黑塊,對比度也調過了。 現在還有一個疑問是,4052數據選擇器的輸出端與單片機相 ...

回復

ID:57657 發表于 2021-5-27 12:19
杜邦線壓線的時候,可能有一股導線沒壓進去,與另一根短路,90%都是此問題導致的。
ID:927554 發表于 2021-5-27 11:58
新新科技 發表于 2021-5-27 11:14
通常是某個接線錯誤導致,軟件無問題,就先再次認真核對接線吧。

兩個555和數據選擇器的輸出都沒錯,會不會主要是芯片哪里的代碼有沖突,或者是延時函數的問題?
ID:928067 發表于 2021-5-27 11:54
是要把delay函數改掉嗎?里面的值是要改小還是改大?
改delay_us還是改delay_ms?
ID:927554 發表于 2021-5-27 11:17
liqingb 發表于 2021-5-27 10:39
我測試過可以的,我用的是24m晶振,你把時間該小一些試試

如果是改delay的話,應該在原有基礎上如何改進?
ID:71233 發表于 2021-5-27 11:14
通常是某個接線錯誤導致,軟件無問題,就先再次認真核對接線吧。
ID:927554 發表于 2021-5-27 11:13
liqingb 發表于 2021-5-27 10:39
我測試過可以的,我用的是24m晶振,你把時間該小一些試試

是要把delay函數改掉嗎?里面的值是要改小還是改大?
改delay_us還是改delay_ms?
ID:277948 發表于 2021-5-27 10:39
我測試過可以的,我用的是24m晶振,你把時間該小一些試試
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++;
}

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区在线 | 91偷拍精品一区二区三区 | 一级在线观看 | 亚洲免费福利视频 | 婷婷激情综合 | gav成人免费播放视频 | 国产男女猛烈无遮掩视频免费网站 | 欧美精品在线免费 | 中文字幕在线观看视频一区 | 亚洲国产成人精品女人久久久 | 亚洲视频中文字幕 | 欧美不卡网站 | 精品国产一区二区三区久久 | 国产在线观看一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 毛片区| 91一区二区在线观看 | caoporn视频在线| 亚洲乱码国产乱码精品精的特点 | 久草视频网站 | 最新伦理片 | 91久久 | 日本黄色免费视频 | av国产精品毛片一区二区小说 | 国产高清在线 | 99只有精品| 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 玖操| 国产不卡一区 | 日本高清不卡视频 | 欧美一区二区三区四区视频 | 日韩欧美精品一区 | 久久成人激情 | 日韩高清一区 | 涩色视频在线观看 | 日韩精品成人 | av在线天堂| 国产精品免费看 | 国产精品久久久久久久久久软件 | 午夜久久av | 夜夜精品浪潮av一区二区三区 |