新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機+LCD+DS1302+AD程序

        PIC單片機+LCD+DS1302+AD程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        //初學C按鍵LCD+DS1302+AD程序

        //;*******************************************

        本文引用地址:http://www.104case.com/article/201611/315932.htm

        0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>


        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        static volatile unsigned char acc @ 0x20;
        static volatile bit acc0 @ (unsigned)&acc*8+0;
        static volatile bit acc7 @ (unsigned)&acc*8+7;
        #define PORTAIT(add,bit) ((unsigned)(&add)*8+(bit))
        #define PORTBIT(add,bit) ((unsigned)(&add)*8+(bit))
        #define PORTCIT(add,bit) ((unsigned)(&add)*8+(bit))

        static bit RS @ PORTCIT(PORTC,0);
        static bit RW @ PORTCIT(PORTC,1);
        static bit E @ PORTCIT(PORTC,2);
        static bit T_RST @ PORTCIT(PORTC,5);
        static bit T_CLK @ PORTCIT(PORTC,6);
        static bit T_IO @ PORTCIT(PORTC,7);

        static bit PORTA_0 @ PORTAIT(PORTA,0); ///*定義PORTA 0位*/
        static bit PORTA_1 @ PORTAIT(PORTA,1); ///*定義PORTA 1位*/
        static bit PORTA_2 @ PORTAIT(PORTA,2); ///*定義PORTA 2位*/
        static bit PORTA_5 @ PORTAIT(PORTA,5);

        static bit RB_7 @ PORTBIT(PORTB,7);
        const unsigned char Data[ ]={0, 1, 2,3,4, 5, 6,7, 8,9, };
        const unsigned char Ds1302[] = {9, 9, 0, 7, 1, 9 ,3,9, 2,4, 5, 9 ,5,9,};
        // // 年 星期 月 日 時 分 秒
        const unsigned char ds1302_sub[ ]={0};
        uchar DisCash[]={0x00,0x30,0x09,0x1,0x06,0x06,0x06};
        //初始化參數 秒 分 時 日 月 星期 年
        unsigned char y,i;
        char *pc;
        uchar BCD[3];
        uchar get1302[7];
        uchar appear[]={0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0};
        void Delay ( );
        void enable ();
        void display();//顯示程序
        //延時子程序
        void delay()
        {
        unsigned int i=1000;
        while(i--) //for(i=6000;0 {
        ; // continue;
        }
        }
        ////////////////十六進制轉十進制程序

        void H_BCD (uchar x)
        {
        //i,j,t1,t2;
        BCD [2]=x%10;
        BCD [1]=(x%100)/10;
        BCD [0]=x/100;
        }

        //////////寫入數據子程序////////////////////////////
        void W_data ()
        {
        Delay();//判斷液晶顯示器是否忙
        RS=1;
        RW=0;
        PORTB=y;
        // enable();//寫入控制命令子程序
        E=1;
        E=0;
        }

        //////寫入控制命令子程序////////////////////////////
        void enable ()
        { Delay();
        RS=0;
        RW=0;
        PORTB =y;
        E=1;
        E=0;
        }
        ///////判斷液晶顯示器是否忙///////////////////////
        void Delay ()
        {
        RS=0;
        RW=1;
        E=0;
        NOP();
        TRISB=0x80;
        E=1;
        while(RB_7==1 )
        {
        RS=0;
        RW=1;
        E=0;
        NOP();
        E=1;
        }
        TRISB=0x00;
        }
        ///////////////////////////////////////////////////////////////////////////

        void interrupt adint(void)
        {
        ADIF=0;//清/AD中斷標志位
        }

        ////////系統 各I/O初始化子程序///////////////////////////////////////////
        void initial ()
        { TRISB=0;
        TRISC=0;
        TRISA=0x0ff;
        }
        //////////A/D轉換初始化子程序//////////////////////////////
        void adinitial()
        {
        ADCON1=15;//;設置RA為A/D甬道模擬輸入
        //;RC時鐘。打開A/D轉換器。先中通道0
        ADCON0=0x0c1;// B11000001 // ;A/D時鐘為RC。RA0作A/D輸入等
        ADIE=1; //時。開放中斷
        ADIF=0; //清/AD中斷標志位 PIR1,
        PEIE=1; //開放外圍部件中斷INTCON,
        GIE=1; //開放總中斷 INTCON,
        }
        /////往1302寫入1Byte數據////////////////////////
        void RTInputByte(uchar d)
        {
        uchar i;
        acc = d;
        TRISC=0x00;
        for(i=8; i>0; i--)
        {
        T_IO = acc0;//CARRY;//ACC0; //*相當于匯編中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        acc = acc >> 1;
        }
        }
        ///////從1302讀取1Byte數據////////////////////////
        uchar RTOutputByte(void)
        {
        uchar i;
        TRISC=0x80;
        for(i=8; i>0; i--)
        {
        acc = acc >>1; //*相當于匯編中的 RRC */
        acc7= T_IO;// CARRY
        T_CLK = 1;
        T_CLK = 0;
        }
        return(acc);
        }
        ///////先寫地址,后寫命令/數據//////////////////////////
        void W1302(uchar ucAddr, uchar ucDa)
        {
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        RTInputByte(ucAddr); // /* 地址,命令 */
        RTInputByte(ucDa); // /* 寫1Byte數據*/
        T_CLK = 1;
        T_RST = 0;
        }
        ///////先寫地址,后讀命令/數據////////////////////////
        uchar R1302(uchar ucAddr)
        {
        uchar ucData;
        T_RST = 0;
        T_CLK = 0;
        T_RST = 1;
        RTInputByte(ucAddr); // /* 地址,命令 */
        ucData = RTOutputByte(); // /* 讀1Byte數據 */
        T_CLK = 1;
        T_RST = 0;
        return(ucData);
        }
        /////////向1302寫入 秒 分 時 日 月 星期 年 */////////////
        void Set1302(uchar *pClock)
        {
        uchar i;
        uchar ucAddr = 0x80;
        W1302(0x8e,0x00); ///* 控制命令,WP=0,允許寫操作*/
        for(i =7; i>0; i--)
        {
        W1302(ucAddr,*pClock); ///* 秒 分 時 日 月 星期 年 */
        pClock++;
        ucAddr +=2;
        }
        W1302(0x8e,0x80); // /* 控制命令,WP=1,寫保護*/
        }
        ////////從1302讀出 秒 分 時 日 月 星期 年 *//////////////////
        void v_Get1302(unsigned char ucCurtime[])
        {
        unsigned char i;
        unsigned char ucAddr = 0x81;
        for (i=0;i<7;i++)
        {
        ucCurtime[i] = R1302(ucAddr);///*格式為: 秒 分 時 日 月 星期 年 */
        ucAddr += 2;
        }
        }
        //////////拆字子程序///////////////////////////////////////
        void bcd_bcd( )
        { uchar a=6;


        for (i=0;i<=15;)
        {
        appear[i]=(get1302[a]&0xf0)/16;
        i++;
        appear[i]=get1302[a]&0x0f;
        i++;
        a--;
        }
        }
        ////////按鍵掃描///////////////////////////////////////////////////

        //////////按鍵掃描/////////////////////////////////////////////////
        void Key()
        {
        uchar a,b,c,i;
        di();
        a=PORTA ;
        if(56!=(a&56))
        {
        display();
        a=PORTA ;
        if(56!=(a&56))
        {
        for (b=0;b<14;)
        {
        uchar z,x;

        for(z=50;z>0&&b<14;z--)
        { z--;
        display();// delay();
        delay();
        a=PORTA;
        a=a&56;
        switch(a)
        {

        case 48 :
        if(Ds1302[b]!=appear[b] )
        (appear[b])++;
        a=PORTA ;
        for(x=20;x>0&&56!=(a&56);x--)
        { display();// delay();
        delay();
        } break; // 年 星期 月 日 時 分 秒
        case 40 : if(appear[b]!=0)(appear[b])--;
        a=PORTA ;
        for(x=20;x>0&&56!=(a&56);x--)
        { display();// delay();
        delay();
        } break;// 年 星期 月 日 時 分 秒
        case 24 : b++; while( PORTA_5==0); break;
        }
        }

        a=PORTA ;
        for(z=50;( z>0&&56==(a&56));z--)
        {

        i=appear[b];
        appear[b]=10;
        display( );
        delay();
        appear[b]=i;
        a=PORTA;
        //a=a&56;
        z--;

        }

        }
        while( PORTA_5==0);
        i=13;
        c=12;
        for(b=0;b<7;b++)
        {
        DisCash[b]=((appear[c]&0x0f)*16)|(appear[i]&0x0f);
        i=i-2;
        c=c-2;
        }
        Set1302(&DisCash[0]);
        a=PORTA ;
        }
        }
        }
        //////////顯示子程序/////////////////////////////////////////////
        void display()//顯示程序
        {
        y=0x80;//0x0C0;寫入起始地址
        enable();//寫入控制命令子程序

        for(i=0;i<8;)
        {
        y=Data[ appear[i]]; // 1;//0x47;
        W_data ();//寫入數據子程序
        // delay();
        i++;
        y=Data[ appear[i]]; // 1;//0x47;
        W_data ();//寫入數據子程序
        // delay();
        i++;
        y=-; // 1;//0x47;
        W_data ();//寫入數據子程序
        //delay();
        }
        y=0x0C0;
        enable();//寫入控制命令子程序
        for(i=8;i<14;)
        {
        y=Data[appear[i]]; // 1;//0x47;
        W_data ();//寫入數據子程序
        //delay();
        i++;
        y=Data[appear[i]]; // 1;//0x47;
        W_data ();//寫入數據子程序
        // delay();
        i++;
        y=:; // 1;//0x47;
        W_data ();//寫入數據子程序
        // delay();

        }
        y=-; // 1;//0x47;
        W_data ();//寫入數據子程序
        // delay();

        for(i=0;i<3;i++)
        {

        y=Data[ BCD[i]]; // 1;//0x47;
        W_data ();//寫入數據子程序
        }
        }
        ///////主程序//////////////////////////////////////////////////////
        void main()
        {
        // TRISB=0x00;
        // TRISC=0x00;
        Set1302(&DisCash[0]);
        initial ();//系統 各I/O初始化子程序
        adinitial();//A/D轉換初始化子程序/
        y=0x01;//PORTB
        enable();//寫入控制命令子程序
        y=0x38;//8位2行5X7點陣0x3c
        enable();//寫入控制命令子程序
        y=0x0C;//顯示器開,F=光標開,閃爍開。
        enable();//寫入控制命令子程序
        y=0x06; //文字不動,光標自動右移。
        enable();//寫入控制命令子程序

        ///////////////////////////////////////////////////
        while(1)
        {
        v_Get1302(get1302);//從1302讀出 秒 分 時 日 月 星期 年
        bcd_bcd(get1302);//拆字子程序
        H_BCD ( ADRES ); //十六進制轉十進制程序
        ei();
        ADGO=1; //啟動A/D轉換 ADCON0,

        display();
        Key();
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 红安县| 囊谦县| 德阳市| 七台河市| 永城市| 沈丘县| 科技| 荣成市| 南投市| 武清区| 东宁县| 恭城| 铜鼓县| 文山县| 东城区| 宜兰县| 湘西| 双江| 尚义县| 奎屯市| 金塔县| 洛川县| 吴旗县| 龙山县| 杭锦旗| 龙胜| 凌云县| 鄂尔多斯市| 常德市| 耿马| 武冈市| 外汇| 平舆县| 共和县| 宁化县| 永顺县| 九寨沟县| 高青县| 高要市| 湟源县| 香港 |