📄 cmp.c
字号:
///////比较器0调试程序,带中断处理和比较器状态crossbar输出//////////
///////比较器0输出为P0.0口,比较器1输出为P0.1口,比较器2输出为P0.2口///////////
///////比较器0输入口为P2.6(+),和P2.7(-)///////////////////////////////////////
//////cmp.c////////////////
#include "lcd.h"
uchar temppage;
bit isnewdata;
bit isComp0Rise;
bit isComp0Fall;
void funtion_on_cp0_R();
void function_on_cp0_F();
void comp0_ini();
void comp1_ini();
void comp2_ini();
void comp0_ini(){
SFRPAGE=0x01;
CPT0MD=0x33;//响应时间为4us,上升沿和下降沿均中断使能
CPT0CN=0x8f;//正负回滞均为20mv
SFRPAGE = 0x0F;
P2MDIN&=0x3f;//将比较器输入口配置为模拟输入
XBR0|=0x80;//CP0E=1,将比较器0输出管脚配置到P口上。
EIE1|=0x10;//比较器0中断开启。
}
void funtion_on_cp0_R(){//CP0上升沿处理程序
}
void function_on_cp0_F(){//CP0下降沿处理程序
}
void comp1_ini(){//比较器1初始化
SFRPAGE=0x02;
CPT1MD=0x33;
CPT1CN=0x8f;
SFRPAGE = 0x0F;
P2MDIN&=0xf3;
XBR1|=0x01;//将比较器1输出管脚配置到P口上。
EIE1|=0x20;//比较器1中断开启。
}
void comp2_ini(){//比较器2初始化
SFRPAGE=0x03;
CPT1MD=0x33;
CPT1CN=0x8f;
SFRPAGE = 0x0F;
P2MDIN&=0xcf;
XBR3|=0x08;//将比较器2输出管脚配置到P口上。
EIE1|=0x40;//比较器2中断开启。
}
void config (void) {
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
XBR3 = 0x00;
SFRPAGE = 0x0F;
P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
P1MDOUT = 0x00;
P2MDOUT = 0x00;
P3MDOUT = 0x00;
P4MDOUT = 0x00; //P4口为开漏,若为推挽式则无法读取LCD数据
P5MDOUT = 0x07;
P6MDOUT = 0x00;
P7MDOUT = 0x00;
P1MDIN = 0xFF; //所有端口为数字输入,没有模拟输入端口
P2MDIN = 0xFF;
P3MDIN = 0xFF;
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用内部晶振,为24.5MHZ8分频
}
void main(){
xdata ulong systime0,systime1;
config();
dispini();
SFRPGCN=0x00;//将SFRPGEN清零,禁止中断时对SFRPAGE自动入栈
/*
因为程序中出现3个以上中断,而SFRPAGE堆栈只有3字节,为防止堆栈溢出,采用软件控制SFRPAGE
*/
comp0_ini();//比较器0初始化程序
comp1_ini();//比较器1初始化程序
comp2_ini();//比较器2初始化程序
EA=1;
systime0=0;
systime1=0;
while(1){
if(isComp0Rise){
isComp0Rise=0;
funtion_on_cp0_R();
showline("Comp0 rise occur",0);
systime0=0;
}
else{//相当于延时程序,对"Comp0 rise occur"显示延时
systime0++;
if(systime0>=20000L){
systime0=0L;
showline("Comp0 no rise ",0);
}
}
if(isComp0Fall){
isComp0Fall=0;
function_on_cp0_F();
showline("Comp0 fall occur",1);
systime1=0;
}
else{//相当于延时程序,对"Comp0 fall occur"显示延时
systime1++;
if(systime1>=20000L){
systime1=0L;
showline("Comp0 no fall ",1);
}
}
}
}
void CP0_ISR() interrupt 10{//比较器0中断
/*比较器中断标志位须在比较器状态发生跳变才会置1*/
temppage=SFRPAGE;//软件保护SFRPAGE
SFRPAGE=0x01;
if(CP0RIF){
isComp0Rise=1;
CP0RIF=0;
}
if(CP0FIF){
isComp0Fall=1;
CP0FIF=0;
}
SFRPAGE=temppage;
}
void CP1_ISR() interrupt 11{//比较器1中断
temppage=SFRPAGE;
SFRPAGE=0x02;
if(CP1RIF){
CP1RIF=0;
}
if(CP1FIF){
CP1FIF=0;
}
SFRPAGE=temppage;
}
void CP2_ISR() interrupt 12{//比较器2中断
temppage=SFRPAGE;
SFRPAGE=0x03;
if(CP2RIF){
CP2RIF=0;
}
if(CP0FIF){
CP2FIF=0;
}
SFRPAGE=temppage;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -