要阅读先前关于PIC 16F877基础知识的文章,请单击下面的链接。

看一看:外围接口控制器(PIC)

看一看:pic167f877简介

看一看:PIC 16F877 - 架构和记忆组织

在PIC16F877中注册存储器组织

寄存器是用于读取或写入数据/程序的图片中的一个位置。PIC的存储器分为一系列寄存器。每个寄存器都有自己的地址和内存位置。这些地址通常通过使用十六进制数表示。根据工作和用法的类型,PIC中的寄存器分为两类。

通用寄存器(GPR)

GPR是一种比任何其他存储器都能更快访问的少量存储器。这些寄存器文件可以通过文件选择寄存器(FSR)直接或间接访问。通用寄存器(GPR)存储器映射(PIC16F877A)如下图所示。

通用寄存器- PIC 16F877
通用寄存器- PIC 16F877

特殊功能寄存器(SFR)

特殊功能寄存器也是用于特殊专用功能的存储器寄存器。这些寄存器在PIC芯片内执行各种专用功能。PIC芯片中的每个特殊功能都是通过使用这些寄存器来控制的。CPU和外围模块使用这些寄存器来控制设备的所需操作。这些寄存器通常以静态RAM存储器的形式实现。下表列出了这些寄存器的列表。特殊功能寄存器可分为两组:核心(CPU)和外围设备。本节详细描述了与核心功能相关的寄存器。下图显示了PIC16F877的SFR内存映射。

特殊功能寄存器(SFR)-PIC 16F877
特殊功能寄存器(SFR)-PIC 16F877
特殊功能寄存器(SFR)-PIC 16F877
特殊功能寄存器(SFR)-PIC 16F877

状态寄存器

状态寄存器是一个8位寄存器,包含算术逻辑单元(ALU)的算术状态、复位状态和数据存储器的银行选择位。下面是状态寄存器的详细说明。

状态寄存器(地址03h,83h,103h和183h)

r / w * -0 R / w 0 R / w 0 R-1 R-1 r / w-x ** r / w-x r / w-x
IRP RP1. RP0. PD. Z 直流 C

Bit7位0.

(*R/W-可读/可写,**x-未知位)

  • 第7位- (IRP):这是一个寄存器银行选择位,通常用于间接寻址模式。
  • 位6-5(rp1:rp0):这些位是常用用于直接寻址模式的寄存器组选择位(此模式下的每个银行携带128副)

(11 =银行3(180H-1FFH)

10=气缸组2(100h-17Fh)

01 =银行1(80H-FFH)

00 = Bank 0(00H-7FH))

  • 第4位,(TO):这是一个超时位,用于计时、计数、休眠和复位功能。

(1 =开机后,CLRWDT指令或SLEEP指令

0 =发生WDT超时))

  • 第3位(PD):下电位

(1 =上电后或通过CLRWDT指令

0 =执行睡眠指令)

  • 位2,(z):零位

(1 =算术或逻辑操作的结果为零

0 =算术或逻辑操作的结果不是零。)

  • 位1 DC:数字携带/借用位(ADDWF,AddLW,Sublw,Subwf指令)

(对于借用,极性颠倒)

(1 =从结果的第4低阶位进位

0 =没有从结果的第4个低阶位执行。)

  • 位0(c):携带/借用位(addwf,addlw,sublw,subwf指令)

(1=从结果的最高有效位执行的进位

0 =没有从结果的最高有效位执行。)

选项寄存器

选项Register是一个可读和可写的寄存器,它包含各种控制位来配置TMR0预分配器/WDT后标量器(单个可分配寄存器也称为预标量器)、外部INT中断、TMR0和PORTB上的弱上拉。期权寄存器的结构如下所示。

R / w1 R / w1 R / w1 R / w1 R / w1 R / w1 R / w1 R / w1
RBPU(反转) INTEDG t0cs. T0SE. PSA PS2 PS1 PS0

7 0

  • Bit 7 (RBPU):这是一个PORTB上拉使能位。如果这个位是' 1 ',那么PORTB上拉功能被禁用。如果该位为' 0 ',则通过单个端口闩锁值启用上拉功能。

