17.4.3 新版比较器的使用(中断方式) C语言代码
//测试工作频率为11.0592MHz #include "stc8h.h" #include "intrins.h" void CMP_Isr() interrupt 21 { CMPCR1 &= ~0x40; //清中断标志 if (CMPCR1 &0x01) { P10 = !P10; //上升沿中断测试端口 } else { P11 = !P11; //下降沿中断测试端口 } } void main() { P_SW2 |= 0x80; //使能访问XFR P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; CMPEXCFG = 0x00; // CMPEXCFG |= 0x40; //比较器DC迟滞输入选择 //0:0mV;0x40:10mV; 0x80:20mV; 0xc0:30mV CMPEXCFG &= ~0x03; //P3.7为CMP+输入脚 // CMPEXCFG |= 0x01; //P5.0为CMP+输入脚 // CMPEXCFG |= 0x02; //P5.1为CMP+输入脚 // CMPEXCFG |= 0x03; //ADC输入脚为CMP+输入脚 CMPEXCFG &= ~0x04; //P3.6为CMP-输入脚 // CMPEXCFG |= 0x04; //内部1.19V参考电压为CMP-输入脚 CMPCR2 = 0x00; CMPCR2 &= ~0x80; //比较器正向输出 // CMPCR2 |= 0x80; //比较器反向输出 CMPCR2 &= ~0x40; //使能0.1us滤波 // CMPCR2 |= 0x40; //禁止0.1us滤波 // CMPCR2 &= ~0x3f; //比较器结果直接输出 CMPCR2 |= 0x10; //比较器结果经过16个去抖时钟后输出 CMPCR1 = 0x00; CMPCR1 |= 0x30; //使能比较器边沿中断 // CMPCR1 &= ~0x20; //禁止比较器上升沿中断 // CMPCR1 |= 0x20; //使能比较器上升沿中断 // CMPCR1 &= ~0x10; //禁止比较器下降沿中断 // CMPCR1 |= 0x10; //使能比较器下降沿中断 // CMPCR1 &= ~0x02; //禁止比较器输出 CMPCR1 |= 0x02; //使能比较器输出 CMPCR1 |= 0x80; //使能比较器模块 EA = 1; while (1); }
汇编代码
;测试工作频率为11.0592MHz P_SW2 DATA 0BAH CMPCR1 DATA 0E6H CMPCR2 DATA 0E7H P1M1 DATA 091H P1M0 DATA 092H P0M1 DATA 093H P0M0 DATA 094H P2M1 DATA 095H P2M0 DATA 096H P3M1 DATA 0B1H P3M0 DATA 0B2H P4M1 DATA 0B3H P4M0 DATA 0B4H P5M1 DATA 0C9H P5M0 DATA 0CAH CMPEXCFG XDATA 0FEAEH ORG 0000H LJMP MAIN ORG 00ABH LJMP CMPISR ORG 0100H CMPISR: PUSH ACC ANL CMPCR1,#NOT 40H ;清中断标志 MOV A,CMPCR1 JB ACC.0,RSING FALLING: CPL P1.0 ;下降沿中断测试端口 POP ACC RETI RSING: CPL P1.1 ;上升沿中断测试端口 POP ACC RETI MAIN: MOV SP, #5FH ORL P_SW2,#80H ;使能访问XFR MOV P0M0, #00H MOV P0M1, #00H MOV P1M0, #00H MOV P1M1, #00H MOV P2M0, #00H MOV P2M1, #00H MOV P3M0, #00H MOV P3M1, #00H MOV P4M0, #00H MOV P4M1, #00H MOV P5M0, #00H MOV P5M1, #00H MOV DPTR,# CMPEXCFG CLR A ANL A,#NOT 03H ; P3.7为CMP+输入脚 ; ORL A,#01H ; P5.0为CMP+输入脚 ; ORL A,#02H ; P5.1为CMP+输入脚 ; ORL A,#03H ;ADC输入脚为CMP+输入脚 ANL A,#NOT 04H ; P3.6为CMP-输入脚 ; ORL A,# 04H ;内部1.19V参考信号源为CMP-输入脚 MOVX @DPTR,A MOV CMPCR2,#00H ANL CMPCR2,#NOT 80H ;比较器正向输出 ; ORL CMPCR2,#80H ;比较器反向输出 ANL CMPCR2,#NOT 40H ;使能0.1us滤波 ; ORL CMPCR2,#40H ;禁止0.1us滤波 ; ANL CMPCR2,#NOT 3FH ;比较器结果直接输出 ORL CMPCR2,#10H ;比较器结果经过16个去抖时钟后输出 MOV CMPCR1,#00H ORL CMPCR1,#30H ;使能比较器边沿中断 ; ANL CMPCR1,#NOT 20H ;禁止比较器上升沿中断 ; ORL CMPCR1,#20H ;使能比较器上升沿中断 ; ANL CMPCR1,#NOT 10H ;禁止比较器下降沿中断 ; ORL CMPCR1,#10H ;使能比较器下降沿中断 ; ANL CMPCR1,#NOT 02H ;禁止比较器输出 ORL CMPCR1,#02H ;使能比较器输出 ORL CMPCR1,#80H ;使能比较器模块 SETB EA JMP $ END
|