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

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

QQ登錄

只需一步,快速開(kāi)始

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

求助 DS1302在LCD12864上顯示的時(shí)鐘的數(shù)字在閃爍,就好像亂碼,看不到一個(gè)數(shù)字那樣

[復(fù)制鏈接]
ID:356979 發(fā)表于 2018-6-22 23:36 | 顯示全部樓層 |閱讀模式
/*        TSCLK  -  P10
        TIO    -  P11
        TRST   -  P12   */
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,miao,fen,shi,ri,yue,nian,week,temp,flag,key1n;

#define yh 0x80  //第一行的初始位置
#define er 0x90 //第二行初始位置
#define san 0x88
#define si 0x98
void write_week(uchar week);

/*12864端口定義*/
#define LCD_data  P0             //數(shù)據(jù)口
sbit LCD_RS  =  P3^5;            //寄存器選擇輸入
sbit LCD_RW  =  P3^6;            //液晶讀/寫控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;            //串/并方式控制
sbit wela    =  P2^6;
sbit dula    =  P2^7;

sbit SCLK=P1^0;
sbit IO=P1^1;   
sbit RST=P1^2;   
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit key=P3^3;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uchar code dis1[]={"20"} ;
uchar code dis2[]={""};
uchar code dis3[]={"    "};
uchar code dis4[]={"      "};

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

void delay(int ms)//延時(shí)函數(shù)(2ms)
{
    while(ms--)
        {
      uchar i;

          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}

bit lcd_busy() //檢查L(zhǎng)CD忙狀態(tài)
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}

void lcd_wcmd(uchar cmd) //寫指令數(shù)據(jù)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}

void lcd_wdat(uchar dat) //寫顯示數(shù)據(jù)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}

void lcd_init()//LCD初始化設(shè)定
{

    LCD_PSB = 1;         //并口方式

    lcd_wcmd(0x34);      //擴(kuò)充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //顯示開(kāi),關(guān)光標(biāo)
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
    delay(5);

}




void lcd_pos(uchar X,uchar Y)  /*設(shè)定顯示位置    */
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);     //顯示地址

}

/*DS1302*/
void write_byte(uchar dat) //寫一個(gè)字節(jié)
{
        ACC=dat;
        RST=1;
        for(a=8;a>0;a--)  //循環(huán)8次移位
        {
                IO=ACC0;
                SCLK=0;          //先把時(shí)鐘線拉低
                SCLK=1;          //把時(shí)鐘線拉高,鎖存數(shù)據(jù)
                ACC=ACC>>1;
        }
}

uchar read_byte() //讀一個(gè)字節(jié)
{
        RST=1;
        for(a=8;a>0;a--)
        {
                ACC7=IO;
                SCLK=1;
                SCLK=0;
                ACC=ACC>>1;

        }
        return (ACC);
}

void write_1302(uchar add,uchar dat)//向DS1302寫函數(shù),指定寫入地址、數(shù)據(jù)
{

        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        write_byte(dat);
        SCLK=1;
        RST=0;         //數(shù)據(jù)傳送中止
}

uchar read_1302(uchar add)        //從DS1302讀取數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來(lái)源地址
{
        uchar temp;
        RST=0;         //芯片處于復(fù)位狀態(tài)
        SCLK=0;         //清零
        RST=1;        //芯片開(kāi)始工作
        write_byte(add);
        temp=read_byte();
        SCLK=1;
        RST=0;
        return(temp);
}

uchar BCD_Decimal(uchar bcd) //BDC碼轉(zhuǎn)為十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制
{
        uchar Decimal;
        Decimal=bcd>>4;
        return(Decimal=Decimal*10+(bcd&=0x0F));
}

void ds1302a_init()
{
        RST=0;
        SCLK=0;
        //write_1302(0x80,miao|0x00);//允許寫
        write_1302(0x8e,0x00);

        write_1302(0xc0,0xfe);
        write_1302(0xc2,0xff);
        write_1302(0x80,0x20);
        write_1302(0x82,0x10);
        write_1302(0x84,0x12);
        write_1302(0x86,0x06);
        write_1302(0x88,0x06);
        write_1302(0x8a,0x18);
        write_1302(0x8e,0x80);
}

/*void ds1302b_init()
{
        RST=0;
        SCLK=0;
        write_1302(0x80,ri|0x00);
}*/

void write_sfm(uchar dat)//寫時(shí)分秒
{
        uchar gw,sw;          
        //lcd_pos(1,0) ;
        //lcd_wcmd(er);
        gw=dat%10;
        sw=dat/10;
        lcd_wdat(0x30+sw);
        lcd_wdat(0x30+gw);
                  
        /*lcd_wdat(0x30+shi/10);
        lcd_wdat(0x30+shi%10);
        lcd_wdat(':');
        lcd_wdat(' ');
        lcd_wdat(0x30+fen/10);
        lcd_wdat(0x30+fen%10);
        lcd_wdat(':');
        lcd_wdat(' ');
        lcd_wdat(0x30+miao/10);
        lcd_wdat(0x30+miao%10);*/
       
       

       
                               
}

void write_nyr(uchar dat)        //寫年月日
{
    uchar gw,sw;
        //lcd_pos(0,1);
        //lcd_wcmd(yh);
        gw=dat%10;
        sw=dat/10;
        lcd_wdat(0x30+sw);
        lcd_wdat(0x30+gw);
       
       
        /*lcd_wdat(0x30+nian/10);
        lcd_wdat(0x30+nian%10);
        lcd_wdat('-');
        lcd_wdat('-');
        lcd_wdat(0x30+yue/10);
        lcd_wdat(0x30+yue%10);
        lcd_wdat('-');
        lcd_wdat('-');
        lcd_wdat(0x30+ri/10);
        lcd_wdat(0x30+ri%10);*/
       
          
       

}

void write_week(uchar week)//寫星期函數(shù)
{                  
        lcd_pos(0,6);//lcd_wcmd(yh+0x0b);
        lcd_wdat(' ');
        switch(week)
        {
                case 1:lcd_wdat('M');//delay(5);
                           lcd_wdat('O');//delay(5);
                           lcd_wdat('N');
                           break;
          
                case 2:lcd_wdat('T');//delay(5);
                           lcd_wdat('U');//delay(5);
                           lcd_wdat('E');
                           break;
               
                case 3:lcd_wdat('W');//delay(5);
                            lcd_wdat('E');//delay(5);
                            lcd_wdat('D');
                           break;
               
                case 4:lcd_wdat('T');//delay(5);
                           lcd_wdat('H');//delay(5);
                           lcd_wdat('U');
                           break;
               
                case 5:lcd_wdat('F');//delay(5);   
                           lcd_wdat('R');//delay(5);
                           lcd_wdat('I');
                           break;
               
                case 6:lcd_wdat('S');//delay(5);
                           lcd_wdat('T');//delay(5);
                           lcd_wdat('A');
                           break;
               
                case 7:lcd_wdat('S');//delay(5);
                           lcd_wdat('U');//delay(5);
                           lcd_wdat('N');
                           break;
                }
       
}

void write_name(uint *s1)//寫姓名
{       
        lcd_pos(2,1);//lcd_wcmd(san);
        lcd_wdat(':');
        while(*s1!=0)
        {
                lcd_wdat(*s1);
                s1++;
                delay(5);
        }       
}

void write_num(uint *s2)//學(xué)號(hào)
{
        lcd_pos(3,1);//lcd_wcmd(si);
        lcd_wdat(':');
        while(*s2!=0)
        {
                lcd_wdat(*s2);
                s2++;
                delay(5);
        }       

}

void Clr_Screen()//清屏命令
{
  //考慮到前面出現(xiàn)0x34
   lcd_wcmd(0x01);
   delay(100);
  }


void init()//串口初始化
{
        TMOD=0x11;//00000001定時(shí)計(jì)數(shù)器0選擇方式1,16位定時(shí)計(jì)數(shù)器
        TH0=0;   
        TL0=0;
        EA=1;        //開(kāi)全局中斷
        ET0=1;        //定時(shí)計(jì)數(shù)器0中斷使能控制位
        TR0=1;        //定時(shí)器T0開(kāi)始計(jì)數(shù)

}

void cmg(void)//數(shù)碼管鎖存函數(shù)
{
        dula=1;
        P0=0x00;
        dula=0;
        wela=1;
        P0=0x00;
        wela=0;
}

