新聞中心

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

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

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

        //主程序
        //http://www.51hei.com提供此單片機程序有問題請聯系
        main()
        {
        tmint(); //TMR0初始化
        initial(); //spi顯示初始化及系統其它部分初始化
        INTCONbits.GIE=0; //總中斷禁止
        while(1)
        {
        for(k=0;k4;k++)
        {
        s[k]=0;
        }
        sreg=0; //賦顯示初值
        dispaly(); //調用一次顯示子程序
        KEYSCAN(); //鍵掃描,直到開始鍵按下
        keyrelax(); //等鍵松開
        INTCONbits.GIE=1; //總中斷允許
        KEYSCAN(); //鍵掃描直到停止鍵按下,在鍵掃描時有顯示
        keyrelax(); //等鍵松開
        INTCONbits.GIE=0; //總中斷禁止
        KEYSCAN(); //鍵掃描到清0鍵按下,在鍵掃描時有顯示
        keyrelax(); //等鍵松開
        }
        }

        ---------------------匯編語言版本的pic單片機程序設計--------------------------------------;此程序實現功能
        ;:00.00秒-99.99秒,分辨度:0.01秒
        ;通過按鍵來啟動計時、停止計時及清0
        ;即第一次按下任意鍵開始計時,第二次按下任意鍵停止計時 ;第三次按下任意鍵使LED清0,等待下一次計時開始

        LIST P=18F458
        INCLUDE "P18F458.INC"

        S0 EQU 0X20 ;0.01 秒計時器
        S1 EQU S0+1 ;0.1 秒計時器
        S2 EQU S0+2 ;1 秒計時器
        S3 EQU S0+3 ;10 秒計時器
        SREG EQU S0+4 ;軟計數器
        LEDF EQU S0+5 ;顯示的LED的位置指示寄存器
        XW_TEMP EQU S0+6 ;用于中斷中保護W的值
        XHOSTS EQU S0+7 ;用于中斷中保護STATUS的值
        DEYH EQU S0+8
        DEYL EQU S0+9 ;以上兩個寄存器用于軟件延時
        HOSTF EQU S0+0A ;用于中斷中保護FSR0L的值
        TEMP EQU S0+0B ;用于存放臨時值

        ORG 0X00
        GOTO MAIN
        ORG 0X08
        GOTO CLKINT ;轉向中斷服務程序
        ORG 0X30

        ;數字到段碼的轉換子程序(最好放在程序開頭,避免超過2K的空間發生跨頁讀表)
        ;************不帶小數點的共陽極碼表**************
        CONVERT ADDWF PCL,1
        RETLW 0XC0 ;0,顯示段碼與具體的硬件連接有關
        RETLW 0XF9 ;1
        RETLW 0XA4 ;2
        RETLW 0XB0 ;3
        RETLW 0X99 ;4
        RETLW 0X92 ;5
        RETLW 0X82 ;6
        RETLW 0XD8 ;7
        RETLW 0X80 ;8
        RETLW 0X90 ;9
        RETLW 0X88 ;A
        RETLW 0X83 ;B
        RETLW 0XC6 ;C
        RETLW 0XA1 ;D
        RETLW 0X86 ;E
        RETLW 0X8E ;F
        RETLW 0X7F ;"."
        RETLW 0XBF ;"-"
        RETLW 0X89 ;H
        RETLW 0XFF ;DARK
        RETURN

        ;*********帶小數點的共陽極碼表***********
        CONVERT2 ADDWF PCL,1
        RETLW 0X40 ;0
        RETLW 0X79 ;1
        RETLW 0X24 ;2
        RETLW 0X30 ;3
        RETLW 0X19 ;4
        RETLW 0X12 ;5
        RETLW 0X02 ;6
        RETLW 0X78 ;7
        RETLW 0X00 ;8
        RETLW 0X10 ;9
        RETURN

        ;***********SPI發送顯示子模塊************
        TRANSMIT
        CLRF PORTA ;LACK送低電平,為鎖存做準備
        MOVWF SSPBUF ;啟動發送
        WAIT NOP
        BTFSS PIR1,SSPIF
        GOTO WAIT ;等待發送結束
        BCF PIR1,SSPIF ;清除中斷標志
        RETURN

        ;***********顯示子程序模塊************
        DISPLAY
        MOVLW 0X01
        MOVWF LEDF
        MOVLW 0XA0
        MOVWF FSR0L
        AGAINXIAN
        MOVF LEDF,W
        SUBLW 0X03
        BTFSS STATUS,Z
        GOTO XIANB
        MOVF INDF0,W
        CALL CONVERT2 ;若是個位,則查帶小數點的碼表
        GOTO TRAN
        XIANB MOVF INDF0,W
        CALL CONVERT
        TRAN CALL TRANSMIT ;發送一個顯示數據
        INCF FSR0L
        INCF LEDF
        MOVF LEDF,W
        SUBLW 0X05
        BTFSS STATUS,Z
        GOTO AGAINXIAN
        MOVLW 0X01
        MOVWF LEDF
        XIANDARK
        MOVLW 0X27
        CALL CONVERT
        CALL TRANSMIT
        INCF LEDF
        MOVF LEDF,W
        SUBLW 0X05
        BTFSS STATUS,Z
        GOTO XIANDARK ;顯示4個"DARK"
        BSF PORTA,5 ;最后給一個鎖存信號,代表一次顯示任務完成
        RETURN
        ;********** S0計數溢出處理子程序***************
        CS0
        CLRF S0
        INCF S1
        RETURN
        ;********** S1計數溢出處理子程序***************
        CS1
        CLRF S1
        INCF S2
        RETURN
        ;********** S2計數溢出處理子程序***************
        CS2
        CLRF S2
        INCF S3
        RETURN
        ;********** S3計數溢出處理子程序***************
        CS3
        CLRF S3
        RETURN
        ;***********時鐘中斷服務程序*******************
        CLKINT
        MOVWF XW_TEMP ;保存W的值
        SWAPF STATUS,W
        MOVWF XHOSTS ;暫存STATUS的值
        MOVF FSR0L,W
        MOVWF HOSTF ;保存FSR0L的值。以上程序為中斷現場保護
        MOVLW 0X13
        MOVWF TMR0L ;對TMR0L寫入一個調整值,因為寫入
        ;TMR0L后接著的兩個周期不能增量
        BCF INTCON,T0IF ;清除中斷標志
        INCF SREG
        MOVF SREG,W
        SUBLW 0X28 ;TMR0L 每250us中斷一次
        BTFSS STATUS,Z ;其中斷40次后才執行對S0 S1 S2 S3 的操作
        GOTO TIFAN
        CLRF SREG
        INCF S0
        MOVF S0,W
        SUBLW 0X0A
        BTFSC STATUS,Z
        CALL CS0
        MOVF S1,W
        SUBLW 0X0A
        BTFSC STATUS,Z
        CALL CS1
        MOVF S2,W
        SUBLW 0X0A
        BTFSC STATUS,Z
        CALL CS2
        MOVF S3,W
        SUBLW 0X0A
        BTFSC STATUS,Z
        CALL CS3
        TIFAN
        MOVF HOSTF,W ;以下為中斷現場恢復
        MOVWF FSR0L ;恢復間接尋址指針FSR0L的值
        SWAPF XHOSTS,W
        MOVWF STATUS ;恢復STATUS的值
        SWAPF XW_TEMP,1
        SWAPF XW_TEMP,W ;恢復W的值
        RETFIE

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


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


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


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


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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 邵东县| 黑山县| 普宁市| 兴隆县| 阜康市| 桑植县| 隆尧县| 阜宁县| 泾源县| 木兰县| 辉南县| 嘉鱼县| 贞丰县| 南郑县| 葵青区| 疏附县| 颍上县| 黄山市| 高唐县| 原阳县| 烟台市| 霍林郭勒市| 丹东市| 金沙县| 瑞昌市| 皮山县| 清流县| 乌恰县| 栾川县| 同心县| 龙里县| 三门县| 西乌珠穆沁旗| 佛教| 柳河县| 徐闻县| 手机| 武川县| 芦溪县| 建瓯市| 咸丰县|