(1=端口B上拉被禁用。

0 = PORTB上拉由单个端口锁存值启用。)

  • 位6(Intedg):这是一个中断边缘选择位。如果中断位于raisin边缘或下降沿,则该位决定。下面给出了该位的功能。

(1 = RB0​​ / INT引脚上升沿上的中断。

0=RB0/INT引脚下降沿中断。)

  • 第5位(T0CS):这是一个定时器-0(TMR0)时钟源选择位,其功能如下所示。

(1=RA4/T0CKI销上的过渡。

0 =内部指令周期时钟(CLKO)。)

  • 位4(T0SE):TMR0源边选择位,用于选择定时器0源边。

(1 = RA4 / T0cki引脚上的高到低过渡递增。

0 = RA4 / T0CKI引脚上的低到高转换的增量。)

  • 位3(PSA):预分频器分配位。

(1 =预分频器被分配给手表狗定时器(WDT)。

0=将预分频器分配给定时器0模块。)

  • 比特2-0(PS2:PS0):预分频器速率选择比特。

INTCON寄存器

Intcon寄存器是一个可读性的可写寄存器,其中包含各种启用和标志位

TMR0寄存器溢出,RB端口更改和外部RB0 / INT引脚中断。下面给出了该寄存器的架构。

R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 r / w-x
g tmr0ie. INTE rbie. TMR0IF. INTF rbif.
  • 位7gie:全局中断使能位。如果该位为enable(' 1 '),也启用所有未屏蔽中断;如果该位为0(' 0 '),则禁用所有中断。

(1 =启用所有未屏蔽中断。

0 =禁用所有中断。)

  • 第6位(PEIE):这是一个外围中断启用位,用于控制外围中断。如果该位为启用(“1”),则还将启用所有未屏蔽的外围中断,如果为禁用(“0”),则还将禁用所有活动的外围中断动作。

(1=启用所有未屏蔽的外围中断

0 =禁用所有外设中断)

  • 第5位(TMR0IE):这是定时器0(TMR0)溢出中断使能位,它控制定时器0中的溢出中断。

(1 =开启TMR0中断

0=禁用TMR0中断)

  • 位4(INTE):这是一个RB0/INT外部中断启用位,用于启用/禁用外部中断。

(1=启用RB0/INT外部中断

0 =禁用RB0 / int外部中断)

  • 位3(RBIE):控制端口B更改中断的RB端口更改中断启用位。

(1 =开启RB端口变更中断。

0=禁用RB端口更改中断。)

  • 位2(TMR0IF):TMR0溢出中断标志位控制定时器0的溢出。

(1 = TMR0寄存器溢出[必须在软件中清除]

0 = TMR0寄存器没有溢出)

  • 位1(INTF):RB0/INT外部中断标志控制位。

(1=发生RB0/INT外部中断(必须在软件中清除)

0 = RB0/INT外部中断未发生)。

  • Bit 0 (RBIF): RB端口改变中断标志位。

(1 = RB7:RB4引脚的至少一个改变状态;不匹配条件将继续设置该位。读数PortB将结束不匹配状态并允许该位清除

[必须在软件中清除])。

Pie1注册

PIE1寄存器包含用于外围中断的各个启用位。该寄存器的结构如下所示。

R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 R / w 0 R / w 0
PSPIE 爱狄 RCIE TXIE SSPIE. ccp1ie. TMR2IE TMR1IE
  • 位7(PSPIE):该位是并行从端口读/写中断启用位

(1 =启用PSP读/写中断

0 =禁用PSP读写中断)

  • 位6(ADIE):A / D转换器中断使能位控制模拟与数字转换器中断。

(1 =允许A/D转换器中断

0 =禁用A/D转换器中断)

  • 位5(RCIE):控制USART数据接收中断的USART接收中断启用位。

(1=启用USART接收中断

0 =禁用USART接收中断)

  • 位4(TXIE):USART发送中断使能位控制USART数据传输。

(1 =启用USART传输中断

0 =禁用USART发送中断)

  • Bit 3 (SSPIE):同步串行端口中断使能位,控制SSP数据中断。

