|
;********************************************** ;********* 這是PIC16F716表頭 ******* ;******************************************************************************* INDF EQU 00H ;80H TMR0 EQU 01H PCL EQU 02H ;82H STATUS EQU 03H ;83H FSR EQU 04H ;84H PORTA EQU 05H PORTB EQU 06H PCLATH EQU 0AH ;8A INTCON EQU 0BH ;8B PIR1 EQU 0CH TMR1L EQU 0EH TMR1H EQU 0FH T1CON EQU 10H TMR2 EQU 11H T2CON EQU 12H CCPR1L EQU 15H CCPR1H EQU 16H CCP1CON EQU 17H PWM1CON EQU 18H ECCPAS EQU 19H ADRES EQU 1EH ADCON0 EQU 1FH ;-------------------------------------- ;INDF EQU 80H ;00H OPTION_ EQU 81H ;PCL EQU 82H ;02H ;STATUS EQU 83H ;03H ;FSR EQU 84H ;04H TRISA EQU 85H TRISB EQU 86H ;PCLATH EQU 8AH ;0A ;INTCON EQU 8BH ;0B PIE1 EQU 8CH PCON EQU 8EH PR2 EQU 92H ADCON1 EQU 9FH ;******************************************************************************** ;** STATUS: ** C EQU 0 ;有進(jìn)位或無(wú)借位為1 DC EQU 1 ; Z EQU 2 ;運(yùn)算結(jié)果為0時(shí)=1 PD EQU 3 ; TO EQU 4 ;看門狗溢出時(shí)為0,上電時(shí)為1 PS0 EQU 5 ;|直接尋址使用 _6/5=00=00H-7FH RAM(20-7FH) PS1 EQU 6 ;| _6/5=10=80H-FFH RAM(A0-FFH) PS2 EQU 7 ;間接尋址用 1=100-1FFH(存儲(chǔ)區(qū)2和3) 0=0-FFH(存儲(chǔ)區(qū)0和1) ;********************************************************************************* ;**OPTION_: ;BIT0-2=預(yù)分頻器分頻比選擇位 ;位值 TMR0分頻比 WDT分頻比 ;000 1 : 2 1 : 1 ;001 1 : 4 1 : 2 ;010 1 : 8 1 : 4 ;011 1 : 16 1 : 8 ;100 1 : 32 1 : 16 ;101 1 : 64 1 : 32 ;110 1 : 128 1 : 64 ;111 1 : 256 1 : 128 ;BIT3=預(yù)分頻器分配位 ;1 = 預(yù)分頻器分配給WDT ;0 = 預(yù)分頻器分配給Timer0 模塊 ;BIT4=TMR0計(jì)數(shù)脈沖邊沿選擇位 ;1 = 在RA4/T0CKI 引腳上的下降沿遞增1 ;0 = 在RA4/T0CKI 引腳上的上升沿遞增1 ;BIT5=TMR0時(shí)鐘源選擇位 ;1 = RA4/T0CKI 引腳上的外部時(shí)鐘 ;0 = 內(nèi)部指令周期時(shí)鐘(CLKOUT) ;BIT6=中斷觸發(fā)邊沿選擇位 ;1 = RB0/INT 引腳上上升沿觸發(fā)中斷 ;0 = RB0/INT 引腳上下降沿觸發(fā)中斷 ;BIT7=PORTB 弱上拉使能位 ;1 = 禁止PORTB 弱上拉 ;0 = PORTB 弱上拉由備用功能或TRISBn位的值確定 ;********************************************************************************** ;**INTCON 寄存器: ;當(dāng)中斷條件發(fā)生時(shí),中斷標(biāo)志位就會(huì)被置1,而不管相應(yīng)中斷使能位或全局中斷使能 ;位 GIE (INTCON<7>)的狀態(tài)。因此在使能中斷前,用戶軟件必須把相應(yīng)的中斷標(biāo)志位清零。 RBIF EQU 0 ;RB口電平變化中斷標(biāo)志位 ;1 = RB7:RB4 引腳中至少有一個(gè)引腳狀態(tài)發(fā)生變化(必須用軟件清零) ;0 = RB7:RB4 引腳狀態(tài)無(wú)變化 INTF EQU 1 ;RB0/INT 外部中斷標(biāo)志位 ;1 = RB0/INT 引腳上有外部中斷發(fā)生(必須用軟件清零) ;0 = RB0/INT 引腳上沒(méi)有外部中斷發(fā)生 T0IF EQU 2 ;TMR0 溢出中斷標(biāo)志位 ;1 = TMR0 計(jì)數(shù)器溢出(必須用軟件清零) ;0 = TMR0 計(jì)數(shù)器沒(méi)有溢出 RBIE EQU 3 ;RB 口電平變化中斷使能位 ;1 = 允許 RB 口電平變化中斷 ;0 = 禁止 RB 口電平變化中斷 INTE EQU 4 ;RB0/INT 外部中斷使能位 ;1 = 允許RB0/INT 外部中斷 ;0 = 禁止RB0/INT 外部中斷 T0IE EQU 5 ;TMR0 溢出中斷使能位 ;1 = 允許TMR0 中斷 ;0 = 禁止TMR0 中斷 PEIE EQU 6 ;外設(shè)中斷使能位 ;1 = 開(kāi)放所有未被屏蔽的外設(shè)中斷 ;0 = 禁止所有的外設(shè)中斷 GIE EQU 7 ;全局中斷使能位 ;1 = 使能所有未被屏蔽的中斷 ;0 = 禁止所有中斷 ;******************************************************************************* ;**PIE1 寄存器: (要使能任何外設(shè)中斷,必須置位PEIE位) TMR1IE EQU 0 ;TMR1 溢出中斷使能位 ;1 = 允許 TMR1 溢出中斷 ;0 = 禁止TMR1 溢出中斷 TMR2IE EQU 1 ;TMR2 和 PR2 匹配中斷使能位 ;1 = 允許TMR2 和 PR2 匹配中斷 ;0 = 禁止TMR2 和 PR2 匹配中斷 CCP1IE EQU 2 ;CCP1 中斷使能位 ;1 = 允許 CCP1 中斷 ;0 = 禁止CCP1 中斷 ;bit 7 5-3 未使用:讀出時(shí)為0 ADIE EQU 6 ;A/D 轉(zhuǎn)換器中斷使能位 ;1 = 允許A/D 轉(zhuǎn)換器中斷 ;0 = 禁止A/D 轉(zhuǎn)換器中斷 ;******************************************************************************** ;**PIR1 寄存器: TMR1IF EQU 0 ;TMR1 溢出中斷標(biāo)志位 ;1 = TMR1 溢出(必須用軟件清零) ;0 = TMR1 未溢出 TMR2IF EQU 1 ;TMR2 和 PR2 匹配中斷標(biāo)志位 ;1 = TMR2 和 PR2 匹配發(fā)生(必須用軟件清零) ;0 = TMR2 和 PR2 匹配未發(fā)生。 CCP1IF EQU 2 ;CCP1 中斷標(biāo)志位 ;捕捉方式: ;1 = TMR1 寄存器發(fā)生捕捉(必須用軟件清零) ;0 = TMR1 寄存器未發(fā)生捕捉 ;比較方式: ;1 = TMR1 寄存器發(fā)生比較匹配(必須用軟件清零) ;0 = TMR1 寄存器未發(fā)生比較匹配 ;PWM 方式: ;未使用 ADIF EQU 6 ;A/D 轉(zhuǎn)換器中斷標(biāo)志位 ;1 = A/D 轉(zhuǎn)換已完成(必須用軟件清零) ;0 = A/D 轉(zhuǎn)換未完成 ;bit 7 5-3 未使用:讀出時(shí)為0 ;********************************************************************************** ;**PCON 寄存器 BOR EQU 0 ;欠壓復(fù)位狀態(tài)位 ;1 = 未發(fā)生欠壓復(fù)位 ;0 = 發(fā)生欠壓復(fù)位(必須在欠壓復(fù)位后用軟件置位) POR EQU 1 ;上電復(fù)位狀態(tài)位 ;1 = 未發(fā)生上電復(fù)位 ;0 = 發(fā)生上電復(fù)位(必須在上電復(fù)位后用軟件置位) ;bit 7-2 未使用:讀出時(shí)為0 ;******************************************************************************** ;修改PCL ;執(zhí)行任何將PCL寄存器作為目的寄存器的指令將同時(shí)使程序計(jì)數(shù)器PC<12:8> 位(PCH)的值 ;被PCLATH 寄存器的值替換。這將允許通過(guò)寫(xiě)PCLATH 寄存器的高5位改變整個(gè)程序計(jì)數(shù)器的 ;值。當(dāng)?shù)? 位被寫(xiě)入PCL 寄存器時(shí),所有程序計(jì)數(shù)器的13 位都被修改為PCLATH 寄存器中 ;的值和寫(xiě)到PCL 寄存器的值。通過(guò)修改PCL 寄存器跳轉(zhuǎn)到查找表或程序分支表(執(zhí)行GOTO ;指令)時(shí)必須小心。PCLATH 被賦予表的起始地址,如果表長(zhǎng)度大于255 條指令或者表中存 ;儲(chǔ)器地址的低8 位從0xFF 循環(huán)返回到0x00,在表的起始地址和目標(biāo)地址之間每次地址翻轉(zhuǎn) ;時(shí)PCLATH 必須遞增1。 ;程序存儲(chǔ)器分頁(yè) ;CALL 和 GOTO指令提供11 位地址,允許在 2K 程序存儲(chǔ)頁(yè)面內(nèi)跳轉(zhuǎn)。指行 CALL 或 GOTO ;指令時(shí),地址的高位由PCLATH<3> 提供。當(dāng)執(zhí)行 CALL 或 GOTO 指令時(shí),用戶必須事先設(shè) ;置了頁(yè)面選擇位,以便指向所需的程序存儲(chǔ)頁(yè)面。如果執(zhí)行CALL 指令(或中斷)的RETURN ;整個(gè)13 位的PC 被全部壓入堆棧。因此執(zhí)行RETURN 指令(它將地址從堆棧中彈出)之前 ;無(wú)需對(duì)PCLATH<3>位進(jìn)行設(shè)置。 ;******************************************************************************** ;***T1CON TIMER1 控制寄存器: ;bit 5-4 T1CKPS1:T1CKPS0:Timer1 輸入時(shí)鐘預(yù)分頻比選擇位 ;11 = 1:8 預(yù)分頻比 ;10 = 1:4 預(yù)分頻比 ;01 = 1:2 預(yù)分頻比 ;00 = 1:1 預(yù)分頻比 ;bit 3 T1OSCEN:Timer1 振蕩器使能控制位 ;1 = 使能振蕩器 ;0 = 關(guān)閉振蕩器(1) ;bit 2 T1SYNC:Timer1 外部時(shí)鐘輸入同步控制位 ;TMR1CS = 1 ;1 = 不與外部時(shí)鐘輸入同步 ;0 = 與外部時(shí)鐘輸入同步 ;TMR1CS = 0 ;忽略該位。當(dāng)TMR1CS = 0 時(shí), Timer1 使用內(nèi)部時(shí)鐘。 ;bit 1 TMR1CS:Timer1 時(shí)鐘源選擇位 ;1 = 使用RB1/T1OSO/T1CKI 引腳的外部時(shí)鐘(第一個(gè)下降沿后的上升沿) ;0 = 使用內(nèi)部時(shí)鐘(FOSC/4) ;bit 0 TMR1ON:Timer1 使能位 ;1 = 使能Timer1 ;0 = 關(guān)閉Timer1 ;******************************************************************************* ;**T2CON:TIMER2 控制寄存器: ;bit 7 未使用:讀出時(shí)為0 ;bit 6-3 TOUTPS3:TOUTPS0: ;0000 = 1:1 后分頻比 ;0001 = 1:2 后分頻比 ;0010 = 1:3 后分頻比 ;0011 = 1:4 后分頻比 ;0100 = 1:5 后分頻比 ;0101 = 1:6 后分頻比 ;0110 = 1:7 后分頻比 ;0111 = 1:8 后分頻比 ;1000 = 1:9 后分頻比 ;1001 = 1:10 后分頻比 ;1010 = 1:11 后分頻比 ;1011 = 1:12 后分頻比 ;1100 = 1:13 后分頻比 ;1101 = 1:14 后分頻比 ;1110 = 1:15 后分頻比 ;1111 = 1:16 后分頻比 ;bit 2 TMR2ON:Timer2 使 ;1 = 使能Timer2 ;0 = 關(guān)閉Timer2 ;bit 1-0 T2CKPS1:T2CKPS0: ;00 = 預(yù)分頻比為1 ;01 = 預(yù)分頻比為4 ;1x = 預(yù)分頻比為16 ;******************************************************************************* ;***CCP1CON 寄存器: ;bit 7-6 P1M1:P1M0:PWM 輸出配置位 ;CCP1M<3:2> = 00, 01, 10 ;xx = P1A 配置為捕捉/ 比較I/O。P1B、P1C 和P1D 配置為端口引腳。 ;CCP1M<3:2> = 11 ;00 = 單輸出, P1A 調(diào)制, P1B、P1C 和P1D 配置為端口引腳; ;01 = 四正向輸出, P1D 調(diào)制, P1A 有效, P1B 和P1C 無(wú)效; ;10 = 雙輸出, P1A 和P1B 調(diào)制,帶有死區(qū)控制。P1C 和P1D 配置為端口引腳; ;11 = 四反向輸出, P1B 調(diào)制, P1C 有效, P1A 和P1D 無(wú)效。 ;bit 5-4 DC1B1:DC1B0:PWM 低有效位 ;捕捉模式:未使用; ;比較模式:未使用; ;PWM 模式:這些位是PWM 占空比的低2 位。高8 位在CCPR1L 中。 ;bit 3-0 CCP1M3:CCP1M0:ECCP 模式選擇位 ;0000 =捕捉/ 比較/PWM 關(guān)閉(復(fù)位ECCP 模塊) ;0001 =未使用(保留) ;0010 =比較模式,匹配時(shí)翻轉(zhuǎn)輸出(置位CCP1IF 位) ;0011 =未使用(保留) ;0100 =捕捉模式,每個(gè)下降沿 ;0101 =捕捉模式,每個(gè)上升沿 ;0110 =捕捉模式,每4 個(gè)上升沿 ;0111 =捕捉模式,每16 個(gè)上升沿 ;1000 =比較模式,匹配時(shí)CCP1 輸出置位(置位CCP1IF 位) ;1001 =比較模式,匹配時(shí)CCP1 輸出清零(置位CCP1IF 位) ;1010 =比較模式,匹配時(shí)產(chǎn)生軟件中斷(置位CCP1IF 位, CCP1 引腳不受影響) ;1011 =比較模式,觸發(fā)特殊事件(置位CCP1IF 位,復(fù)位TMR1,且如果A/D 模塊被使能,啟動(dòng)一次A/D 轉(zhuǎn) ;換。CCP1 引腳不受影響)。 ;1100 =PWM 模式。P1A, P1C 高電平有效; P1B, P1D 高電平有效; ;1101 =PWM 模式。P1A, P1C 高電平有效; P1B, P1D 低電平有效; ;1110 =PWM 模式。P1A, P1C 低電平有效; P1B, P1D 高電平有效; ;1111 =PWM 模式。P1A, P1C 低電平有效; P1B, P1D 低電平有效。 ;******************************************************************************** ;**PWM1CON:PWM 配置寄存器 ;bit 7 PRSEN:PWM 重新啟動(dòng)使能位 ;1 = 自動(dòng)關(guān)閉時(shí),一旦關(guān)閉事件消失, ECCPASE 位自動(dòng)清零; PWM 自動(dòng)重新啟動(dòng)。 ;0 = 自動(dòng)關(guān)閉時(shí), ECCPASE 必須由軟件清零以重新啟動(dòng)PWM。 ;bit 6-0 PDC<6:0>:PWM 延時(shí)計(jì)數(shù)位 ;在PWM 信號(hào)應(yīng)該轉(zhuǎn)換為有效的預(yù)定時(shí)間和轉(zhuǎn)換為有效的實(shí)際時(shí)間之間的FOSC/4(4*TOSC)周 ;期數(shù) ;********************************************************************************* ;***ECCPAS 增強(qiáng)型CCP 自動(dòng)關(guān)閉寄存器 ;bit 7 ECCPASE:ECCP 自動(dòng)關(guān)閉事件狀態(tài)位 ;1 = 發(fā)生了關(guān)閉事件。如果PRSEN = 0,必須在軟件中復(fù)位以重新使能ECCP。 ;0 = ECCP 輸出使能,無(wú)關(guān)閉事件。 ;bit 6 ECCPAS2: ECCP 自動(dòng)關(guān)閉位2 ;1 = RB0(INT)引腳低電平0導(dǎo)致關(guān)閉 ;0 = RB0(INT)引腳對(duì)ECCP 無(wú)影響 ;bit 5 未使用:讀出時(shí)為“0” ;bit 4 ECCPAS0 ECCP 自動(dòng)關(guān)閉位 ;1 = RB4引腳低電平(“0”)導(dǎo)致關(guān)閉 ;0 = RB4引腳對(duì)ECCP 無(wú)影響 ;bit 3-2 PSSAC<1:0>:引腳P1A 和P1C 關(guān)閉狀態(tài)控制 ;00 =驅(qū)動(dòng)引腳P1A 和P1C 為“0” ;01 =驅(qū)動(dòng)P1A 和P1C 為“1” ;1x =引腳P1A 和P1C 為三態(tài) ;bit 1-0 PSSBD<1:0>:引腳P1B 和P1D 關(guān)閉狀態(tài)控制 ;00 =驅(qū)動(dòng)引腳P1B 和P1D為0 ;01 =驅(qū)動(dòng)引腳P1B 和P1D為1 ;1x =引腳P1B 和P1D 為三態(tài) ;******************************************************************************* ;**ADCON0 寄存器: ;bit 7-6 ADCS1:ADCS0:A/D 轉(zhuǎn)換時(shí)鐘選擇位 ;00 = FOSC/2 01 = FOSC/8 10 = FOSC/32 11 = FRC (時(shí)鐘來(lái)自內(nèi)部ADC RC 振蕩器) ;bit 5-3 CHS2:CHS0:模擬通道選擇位 ;000 = 通道0 (RA0/AN0) ;001 = 通道1 (RA1/AN1) ;010 = 通道 2 (RA2/AN2) ;011 = 通道3 (RA3/AN3) ;1xx = 保留,不要使用 ;bit 2 GO/DONE:A/D 轉(zhuǎn)換狀態(tài)位 ;如果ADON = 1 ;1 = A/D 轉(zhuǎn)換正在進(jìn)行(將該位置位啟動(dòng)A/D 轉(zhuǎn)換) ;0 = A/D 轉(zhuǎn)換不在進(jìn)行(A/D 轉(zhuǎn)換完成后該位由硬件自動(dòng)清零) ;bit 1 保留:保持該位為“0” ;bit 0 ADON:A/D 開(kāi)啟位 ;1 = A/D 轉(zhuǎn)換模塊正在工作 ;0 = A/D 轉(zhuǎn)換模塊關(guān)閉,不消耗工作電流 ;******************************************************************************** ;**ADCON1 寄存器: ;bit 7-3 未使用:讀為0 ;bit 2-0 PCFG2:PCFG0:A/D 端口配置控制位 ;PCFG2-PCFG0 AN3 AN2 AN1 AN0 VREF ; RA3 RA2 RA1 RA0 ; 0x0 A A A A VDD ; 0x1 VREF A A A RA3 ; 100 A D A A VDD ; 101 VREF D A A RA3 ; 11x D D D D VDD ;A = 模擬輸入, D = 數(shù)字I/O。 ;******************************************************************************** ;1. 配置A/D 模塊: ;-配置模擬引腳/ 參考電壓/ 和數(shù)字I/O(ADCON1) ;-選擇A/D 輸入通道(ADCON0) ;-選擇A/D 轉(zhuǎn)換時(shí)鐘(ADCON0) ;-打開(kāi)A/D 模塊(ADCON0) ;2. 配置A/D 中斷(如果需要): ;-清零ADIF 位 ;-置位ADIE 位 ;-置位GIE 位 ;3. 等待需要的采集時(shí)間。 ;4. 啟動(dòng)轉(zhuǎn)換: ;-置位GO/DONE 位(ADCON0) ;5. 等待A/D 轉(zhuǎn)換完成,可以通過(guò)以下兩種方法之一來(lái)判斷:-查詢GO/DONE 位是否清零或等待A/D 中斷 ;6. 讀 A/D 結(jié)果寄存器(ADRES),如果需要,清除ADIF 位。 ;7. 如果需要進(jìn)行下一次A/D 轉(zhuǎn)換,根據(jù)需要轉(zhuǎn)到步驟1 或步驟2。 ;每一位的A/D 轉(zhuǎn)換時(shí)間定義為TAD,下一次采樣開(kāi)始前至少需要等待 2TAD。 ;A/D 轉(zhuǎn)換的結(jié)果存放在ADRES 寄存器中。當(dāng)A/D 轉(zhuǎn)換完成時(shí),結(jié)果被裝載到ADRES 寄存器,GO/DONE 位 ;(ADCON0<2>)被清零,且A/D 中斷標(biāo)志位ADIF 被置位 ;每位的A/D 轉(zhuǎn)換時(shí)間定義為TAD。每完成一次8 位A/D轉(zhuǎn)換需要9.5TAD 。 A/D 轉(zhuǎn)換的時(shí)鐘源可用軟件選擇。 ;TAD 可以有以下四種選擇: ;. 2TOSC ;. 8TOSC ;. 32TOSC ;. 內(nèi)部RC 振蕩器 ;為確保正確的A/D 轉(zhuǎn)換, A/D 轉(zhuǎn)換時(shí)鐘(TAD)必須保證最小TAD 時(shí)間為1.6 μs。 ;TAD 與器件工作頻率關(guān)系表 ; AD時(shí)鐘源(TAD) 器件頻率 ;------------------------------------------------------------------ ;|工作 | ADCS1:ADCS0 | 20 MHz | 5 MHz |1.25 MHz|333.33 kHz ;|2TOSC | 00 | -- | -- |1.6 μs | 6μs ;|8TOSC | 01 | -- |1.6 μs |6.4 μs | --- ;|32TOSC| 10 | 1.6 μs|6.4 μs |--- | --- ;|RC | 11 | 2-6 μs|2-6 μs |2-6 μs | 2-6 μs ;------------------------------------------------------------------- ;*****************************************************************************8 ;為了將為PIC16C5X 編寫(xiě)的代碼移植到PIC16F716,用戶需要遵循以下幾個(gè)步驟: ;1. 刪除為CALL、GOTO 指令的任何程序存儲(chǔ)器頁(yè)面選擇操作(PA2、PA1 和PA0 位)。 ;2. 檢查相對(duì)跳轉(zhuǎn)操作(寫(xiě)入PC 或?qū)⒓拥絇C 等),以確保在新方案下分頁(yè)位設(shè)置正確。 ;3. 刪除有關(guān)數(shù)據(jù)存儲(chǔ)器頁(yè)面切換的代碼,重新定義數(shù)據(jù)變量來(lái)為其重新分配存儲(chǔ)空間。 ;4. 由于Status、Option 和FSR 的位定義改變了,檢驗(yàn)所有寫(xiě)入這些寄存器的指令。 ;5. 將復(fù)位向量變?yōu)?000h。 ;****************************************************************************** ; ______________ ; AN2/RA2-| 1 18 |-RA1/AN1 ; AN3/VREF/RA3-| 2 17 |-RA0/AN0 ; RA4/T0CKI-| 3 16 |-OSC1/CLKIN ; MCLR -| 4 15 |-OSC2/CLKOUT ; VSS-| 5 14 |-VDD ;INT/ECCPAS2/RB0-| 6 13 |-RB7/P1D ;T1OSO/T1CKI/RB1-| 7 12 |-RB6/P1C ; T1OSI/RB2-| 8 11 |-RB5/P1B ; CCP1/P1A/RB3-| 9 10 |-RB4/ECCPAS0 ; ~~~~~~~~~~~~~~~ ; 16F716 ;********************************************************* ;復(fù)位地址: ORG 000H GOTO MAIN ;中斷地址: ORG 004H RETFIE ORG 010H ;************************************* ;****** 這是清零子程式 ****** ;************************************* RESET_: CLRF STATUS MOVLW B'00100000' ;20H-7FH MOVWF FSR BANK0: CLRF INDF INCF FSR BTFSS FSR,7 GOTO BANK0 BSF STATUS,PS1 MOVLW B'10100000' ;A0H-FFH MOVWF FSR BANK1: CLRF INDF INCF FSR BTFSS STATUS,Z GOTO BANK1 BCF STATUS,PS1 RETLW 0 ;************************************* MAIN: CALL RESET_ GOTO MAIN END |