新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機計時秒表程序設計

        PIC單片機計時秒表程序設計

        作者: 時間:2012-12-11 來源:網絡 收藏

        //此程序實現功能,00.00~99.99秒,分辨度:0.01秒

        #include "p18f458.h"

        unsigned char s[4]; //定義0.01 秒、0.1 秒、1秒、10秒計時器
        unsigned char k,data,sreg;
        unsigned int i;
        const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
        //不帶小數點的顯示段碼表
        const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
        //帶小數點的顯示段碼表

        void clkint(void);

        //TMR0初始化子程序
        void tmint()
        {
        T0CON=0XCF; //設定TMR0L工作于8位定時器方式
        //內部時鐘,TMR0不用分頻
        INTCON=0X20; //總中斷禁止,TMR0中斷允許,清除TMR0的中斷標志
        INTCON2bits.TMR0IP=1; //TMR0中斷高優先級
        RCONbits.IPEN=1; //使能中斷優先級
        }

        //系統其它部分初始化子程序
        void initial()
        {
        TRISA=0x00; //A口設置為輸出
        TRISB=0XF0; //RB1輸出,RB4輸入
        TRISC=0x00; //SDO引腳為輸出,SCK引腳為輸出
        TRISE=0x00; //E口設置為輸出
        SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4
        SSPSTAT=0xC0; //時鐘下降沿發送數據
        PIR1=0; //清除SSPIF標志
        data=0X00; //待顯示的寄存器賦初值
        PORTBbits.RB1=0;
        PORTAbits.RA3=0;
        PORTE=0; //將K1,K2,K3,K4四條列線置0
        }

        //SPI傳輸數據子程序
        void SPILED(char data)
        {
        SSPBUF=data; //啟動發送
        do
        {
        ;
        }while(PIR1bits.SSPIF==0);
        PIR1bits.SSPIF=0;
        }

        //顯示子程序,顯示4位數
        void dispaly()
        {
        PORTAbits.RA5=0; //準備鎖存
        for(k=0;k4;k++)
        {
        data=s[k];
        if(k==2) data=table0[data]; //個位需要顯示小數點
        else data=table[data];
        SPILED(data); //發送顯示段碼
        }
        for(k=0;k4;k++)
        {
        data=0xFF;
        SPILED(data); //連續發送4個DARK,使顯示好看一些
        }
        PORTAbits.RA5=1; //最后給鎖存信號,代表顯示任務完成
        }

        //軟件延時子程序
        void DELAY()
        {
        for(i = 3553; --i ;)
        continue;
        }

        //鍵掃描子程序
        void KEYSCAN()
        {
        while(1)
        {
        dispaly(); //調用一次顯示子程序
        while(PORTBbits.RB4==0)
        {
        DELAY(); //若有鍵按下,則軟件延時
        break;
        }
        if (PORTBbits.RB4==0) break; //若還有鍵按下,則終止循環掃描,返回
        }
        }

        //等鍵松開子程序
        void keyrelax()
        {
        while(1)
        {
        dispaly(); //調用一次顯示子程序
        if (PORTBbits.RB4==1) break; //為防止按鍵過于靈敏,每次等鍵松開才返回
        }
        }

        /*高優先級中斷向量*/
        #pragma code InterruptVectorHigh=0x08
        void InterruptVectorHigh (void)
        {
        _asm
        goto clkint //跳到中斷程序
        _endasm
        }

        //中斷服務程序
        #pragma code
        #pragma interrupt clkint
        void clkint()
        {
        TMR0=0X13; //對TMR0寫入一個調整值。因為寫入TMR0后接著的
        //兩個周期不能增量,中斷需要3個周期的響應時間,
        //以及C語言自動進行現場保護要消耗周期
        INTCONbits.T0IF=0; //清除中斷標志
        sreg=sreg+1; //中斷計數器加1
        if(sreg==40) //中斷次數為40后,才對S0,S1,S2,S3 操作
        {
        sreg=0;
        s[0]=s[0]+1;
        if(s[0]==10)
        {
        s[0]=0 ;
        s[1]=s[1]+1;
        if(s[1]==10)
        {
        s[1]=0 ;
        s[2]=s[2]+1;
        if(s[2]==10)
        {
        s[2]=0;
        s[3]=s[3]+1;
        if(s[3]==10) s[3]=0;
        }
        }
        }
        }
        }

        51單片機相關文章:51單片機教程


        c語言相關文章:c語言教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 岑巩县| 延长县| 洛阳市| 敦煌市| 武安市| 察雅县| 清丰县| 榕江县| 秦皇岛市| 镇雄县| 巴里| 富顺县| 晋中市| 广丰县| 那曲县| 易门县| 霍邱县| 武冈市| 荣昌县| 平果县| 电白县| 上蔡县| 瑞金市| 华安县| 阜阳市| 铁岭市| 玛纳斯县| 文成县| 海兴县| 青龙| 始兴县| 黎城县| 上林县| 玉龙| 泸州市| 温宿县| 通州市| 冕宁县| 沿河| 新乡县| 曲靖市|