(1 =启用SSP中断

0=禁用SSP中断)

  • 位2(CCP1IE):CCP1中断使能位控制捕获比较脉冲宽度调制中断。

(1 =开启CCP1中断

0 =禁用CCP1中断)

  • Bit 1 (TMR2IE): TMR2到PR2匹配中断使能位。

(1 =开启TMR2到PR2匹配中断

0=禁用TMR2至PR2匹配中断)

  • 位0(TMR1IE):TMR1溢出中断使能位控制定时器1模块的溢出中断。

(1 =启用TMR1溢出中断

0 =禁用TMR1溢出中断)

PIR1注册

PiR1寄存器包含外围中断的单个标志位。PiR1寄存器的结构如下所述。

R / w 0 R / w 0 R-0. R-0. R / w 0 R / w 0 R / w 0 R / w 0
PSPIF ADIF RCIF TXIF SSPIF. ccp1if. TMR2IF TMR1IF
  • 第7位(PSPIF):并行从端口读写中断标志位。

(1 =已发生读取或写入操作(必须在软件中清除)

0 =没有发生读取或写)

  • 位6(ADIF):A / D转换器中断标志标志位,用于控制该模数转换器的中断标志。

(1 = A/D转换完成

0 = A / D转换不完整)

  • 位5(RCIF):USART接收中断标志位。

(1=USART接收缓冲区已满

0=USART接收缓冲区为空)

  • 第4位(TXIF): USART传输中断标志位。

(1 = USART发送缓冲区为空

0=USART传输缓冲区已满)

  • 位3(SSPIF):同步串口(SSP)控制图片中的SSP中断标志的中断标志位。

(1 = SSP中断条件发生,必须在从中断服务程序返回之前在软件中清除。将设置该位的条件是:

•SPI - 传输/接收发生。

•I2C奴隶 - 传输/接收已发生。

•I2C主人

- 传输/接收发生了。

- SSP模块完成发起的开始条件。

–启动的停止条件由SSP模块完成。

- SSP模块完成了启动的重启条件。

- SSP模块完成了启动的确认条件。

—SSP模块空闲(多主系统)时出现启动条件。

—SSP模块空闲(多主系统)时发生停止状态。

0 =没有发生SSP中断条件)

  • 第2位(CCP1IF): CCP1中断标志位,控制捕获比较脉冲宽度调制中断标志。它有三种模式。它们如下所示。

1.捕获模式:

1=发生TMR1寄存器捕获(必须在软件中清除)

0 =没有发生TMR1寄存器捕获

2.比较模式:

1 =发生TMR1寄存器比较匹配(必须在软件中清除)

0=未发生TMR1寄存器比较匹配

3.PWM模式:

  • 位1(TMR2IF):TMR2至PR2匹配中断标志位

(1=TMR2与PR2发生匹配(必须在软件中清除)

0 =没有TMR2到PR2匹配发生)

  • 位0(TMR1IF):TMR1溢出中断标志位。

(1=TMR1寄存器溢出(必须在软件中清除)

0=TMR1寄存器未溢出)

PIE2注册

Pie2寄存器包含CCP2外设中断的单个使能位,SSP总线冲突

中断,EEPROM写操作中断和比较器中断。这个寄存器的结构如下所示。

U-0 R / w 0 U-0 R / w 0 R / w 0 U-0 U-0 R / w 0
- - - CMIE - - - eeie. BCLIE. ------ - - - CCP2IE
  • Bit 7未实现:阅读为“0”
  • 第6位(CMIE):比较器中断使能位

(1 =启用比较器中断

0 =禁用比较器中断)

  • 第5位未实现:读作“0”

位4(EEIE):EEPROM写入操作中断启用位

(1 =使能EEPROM写中断

0 =禁用EEPROM写入中断)

  • 第3位(BCLIE):总线碰撞中断启用位。

(1 =启用总线冲突中断

0 =禁用总线碰撞中断)

  • 第2-1位未实现:读取为' 0 '
  • 位0(CCP2IE):CCP2中断使能位。

(1 =启用CCP2中断

0 =禁用CCP2中断)

PIR2注册

