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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2511|回復: 6
收起左側

求一個12864用ds1302寫的萬年歷

[復制鏈接]
回帖獎勵 50 黑幣 回復本帖可獲得 50 黑幣獎勵! 每人限 5 次(中獎概率 90%)
ID:193608 發表于 2017-5-7 03:38 | 顯示全部樓層 |閱讀模式
求大神給一個12864的ds1302的萬年歷 很著急
回復

使用道具 舉報

ID:194033 發表于 2017-5-7 08:15 來自手機 | 顯示全部樓層
這個是我之前在論壇里別人發的鏈接,也許對你有幫http://pan.baidu.com/s/1o80m8Tc
回復

使用道具 舉報

ID:82765 發表于 2017-5-7 09:06 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

ID:194033 發表于 2017-5-7 09:52 | 顯示全部樓層
這是論壇里別人的分享的 http://pan.baidu.com/s/1o80m8Tc
回復

使用道具 舉報

ID:199277 發表于 2017-5-10 21:04 | 顯示全部樓層
#include <stc12c5a60s2.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
#define LCD_data  P0             //數據口
#define LIE 0xf0             
#define HANG 0x0f

sbit LCD_RS  =  P3^5;            //寄存器選擇輸入
sbit LCD_RW  =  P3^6;            //液晶讀/寫控制
sbit LCD_EN  =  P3^4;            //液晶使能控制
sbit LCD_PSB =  P3^7;
sbit sclk=P2^0;                                         //時鐘模塊
sbit io=P2^1;
sbit ce=P2^2;
sbit beep=P2^3;                                          //蜂鳴器

uchar code dis1[] = {"星期"};
uchar code dis2[] = {"公歷:"};
uchar code dis3[] = {"鬧鐘"};
uchar code dis5[] = {"ON"};
uchar code dis6[] = {"OFF"};
uchar dis4[] = {"零一二8三990123456789四五六七"};
uchar time_data[]={15,6,4,17,23,59,55};//年 周 月 日 時 分 秒
uchar write_add[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar disp[13];
uchar num,knum1,knum3;shi=21,fen,miao;

/*定義數字ascii編碼*/
unsigned char mun_char_table[]={"0123456789abcdef"};

void lcd_pos(uchar X,uchar Y);  //確定顯示位置

void delay1ms(uint ms)                                //延時程序1ms
{
        uint i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}
/*******************************************************************/
/*                                                                 */
/*  延時函數                                                       */
/*                                                                 */
/*******************************************************************/
void delay(int ms)
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}               
/*******************************************************************/
/*                                                                 */
/*檢查LCD忙狀態                                                    */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
{

    bit result;
    P0=0X00;              //關掉數碼管的信號。阻止數碼管受到P0口信號的影響
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delay(1);
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*寫指令數據到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{   

    while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
        delay(1);
    LCD_EN = 1;
        delay(1);
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*寫顯示數據到LCD                                                  */
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
    while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delay(1);
    LCD_EN = 1;
    delay(1);
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化設定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{
    LCD_PSB = 1;         //并口方式   
    lcd_wcmd(0x34);      //擴充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0c);      //顯示開,關光標
    delay(5);
        //lcd_wcmd(0x06);//光標設置
        //delay(5);
    lcd_wcmd(0x01);//清除LCD的顯示內容
    delay(5);
}
/***********************************************************************
                 以上是lcd顯示
***********************************************************************/
/**********************************************************************
                          寫地址
***********************************************************************/
void write_ds1302_byte(uchar add)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sclk=0;
                io=add&0x01;
                add=add>>1;
                sclk=1;       
        }
}
/**********************************************************************
                          寫一個字節
***********************************************************************/
void write_ds1302(uchar add,uchar dat)
{
        ce=0;
        sclk=0;
        ce=1;
        _nop_();
        write_ds1302_byte(add);
        write_ds1302_byte(dat);
        ce=0;
        _nop_();
        io=1;
        sclk=1;
}
/**********************************************************************
                           讀單字節
***********************************************************************/
uchar read_ds1302(uchar add)
{
        uchar i,value;
        ce=0;
        sclk=0;
        ce=1;
        _nop_();
        write_ds1302_byte(add);
        for(i=0;i<8;i++)
        {
                value=value>>1;
                sclk=0;
                if(io)
                {
                        value=value|0x80;       
                }
                sclk=1;
        }
        ce=0;
        _nop_();
        sclk=0;
        _nop_();
        sclk=1;
        io=1;
        return value;
}
/**********************************************************************
                           寫數據
***********************************************************************/
void set_rtc()
{
        uchar i,j,k;
        for(i=0;i<7;i++)
        {
                j=time_data[i]/10;
                k=time_data[i]%10;
                time_data[i]=k+j*16;
        }
        write_ds1302(0x8e,0x00);//去除寫保護
        for(i=0;i<7;i++)
        {
                write_ds1302(write_add[i],time_data[i]);
        }
        write_ds1302(0x8e,0x80);//加寫保護
}