void keyscan()
{
        if(key1==0)
        {
                delay(5);
                if(key1==0)
                {
                        while(!key1);
                        key1n++;
                        if(key1n==9)
                                key1n=1;
                        switch(key1n)
                        {
                                case 1: TR0=0;         //miao
                                                lcd_wcmd(0x90+4);
                                                lcd_wcmd(0x0f);
                                                temp=(miao)/10*16+(miao)%10        ;
                                                write_1302(0x8e,0x00);
                                                   write_1302(0x80,0x80|temp);//miao
                                                   write_1302(0x8e,0x80);
                                                   break;
                                case 2: lcd_wcmd(0x90+2); //fen
                                            lcd_wcmd(0x0f);
                                                break;
                                case 3: lcd_wcmd(0x90);        //shi
                                                lcd_wcmd(0x0f);
                                                break;
                                case 4: lcd_wcmd(0x80+7); //week
                                                lcd_wcmd(0x0f);
                                                break;
                            case 5: lcd_wcmd(0x80+5);  //ri
                                                lcd_wcmd(0x0f);
                                                break;
                                case 6: lcd_wcmd(0x80+3);         //yue
                                                lcd_wcmd(0x0f);
                                                break;
                                case 7: lcd_wcmd(0x80+1);        //nian
                                                lcd_wcmd(0x0f);
                                                break;
                                case 8: lcd_wcmd(0x0c);
                                                TR0=1;
                                                temp=(miao)/10*16+(miao)%10;//將十進(jìn)制變成十六進(jìn)制
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x80,0x00|temp);//miao
                                                   write_1302(0x8e,0x80);
                                    break;
                        }
                }
        }
       
               

        if(key1n!=0)//當(dāng)key1按下以下。再按以下鍵才有效
        {
       
                if(key2==0)  //上調(diào)鍵
                {
                        delay(5);
                        if(key2==0)
                        {
                                while(!key2);
                                switch(key1n)
                                {
                                        case 1: miao++;
                                                        if(miao==60)
                                                                miao=0;
                                                        write_sfm(miao);
                                                        lcd_pos(1,4);
                                                        temp=(miao)/10*16+(miao)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x80,0x80|temp);
                                                           write_1302(0x8e,0x80);
                                                        lcd_wcmd(0x90+4);
                                                        break;
                                        case 2: fen++;
                                                        if(fen==60)
                                                                fen=0;
                                                        write_sfm(fen);
                                                        temp=(fen)/10*16+(fen)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x82,temp);
                                                           write_1302(0x8e,0x80);
                                                        lcd_wcmd(0x90+2);
                                                        break;
                                        case 3: shi++;
                                                        if(shi==24)
                                                                shi=0;
                                                        write_sfm(shi);
                                                        temp=(shi)/10*16+(shi)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x84,temp);
                                                           write_1302(0x8e,0x80);
                                        lcd_wcmd(0x90);
                                                        break;
                                        case 4: week++;
                                                        if(week==8)
                                                        week=0;
                                                        write_week(week);
                                                        lcd_wcmd(0x80+7);
                                                        lcd_wcmd(0x80+6) ;
                                                        break;
                                        case 5: ri++;
                                                        if(ri==31)
                                                                ri=0;
                                                        write_nyr(ri);
                                                        temp=(ri)/10*16+(ri)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x86,temp);
                                                           write_1302(0x8e,0x80);
                                                        lcd_wcmd(0x80+5);
                                                        break;
                                        case 6: yue++;
                                                        if(yue==13)
                                                        yue=0;
                                                        write_nyr(yue);
                                                        temp=(yue)/10*16+(yue)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x88,temp);
                                                           write_1302(0x8e,0x80);
                                                        lcd_wcmd(0x80+3);
                                                        break;
                                        case 7:
                                                        nian++;
                                    if(nian==100)
                                                        nian=0;
                                                        write_nyr(nian);
                                                        temp=(nian)/10*16+(nian)%10;
                                                           write_1302(0x8e,0x00);
                                                           write_1302(0x8a,temp);
                                                           write_1302(0x8e,0x80);
                                                        lcd_wcmd(0x80+1);
                                                        break;
                                }
                        }
        }
        if(key3==0)
        {
                delay(5);
                if(key3==0)
                {
                        while(!key3);
                        switch(key1n)
                        {
                                 case 1: miao--;
                                                if(miao==-1)
                                                        miao=59;                                                       
                                                write_sfm(miao);
                                                lcd_wcmd(0x90+4);
                                                break;

                                 case 2:fen--;
                                        if(fen==-1)
                                                           fen=59;
                                                write_sfm(fen);
                                            temp=(fen)/10*16+(fen)%10;
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x82,temp);
                                                   write_1302(0x8e,0x80);
                                                lcd_wcmd(0x90+2);
                                                break;
                                 case 3:shi--;
                                                   if(shi==-1)
                                                        shi=23;
                                                write_sfm(shi);
                                                temp=(shi)/10*16+(shi)%10;
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x84,temp);
                                                   write_1302(0x8e,0x80);
                                                lcd_wcmd(0x90);
                                                break;
                                case 4: week--;
                                                if(week==-1)
                                                        week=7;
                                                write_week(week);
                                                lcd_wcmd(0x80+7);
                                                lcd_wcmd(0x80+6);
                                                break;
                                case 5: ri--;
                                                if(ri==-1)
                                                        ri=30;
                                                write_nyr(ri);
                                                temp=(ri)/10*16+(ri)%10;
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x86,temp);
                                                   write_1302(0x8e,0x80);
                                                  lcd_wcmd(0x80+5);
                                                break;
                                case 6: yue--;
                                                if(yue==-1)
                                                        yue=12;
                                                write_nyr(yue);
                                                temp=(yue)/10*16+(yue)%10;
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x88,temp);
                                                   write_1302(0x8e,0x80);
                                                lcd_wcmd(0x80+3);
                                                break;       
                                case 7: nian--;
                                                 if(nian==-1)
                                                        nian=99;
                                                write_nyr(nian);
                                            temp=(nian)/10*16+(nian)%10;
                                                   write_1302(0x8e,0x00);
                                                   write_1302(0x8a,temp);
                                                   write_1302(0x8e,0x80);
                                                lcd_wcmd(0x80+1);
                                                break;
                                }
                         }

                }
        }
}



   main()//主函數(shù)
{
    uchar i;
       
    delay(10);                 //延時(shí)
    wela=0;
        dula=0;
    cmg();//數(shù)碼管鎖存

        ds1302a_init();
        //ds1302b_init();
        init();       
    lcd_init();                //初始化LCD            

       
    lcd_pos(0,0);             //設(shè)置顯示位置為第一行的第1個(gè)字符
     i = 0;
    while(dis1[i] != '\0')
     {                         //顯示字符
       lcd_wdat(dis1[i]);
       i++;
     }

    lcd_pos(1,0);             //設(shè)置顯示位置為第二行的第1個(gè)字符
     i = 0;
    while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);      //顯示字符
       i++;
     }        

         lcd_pos(2,0);             //設(shè)置顯示位置為第三行的第1個(gè)字符
     i = 0;
    while(dis3[i] != '\0')
     {
       lcd_wdat(dis3[i]);      //顯示字符
       i++;
     }

         lcd_pos(3,0);             //設(shè)置顯示位置為第四行的第1個(gè)字符
     i = 0;
    while(dis4[i] != '\0')
     {
       lcd_wdat(dis4[i]);      //顯示字符
       i++;
     }        
                
     while(1)
         {
                 keyscan();
         }
         
}


void timer0() interrupt 1  //中斷函數(shù)
{
        miao = BCD_Decimal(read_1302(0x81));
        fen = BCD_Decimal(read_1302(0x83));
        shi  = BCD_Decimal(read_1302(0x85));
        ri  = BCD_Decimal(read_1302(0x87));
        yue = BCD_Decimal(read_1302(0x89));
        nian=BCD_Decimal(read_1302(0x8d));
        week=BCD_Decimal(read_1302(0x8b));
       
        lcd_pos(1,4);       
        write_sfm(miao);

        lcd_pos(1,3);
        lcd_wdat(':');

        lcd_pos(1,2);
        write_sfm(fen);
       
        lcd_pos(1,1);
        lcd_wdat(':');

        lcd_pos(1,0);
        write_sfm(shi);

        lcd_pos(0,5);
        write_nyr(ri);

        lcd_pos(0,4);
        lcd_wdat('-');
        lcd_wdat('-');

        lcd_pos(0,3);
    write_nyr(yue);

        lcd_pos(0,2);
        lcd_wdat(0x2d);
        lcd_wdat(0x2d);

        lcd_pos(0,1);
        write_nyr(nian);

       
}


回復(fù)

使用道具 舉報(bào)

ID:356979 發(fā)表于 2018-6-22 23:43 | 顯示全部樓層
弄了很久都不行,有沒(méi)有大神可以幫幫忙
回復(fù)

使用道具 舉報(bào)

ID:303383 發(fā)表于 2018-6-23 08:44 | 顯示全部樓層
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

ID:295783 發(fā)表于 2018-6-23 10:39 | 顯示全部樓層
你的程序太長(zhǎng)了 我給你一點(diǎn)建議你自己查一下
1.有沒(méi)有進(jìn)行初始化 清零
2.延時(shí)問(wèn)題 必須要有延時(shí) 我記得動(dòng)態(tài)顯示好像是一直不停的顯示 是動(dòng)態(tài)的 很快 所以肉眼看到的是靜止的 延時(shí)不能太長(zhǎng)
3.如果你加了按鍵功能的話 看看有沒(méi)有按鍵消抖程序 這個(gè)是必須有的
希望對(duì)你有幫助
回復(fù)

使用道具 舉報(bào)

ID:356979 發(fā)表于 2018-6-23 23:07 | 顯示全部樓層
程序新手 發(fā)表于 2018-6-23 10:39
你的程序太長(zhǎng)了 我給你一點(diǎn)建議你自己查一下
1.有沒(méi)有進(jìn)行初始化 清零
2.延時(shí)問(wèn)題 必須要有延時(shí) 我記得動(dòng) ...

初始化是有的,就是它顯示是亂碼,不是說(shuō)小時(shí)的太快,有對(duì)應(yīng)的向時(shí)鐘顯示,比如顯示了02到03之間它會(huì)閃到其他數(shù)字,而且有些就不是02、03、04的順序顯示下去的
回復(fù)

使用道具 舉報(bào)

ID:356979 發(fā)表于 2018-6-23 23:27 | 顯示全部樓層
今晚弄它突然就行了,但是顯示年的時(shí)候用按鍵調(diào)的時(shí)候出現(xiàn)了兩種情況,第一是調(diào)完之后時(shí)鐘繼續(xù)走時(shí),那個(gè)年還是顯示原來(lái)沒(méi)調(diào)的那個(gè)數(shù),第二就是在調(diào)節(jié)時(shí),一按加鍵或減鍵時(shí)它不是從原來(lái)的那個(gè)數(shù)一直加或減的進(jìn)行,在這種情況下調(diào)完就可以正確顯示,
回復(fù)

使用道具 舉報(bào)

ID:261000 發(fā)表于 2018-6-24 12:29 | 顯示全部樓層
建議一段一段查,,先查端口驅(qū)部分,,硬件也要查一下,io口加上拉電阻“10K。看看。
回復(fù)

使用道具 舉報(bào)

ID:357739 發(fā)表于 2018-6-24 13:18 | 顯示全部樓層
先檢查電路有沒(méi)有問(wèn)題,連的線是串行還是并行的
回復(fù)

使用道具 舉報(bào)

ID:357839 發(fā)表于 2018-6-24 16:06 來(lái)自觸屏版 | 顯示全部樓層
有沒(méi)有可能是你的晶振的頻率調(diào)的不合適 或者LCD時(shí)鐘頻率
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九热这里 | 91精品导航 | 影音先锋中文在线 | av免费网站在线 | jlzzjlzz国产精品久久 | 日韩欧美在线播放 | 中文字幕成人 | 欧美激情亚洲激情 | 91视频网| 久久久久黄 | 日韩精品三区 | 国产在线精品一区二区三区 | 国产91丝袜在线播放 | 欧美一区二区三区四区视频 | 色www精品视频在线观看 | 国产一区中文字幕 | av在线播放网址 | 久艹网站| 久久久久综合 | 欧美日韩一区二区视频在线观看 | 中文字幕在线精品 | 免费一级欧美在线观看视频 | 黄色免费网址大全 | www.国产.com| 国产一区二区毛片 | 欧美亚洲激情 | 欧美日韩在线免费观看 | 国内自拍第一页 | 国产黄色大片在线观看 | 91大片| 国产成人久久精品一区二区三区 | 午夜免费视频 | 久久亚洲国产精品 | 国产免费观看久久黄av片涩av | 欧美大片一区二区 | 中文字幕免费在线 | jav成人av免费播放 | 91色啪| h片在线看 | 成人在线影视 | 99精品国自产在线观看 |