首先给你看下源代码:
第10章 利用CCP模块设计频率计
10.5 程序设计
10.5.4 程序清单
#include
#include
#include
//本程序利用CCP1模块实现一个“简易数字频率计”的功能
const char table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};
//不带小数点的显示段码表
const char table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};
//带小数点的显示段码表
bank3 int cp1z[11]; //定义一个数组,用于存放各次的捕捉值
union cp1
{int y1;
unsigned char cp1e[2];
}cp1u; //定义一个共用体
unsigned char COUNTW,COUNT; //测量脉冲个数寄存器
unsigned char COUNTER,data,k;
unsigned char FLAG @ 0XEF;
#define FLAGIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //绝对寻址位操作指令
static bit FLAG1 @ FLAGIT(FLAG,0);
static bit FLAG2 @ FLAGIT(FLAG,1);
static bit FLAG3 @ FLAGIT(FLAG,2);
unsigned char s[4]; //定义一个显示缓冲数组
int T5 ,uo;
double RE5;
double puad5;
//spi方式显示初始化子程序
void SPIINIT()
{
PIR1=0;
SSPCON=0x30;
SSPSTAT=0xC0;
//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送,与"74HC595,当其
//SCLk从低到高跳变时,串行输入寄存器"的特点相对应
TRISC=0xD7; //SDO引脚为输出,SCK引脚为输出
TRISA5=0; //RA5引脚设置为输出,以输出显示锁存信号
FLAG1=0 ;
FLAG2=0 ;
FLAG3=0 ;
COUNTER=0X01;
}
//CCP模块工作于捕捉方式初始化子程序
void ccpint( )
{
CCP1CON=0X05; //首先设置CCP1捕捉每个脉冲的上升沿
T1CON=0X00; //关闭TMR1震荡器
PEIE=1; //外围中断允许(此时总中断关闭)
CCP1IE=1; //允许CCP1中断
TRISC2=1; //设置RC2为输入
}
//系统其它部分初始化子程序
void initial( )
{
COUNT=0X0B; //为保证测试精度,测试5个脉冲的参数后
//求平均值,每个脉冲都要捕捉其上升、下降沿,
//故需要有11次中断
TRISB1=0;
TRISB2=0;
TRISB4=1;
TRISB5=1; //设置与键盘有关的各口的输入、输出方式
RB1=0;
RB2=0; //建立键盘扫描的初始条件
}
//SPI传送数据子程序
void SPILED(data)
{
SSPBUF=data; //启动发送
do {
;
}while(SSPIF==0);
SSPIF=0;
}
//显示子程序,显示4位数
void display( )
{
RA5=0; //准备锁存
for(COUNTW=0;COUNTW