/**********************************************************************
                           讀時間
***********************************************************************/
void read_rtc()
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_data[i]=read_ds1302(read_add[i]);
        }
}

/**********************************************************************
                           bcd碼轉換
***********************************************************************/
void time_pros()
{
        disp[0]=time_data[0]/16;//算出年
        disp[1]=time_data[0]%16;
        disp[2]=time_data[1]%16;//算出周
        disp[3]=time_data[2]/16;//算出月
        disp[4]=time_data[2]%16;
        disp[5]=time_data[3]/16;//算出日
        disp[6]=time_data[3]%16;
        disp[7]=time_data[4]/16;//算出小時
        disp[8]=time_data[4]%16;
        disp[9]=time_data[5]/16;//算出分
        disp[10]=time_data[5]%16;
        disp[11]=time_data[6]/16;//算出秒
        disp[12]=time_data[6]%16;       
}

/**********************************蜂鳴器************************/
void beepplay()
{
        beep=0;
        delay1ms(500);
        beep=1;       
}

/**************整點報時*********************************/
void zhengdian()
{
        uchar hour;
        hour=disp[7]*10+disp[8];
        if(disp[11]==0&&disp[12]==0)                       
                {
                        if(disp[9]==0&&disp[10]==0)
                                {
                                        beepplay();       
                                }
                }                       
}

