?? 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 + -