PIC16F716初始化头文件
;**********************************************
;*********这是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:**
CEQU 0 ;有进位或无借位为1
DCEQU 1 ;
ZEQU 2 ;运算结果为0时=1
PDEQU 3 ;
TOEQU 4 ;看门狗溢出时为0,上电时为1
PS0EQU 5 ;|直接寻址使用 _6/5=00=00H-7FH RAM(20-7FH)
PS1EQU 6;|_6/5=10=80H-FFH RAM(A0-FFH)
PS2EQU 7 ;间接寻址用 1=100-1FFH(存储区2和3)0=0-FFH(存储区0和1)
;*********************************************************************************
;**OPTION_:
;BIT0-2=预分频器分频比选择位
;位值 TMR0分频比WDT分频比
;0001 :21 : 1
;001 1 :41 : 2
;010 1 :81 : 4
;011 1 :161 : 8
;100 1 :321 : 16
;101 1 :641 : 32
;110 1 :128 1 :64
;111 1 :256 1 :128
;BIT3=预分频器分配位
;1 = 预分频器分配给WDT
;0 = 预分频器分配给Timer0 模块
;BIT4=TMR0计数脉冲边沿选择位
;1 = 在RA4/T0CKI 引脚上的下降沿递增1
;0 = 在RA4/T0CKI 引脚上的上升沿递增1
;BIT5=TMR0时钟源选择位
;1 = RA4/T0CKI 引脚上的外部时钟
;0 = 内部指令周期时钟(CLKOUT)
;BIT6=中断触发边沿选择位
;1 = RB0/INT 引脚上上升沿触发中断
;0 = RB0/INT 引脚上下降沿触发中断
;BIT7=PORTB 弱上拉使能位
;1 = 禁止PORTB 弱上拉
;0 = PORTB 弱上拉由备用功能或TRISBn位的值确定
;**********************************************************************************
;**INTCON 寄存器: ;当中断条件发生时,中断标志位就会被置1,而不管相应中断使能位或全局中断使能
;位 GIE(INTCON<7>)的状态。因此在使能中断前,用户软件必须把相应的中断标志位清零。
RBIF EQU 0 ;RB口电平变化中断标志位
;1 = RB7:RB4引脚中至少有一个引脚状态发生变化(必须用软件清零)
;0 = RB7:RB4 引脚状态无变化
INTF EQU 1 ;RB0/INT 外部中断标志位
;1 = RB0/INT引脚上有外部中断发生(必须用软件清零)
;0 = RB0/INT 引脚上没有外部中断发生
T0IF EQU 2 ;TMR0 溢出中断标志位
;1 = TMR0 计数器溢出(必须用软件清零)
;0 = TMR0 计数器没有溢出
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 ;外设中断使能位
;1 = 开放所有未被屏蔽的外设中断
;0 = 禁止所有的外设中断
GIE EQU 7 ;全局中断使能位
;1 = 使能所有未被屏蔽的中断
;0 = 禁止所有中断
;*******************************************************************************
;**PIE1 寄存器: (要使能任何外设中断,必须置位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 未使用:读出时为0
ADIE EQU 6 ;A/D 转换器中断使能位
;1 = 允许A/D 转换器中断
;0 = 禁止A/D转换器中断
;********************************************************************************
;**PIR1 寄存器:
TMR1IF EQU 0 ;TMR1 溢出中断标志位
;1 = TMR1 溢出(必须用软件清零)
;0 = TMR1 未溢出
TMR2IF EQU 1 ;TMR2 和 PR2 匹配中断标志位
;1 = TMR2 和 PR2匹配发生(必须用软件清零)
;0 = TMR2 和 PR2匹配未发生。
CCP1IF EQU 2 ;CCP1 中断标志位
;捕捉方式:
;1 = TMR1寄存器发生捕捉(必须用软件清零)
;0 = TMR1 寄存器未发生捕捉
;比较方式:
;1 = TMR1寄存器发生比较匹配(必须用软件清零)
;0 = TMR1 寄存器未发生比较匹配
;PWM 方式:
;未使用
ADIF EQU 6 ;A/D 转换器中断标志位
;1 = A/D 转换已完成(必须用软件清零)
;0 = A/D 转换未完成
;bit 7 5-3 未使用:读出时为0
;**********************************************************************************
;**PCON 寄存器
BOR EQU 0 ;欠压复位状态位
;1 = 未发生欠压复位
;0 =发生欠压复位(必须在欠压复位后用软件置位)
POR EQU 1 ;上电复位状态位
;1 = 未发生上电复位
;0 =发生上电复位(必须在上电复位后用软件置位)
;bit 7-2 未使用:读出时为0
;********************************************************************************
;修改PCL
;执行任何将PCL寄存器作为目的寄存器的指令将同时使程序计数器PC<12:8>位(PCH)的值
;被PCLATH 寄存器的值替换。这将允许通过写PCLATH 寄存器的高5位改变整个程序计数器的
;值。当低8 位被写入PCL 寄存器时,所有程序计数器的13 位都被修改为PCLATH 寄存器中
;的值和写到PCL 寄存器的值。通过修改PCL 寄存器跳转到查找表或程序分支表(执行GOTO
;指令)时必须小心。PCLATH 被赋予表的起始地址,如果表长度大于255 条指令或者表中存
;储器地址的低8 位从0xFF 循环返回到0x00,在表的起始地址和目标地址之间每次地址翻转
;时PCLATH 必须递增1。
;程序存储器分页
;CALL 和 GOTO指令提供11 位地址,允许在 2K 程序存储页面内跳转。指行 CALL 或 GOTO
;指令时,地址的高位由PCLATH<3> 提供。当执行 CALL 或GOTO 指令时,用户必须事先设
;置了页面选择位,以便指向所需的程序存储页面。如果执行CALL 指令(或中断)的RETURN
;整个13 位的PC 被全部压入堆栈。因此执行RETURN 指令(它将地址从堆栈中弹出)之前
;无需对PCLATH<3>位进行设置。
;********************************************************************************
;***T1CON TIMER1 控制寄存器:
;bit 5-4 T1CKPS1:T1CKPS0:Timer1 输入时钟预分频比选择位
;11 = 1:8 预分频比
;10 = 1:4 预分频比
;01 = 1:2 预分频比
;00 = 1:1 预分频比
;bit 3 T1OSCEN:Timer1 振荡器使能控制位
;1 = 使能振荡器
;0 = 关闭振荡器(1)
;bit 2 T1SYNC:Timer1 外部时钟输入同步控制位
;TMR1CS = 1
;1 = 不与外部时钟输入同步
;0 = 与外部时钟输入同步
;TMR1CS = 0
;忽略该位。当TMR1CS = 0 时, Timer1 使用内部时钟。
;bit 1 TMR1CS:Timer1 时钟源选择位
;1 = 使用RB1/T1OSO/T1CKI引脚的外部时钟(第一个下降沿后的上升沿)
;0 = 使用内部时钟(FOSC/4)
;bit 0 TMR1ON:Timer1 使能位
;1 = 使能Timer1
;0 = 关闭Timer1
;*******************************************************************************
;**T2CON:TIMER2 控制寄存器:
;bit 7 未使用:读出时为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 = 关闭Timer2
;bit 1-0 T2CKPS1:T2CKPS0:
;00 = 预分频比为1
;01 = 预分频比为4
;1x = 预分频比为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 调制, P1B、P1C 和P1D 配置为端口引脚;
;01 = 四正向输出, P1D 调制, P1A 有效, P1B 和P1C 无效;
;10 = 双输出, P1A 和P1B 调制,带有死区控制。P1C 和P1D配置为端口引脚;
;11 = 四反向输出, P1B 调制, P1C 有效, P1A 和P1D 无效。
;bit 5-4 DC1B1:DC1B0:PWM 低有效位
;捕捉模式:未使用;
;比较模式:未使用;
;PWM 模式:这些位是PWM 占空比的低2 位。高8 位在CCPR1L 中。
;bit 3-0 CCP1M3:CCP1M0:ECCP 模式选择位
;0000 =捕捉/ 比较/PWM 关闭(复位ECCP 模块)
;0001 =未使用(保留)
;0010 =比较模式,匹配时翻转输出(置位CCP1IF 位)
;0011 =未使用(保留)
;0100 =捕捉模式,每个下降沿
;0101 =捕捉模式,每个上升沿
;0110 =捕捉模式,每4 个上升沿
;0111 =捕捉模式,每16 个上升沿
;1000 =比较模式,匹配时CCP1 输出置位(置位CCP1IF 位)
;1001 =比较模式,匹配时CCP1 输出清零(置位CCP1IF 位)
;1010 =比较模式,匹配时产生软件中断(置位CCP1IF 位, CCP1引脚不受影响)
;1011 =比较模式,触发特殊事件(置位CCP1IF 位,复位TMR1,且如果A/D模块被使能,启动一次A/D 转
;换。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 重新启动使能位
;1 = 自动关闭时,一旦关闭事件消失, ECCPASE 位自动清零; PWM自动重新启动。
;0 = 自动关闭时, ECCPASE 必须由软件清零以重新启动PWM。
;bit 6-0PDC<6:0>:PWM 延时计数位
;在PWM信号应该转换为有效的预定时间和转换为有效的实际时间之间的FOSC/4(4*TOSC)周
;期数
;*********************************************************************************
;***ECCPAS 增强型CCP 自动关闭寄存器
;bit 7 ECCPASE:ECCP 自动关闭事件状态位
;1 = 发生了关闭事件。如果PRSEN =0,必须在软件中复位以重新使能ECCP。
;0 = ECCP 输出使能,无关闭事件。
;bit 6 ECCPAS2: ECCP 自动关闭位2
;1 = RB0(INT)引脚低电平0导致关闭
;0 = RB0(INT)引脚对ECCP 无影响
;bit 5 未使用:读出时为“0”
;bit 4 ECCPAS0 ECCP 自动关闭位
;1 = RB4引脚低电平(“0”)导致关闭
;0 = RB4引脚对ECCP 无影响
;bit 3-2PSSAC<1:0>:引脚P1A 和P1C 关闭状态控制
;00 =驱动引脚P1A 和P1C 为“0”
;01 =驱动P1A 和P1C 为“1”
;1x =引脚P1A 和P1C 为三态
;bit 1-0PSSBD<1:0>:引脚P1B 和P1D 关闭状态控制
;00 =驱动引脚P1B 和P1D为0
;01 =驱动引脚P1B 和P1D为1
;1x =引脚P1B 和P1D 为三态
;*******************************************************************************
;**ADCON0 寄存器:
;bit 7-6 ADCS1:ADCS0:A/D 转换时钟选择位
;00 = FOSC/2 01 =FOSC/8 10 = FOSC/32 11 = FRC (时钟来自内部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 转换状态位
;如果ADON = 1
;1 = A/D 转换正在进行(将该位置位启动A/D 转换)
;0 = A/D 转换不在进行(A/D 转换完成后该位由硬件自动清零)
;bit 1 保留:保持该位为“0”
;bit 0 ADON:A/D 开启位
;1 = A/D 转换模块正在工作
;0 = A/D 转换模块关闭,不消耗工作电流
;********************************************************************************
;**ADCON1 寄存器:
;bit 7-3 未使用:读为0
;bit 2-0 PCFG2:PCFG0:A/D 端口配置控制位
;PCFG2-PCFG0AN3 AN2AN1AN0 VREF
;RA3 RA2RA1 RA0
;0x0AAAA VDD
;0x1VREFAAA RA3
;100ADAA VDD
;101VREFDAA RA3
;11xDDDD VDD
;A = 模拟输入, D = 数字I/O。
;********************************************************************************
;1. 配置A/D 模块:
;-配置模拟引脚/ 参考电压/ 和数字I/O(ADCON1)
;-选择A/D 输入通道(ADCON0)
;-选择A/D 转换时钟(ADCON0)
;-打开A/D 模块(ADCON0)
;2. 配置A/D 中断(如果需要):
;-清零ADIF 位
;-置位ADIE 位
;-置位GIE 位
;3. 等待需要的采集时间。
;4. 启动转换:
;-置位GO/DONE 位(ADCON0)
;5. 等待A/D 转换完成,可以通过以下两种方法之一来判断:-查询GO/DONE 位是否清零或等待A/D 中断
;6. 读 A/D 结果寄存器(ADRES),如果需要,清除ADIF 位。
;7. 如果需要进行下一次A/D 转换,根据需要转到步骤1 或步骤2。
;每一位的A/D 转换时间定义为TAD,下一次采样开始前至少需要等待 2TAD。
;A/D 转换的结果存放在ADRES 寄存器中。当A/D 转换完成时,结果被装载到ADRES 寄存器,GO/DONE 位
;(ADCON0<2>)被清零,且A/D 中断标志位ADIF被置位
;每位的A/D 转换时间定义为TAD。每完成一次8 位A/D转换需要9.5TAD 。 A/D 转换的时钟源可用软件选择。
;TAD 可以有以下四种选择:
;. 2TOSC
;. 8TOSC
;. 32TOSC
;. 内部RC 振荡器
;为确保正确的A/D 转换, A/D 转换时钟(TAD)必须保证最小TAD 时间为1.6 μs。
;TAD 与器件工作频率关系表
;AD时钟源(TAD)器件频率
;------------------------------------------------------------------
;|工作 | ADCS1:ADCS0 | 20 MHz | 5MHz |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 编写的代码移植到PIC16F716,用户需要遵循以下几个步骤:
;1. 删除为CALL、GOTO 指令的任何程序存储器页面选择操作(PA2、PA1 和PA0 位)。
;2. 检查相对跳转操作(写入PC 或将加到PC 等),以确保在新方案下分页位设置正确。
;3. 删除有关数据存储器页面切换的代码,重新定义数据变量来为其重新分配存储空间。
;4. 由于Status、Option 和FSR 的位定义改变了,检验所有写入这些寄存器的指令。
;5. 将复位向量变为0000h。
;******************************************************************************
;______________
;AN2/RA2-|118 |-RA1/AN1
; AN3/VREF/RA3-|217 |-RA0/AN0
;RA4/T0CKI-|316 |-OSC1/CLKIN
; MCLR -|415 |-OSC2/CLKOUT
;VSS-|514 |-VDD
;INT/ECCPAS2/RB0-|613 |-RB7/P1D
;T1OSO/T1CKI/RB1-|712 |-RB6/P1C
;T1OSI/RB2-|811 |-RB5/P1B
; CCP1/P1A/RB3-|910 |-RB4/ECCPAS0
;~~~~~~~~~~~~~~~
;16F716
;*********************************************************
;复位地址:
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
参考链接:http://www.picavr.com/news/2008-01/1679.htm