/*************************************按鍵*********************/
void Matrixkeyscan()
{
        uchar key_lie;                                        //按鍵掃描函數里用來存儲列的變量
        uchar key_hang;                                        //存儲行的變量
        uchar key;                                                //具體按下的鍵值的編碼                                                       

        P1=LIE;                                                     //行為低電平,列為高電平
        key_lie=P1;                                                //讀取IO的數值
        key_lie=key_lie&LIE;                        //與,將低四位屏蔽
        if(key_lie!=LIE)                                //如果不等,說明有按鍵按下
        {
                delay(25);                                       //去抖動
                if(key_lie!=LIE)                        //說明確實有按鍵被按下
                {
                        key_lie=P1;                                //讀取最新的P3值
                        key_lie=key_lie&LIE;        //得到最新的列的信息
                                                                        //假如第一列的某個按鍵按下,例如4*4鍵盤key_lie為1110 0000
                        P1=HANG;                                //列為低電平,行為高電平
                        key_hang=P1;                        //讀取P3口
                        key_hang=key_hang&HANG;        //將高四位屏蔽掉,得到具體的行的信息,假如4×4第一行的某個按鍵被按下
                                                                        //則key_hang為0000 1110
                        key=key_hang|key_lie;        //將行和列的信息相或,1110 0000 |0000 1110=1110 1110,
                                                                        //可知第一行,第一列的按鍵被按下
                }
                        while(P1!=HANG);                //等待按鍵被釋放
        }
        switch(key)                                                //根據按鍵的數值進行判斷
        {
                case 0xee: knum1++;break;         //0xee=1110 1110 說明第一個按鍵被按下,則num的值為0;
                case 0xde: num=2;break;
                case 0xbe: knum3++;break;
                case 0x7e: num=4;break;
                case 0xed: num=5;break;
                case 0xdd: num=6;break;
                case 0xbd: num=7;break;
                case 0x7d: num=8;break;
                case 0xeb: num=9;break;
                case 0xdb: num=10;break;
                case 0xbb: num=11;break;
                case 0x7b: num=12;break;
                case 0xe7: num=13;break;
                case 0xd7: num=14;break;
                case 0xb7: num=15;break;
                case 0x77: num=16;break;
                case 0xff: num=17;break;               
        }               
                key=0xff;
              
}
/*************************鬧鐘設置**************************/
void keys()
{
                if(knum3==4)
                    {
                         knum3=0;
                 }

         if(knum3!=0)
                 {
                        if(num==2)
                {
                        switch(knum3)
                               
                          {
                           case 1 :   
                                                          miao++;
                                                   if(miao==60)
                                                           {miao=0;}
                                                         num=17;
                                                        break;
                                case 2 :   
                                                        fen++;
                                                        if(fen==60)
                                                         {fen=0;}
                                                          num=17;
                                                         break;
                                case 3 :   
                                                        shi++;
                                                        if(shi==24)
                                                        shi=0;
                                                        num=17;
                                                        break;
                          }
                }
}
}
void main()
{
    uchar i;
    lcd_init();                //初始化LCD
        set_rtc();            

    lcd_pos(0,4);             //設置顯示位置為第一行的第1個字符
     i = 0;
    while(dis1[i] != '\0')
     {                         //顯示星期
       lcd_wdat(dis1[i]);
       i++;
     }       
                  
         lcd_pos(1,0);             //設置顯示位置為第二行的第1個字符
     i = 0;
    while(dis2[i] != '\0')
     {                         //顯示日期
       lcd_wdat(dis2[i]);
       i++;
     }

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

         while(1)
         {
            
                read_rtc();
                time_pros();
                Matrixkeyscan();
                keys();
                zhengdian();
               
            lcd_pos(0,0);                                                          //第一行顯示時間
                lcd_wdat(mun_char_table[disp[7]]);
                lcd_wdat(mun_char_table[disp[8]]);
                lcd_wdat(':');
                lcd_wdat(mun_char_table[disp[9]]);
                lcd_wdat(mun_char_table[disp[10]]);
            lcd_wdat(':');
                lcd_wdat(mun_char_table[disp[11]]);
                lcd_wdat(mun_char_table[disp[12]]);
                delay(10);

               
                lcd_pos(0,6);                             //顯示星期
                lcd_wdat(0xb6);
                lcd_wdat(0xfe);

            lcd_pos(1,3);                                                          //第二行顯示實時日期
                lcd_wdat(mun_char_table[2]);
                lcd_wdat(mun_char_table[0]);
                lcd_wdat(mun_char_table[disp[0]]);
                lcd_wdat(mun_char_table[disp[1]]);
                lcd_wdat('-');
                lcd_wdat(mun_char_table[disp[3]]);
                lcd_wdat(mun_char_table[disp[4]]);
            lcd_wdat('-');
                lcd_wdat(mun_char_table[disp[5]]);
                lcd_wdat(mun_char_table[disp[6]]);
                delay(10);

                lcd_pos(2,2);
                lcd_wdat(':');
                if(knum1==0)
                {
                                    i = 0;
            while(dis5[i] != '\0')
           {                                            //顯示on
                       lcd_wdat(dis5[i]);
                       i++;
           }

                }
                if(knum1==1||knum1==2||knum1==3)
                {
                                    i = 0;
              while(dis6[i] != '\0')
          {                                             //顯示off
                               lcd_wdat(dis6[i]);
                               i++;
          }

                }
         lcd_pos(2,4);
         lcd_wdat(mun_char_table[shi/10]);
         lcd_wdat(mun_char_table[shi%10]);
         lcd_wdat(':');
         lcd_wdat(mun_char_table[fen/10]);
         lcd_wdat(mun_char_table[fen%10]);
         lcd_wdat(':');
         lcd_wdat(mun_char_table[miao/10]);
         lcd_wdat(mun_char_table[miao%10]);
               
         }
}
void lcd_pos(uchar X,uchar Y)
{                          
   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);     //顯示地址
}































回復

使用道具 舉報

ID:472242 發表于 2019-2-8 00:48 | 顯示全部樓層
網上一大把,多找找

評分

參與人數 4黑幣 +120 收起 理由
sheng7533967 + 15
Sawardeakar + 35
刀刀見紅 + 35
jinsheng7533967 + 35

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩三级 | 五月精品视频 | 免费午夜视频在线观看 | 一级在线视频 | 亚洲一区二区精品 | 日韩精品一区二区三区中文字幕 | 91精品国产一区二区三区 | 国产欧美日韩综合精品一 | 欧美 日韩精品 | 成人午夜精品一区二区三区 | 一区二区三区av | 国产精品免费一区二区三区 | 日本韩国欧美在线观看 | 国产高清在线精品一区二区三区 | 九九99靖品| 性国产xxxx乳高跟 | 亚洲高清视频一区 | 欧美三级在线 | 久久美女网 | 午夜精品影院 | 九色网址 | 天天射天天操天天干 | 国产91综合一区在线观看 | 91精品国产一区二区三区 | 夜久久 | 蜜臀久久99精品久久久久久宅男 | 久久久久久久久久久久亚洲 | 欧美性久久 | 国产精品揄拍一区二区 | 日韩欧美在线观看 | 精品在线观看一区二区 | 欧美精品一区三区 | 中文字幕免费 | 福利一区在线观看 | 国产精品视频免费看 | 亚洲五码久久 | 久久高清国产视频 | 999久久久免费精品国产 | 国产日产精品一区二区三区四区 | 亚洲综合在线视频 | 成人欧美一区二区三区黑人孕妇 |