PIR2寄存器包含CCP2中断、SSP总线冲突中断、EEPROM写操作中断和比较器中断的标志位。这个寄存器的结构如下所示。

U-0 R / w 0 U-0 R / w 0 R / w 0 U-0 U-0 R / w 0
- - - CMIF - - - EEIF. BCLIF. - - - - - - CCP2IF
  • Bit 7未实现:阅读为“0”
  • 第6位(CMIF):比较器中断标志位

(1=比较器输入已更改(必须在软件中清除)

0 =比较器输入没有改变)

  • 第5位未实现:读作“0”
  • 位4(EEIF):EEPROM写操作中断标志位。

(1 =完成写操作(必须在软件中清除)

0 =写操作未完成或尚未开始)

  • 第3位(BCLIF):总线冲突中断标志位。

(1 =在SSP配置为I2C主模式时,SSP中发生了总线冲突

0 =没有发生总线碰撞)

  • 第2-1位未实现:读取为' 0 '
  • 位0(CCP2IF):CCP2中断标志位。这也适用于三种模式。它们是

1.捕获模式:

1=发生TMR1寄存器捕获(必须在软件中清除)

0 =没有发生TMR1寄存器捕获

比较模式:

1 =发生TMR1寄存器比较匹配(必须在软件中清除)

0=未发生TMR1寄存器比较匹配

2. PWM模式:

该模式不使用。

PCON注册

电源控制(PCON)寄存器包含标志位,以允许在电源复位之间进行差异

(POR),一个欠压复位(BOR),看门狗复位(WDT)和外部MCLR复位。这个寄存器的结构如下所示。

U-0 U-0 U-0 U-0 U-0 U-0 R / w 0 R / w1
—— --- --- --- --- --- (反相) BOR(反相)
  • Bit 7-2未实现:阅读为“0”
  • 位1(POR):上电复位状态位

(1 =没有上电复位

0 =上电复位(上电复位后必须在软件中设置)

  • 位0(BOR):棕色输出复位状态位

(1=未发生褐灭重置

0=发生棕出重置(必须在棕出重置发生后在软件中设置)。

作者

6注释

  1. arunkumar.

    该程序将帮助您计算脉冲并在LCD显示屏中显示它

    # include
    #include“delay.h”
    #包括“lcd.h”

    __config(0x3f71);
    #define lcd_rs rc0.
    #define lcd_en rc1.
    #定义LCD_DATA PORTD
    静态无符号整数秒;
    静态无符号整数频率;
    静态unsigned char stat;
    / /液晶显示子程序

    / *在4位模式下将字节写入LCD * /

    / *初始化LCD - 投入4位模式* /
    空白lcd_init(空白)

    lcd_rs = 0;
    lcd_en = 0;
    延迟(100);//施用电源后等待15毫秒,
    lcd_write(0x01);//
    lcd_rs = 0;
    lcd_write(0x38);//
    lcd_rs = 0;
    lcd_write(0x0c);//显示在,光标上,光标关闭
    lcd_rs = 0;
    lcd_write (0 x06);//设置入口模式

    / /端口初始化

    空白port_init(空白)

    TRISE = 0;
    端口=0;

    //主要功能

    void main()

    静态无符号字;
    ADCON1=0x06;
    trisc = 0x08;
    portc = 0;
    TRISD = 0;
    PORTD=0;
    trisb = 0xff;
    // portb = 0;

    lcd_init();
    lcd_goto0 (0);
    lcd_rs = 1;
    lcd_puts(“脑拍白”);
    lcd_goto1 (0);
    lcd_puts(“state =”);
    port_init();
    / /如果(PORTB ^ 1 = = 1)
    stat=0xff;

    而(1)
    {a = portb;
    if((a&0x02)==(stat&0x02))
    {stat=~stat;
    弗雷克++;


    延迟(10);
    秒+ +;
    如果(sec = = 200)
    {sec = 0;
    频率=频率*100;
    if(freq> 50 && freq400 && freq800 && freq1350)
    {lcd_goto1 (8);
    lcd_puts(“退出”);
    freq = 0;

    freq = 0;

  2. 阿比克何塞

    如何创建PIC16F877A中计算脉冲的程序

Baidu