| 本帖最后由 oxygenzz 于 2019-3-29 16:58 编辑 
 
 CLC 可配置逻辑单元,在很多PIC单片机中有配备。 例如PIC16F18446中,就有四个CLC模块(CLC1/2/3/4)。它的作用是对内部外部信号提供逻辑操作。 
 工作原理 我们仍然通过比较MCC软件配置界面与数据手册上的功能模块图,来理解模块的工作原理。 
 两张图如下,红色的文字给出功能描述和对应的配置,在两张图上是一一对应的。根据数字,可以容易的将它们对应起来。 
 
 
 输入源最多有64种,每个CLC模块最多能选4种,数据源可重复选择。 
 选择出来的数据源在四输入门控逻辑中进行与/与非/或/或非(可选择)操作,在MCC界面上,这一过程,表达为“输入逻辑选择和门控7”中的4个四输入逻辑门。经门控,出来的结果是lcxg1/2/3/4 四路信号。 
 
 这四路信号进入逻辑功能方框。8种逻辑功能,在MCC界面上,由下拉框选择。有组合逻辑,也有时序逻辑。 
 
 逻辑功能输出的结果,由使能配置EN来决定其输出是否可以进入后面的电路,进而发挥作用。而且输出的结果的可以正向或负向,由输出极性控制。 
 CLC输出可产生中断,分别或者同时识别上升沿/下降沿。 模块图中蓝色文字描述的部分,展示了CLC信号除了产生中断之外的其他输出路径: 1.     锁存在D触发器中,供软件寄存器查询当前CLC输出状态(读CLCDATA) 2.     CLCx_out 输出到其他外设,做下一级外设的触发信号,或输入信号,以实现CIP操作 
 3.     经PPS选控后,经IO口输出,TRIS要将该IO口设置为输出状态 
 
 
 代码解读 
 按照上图配置,MCC生成代码 , clc1.c 文件在工程的“MCC Generated Files”目录下。 
 代码很简洁,只有三个函数: void CLC1_Initialize(void);//初始化 void CLC1_ISR(void);//中断处理程序 bool CLC1_OutputStatusGet(void);//CLC 输出状态查询 
 初始化代码,已经自动加入到系统初始化函数SYSTEM_Initialize()中,并且在主函数中进行了调用。 CLCx_ISR() 当中断触发时执行。CLC1_OutputStatusGet() 由用户调用,查询当前输出状态。
 
 
 void CLC1_Initialize(void) {     // Set the CLC1 to theoptions selected in the User Interface     // LC1G1POL inverted;LC1G2POL not_inverted; LC1G3POL inverted; LC1G4POL not_inverted; LC1POLinverted;      CLC1POL = 0x85;     // LC1D1S CLCIN0(CLCIN0PPS);      CLC1SEL0 = 0x00;     // LC1D2S HFINTOSC;      CLC1SEL1 = 0x05;     // LC1D3S IOCIF setsignal;      CLC1SEL2 = 0x1E;     // LC1D4S CLC3_OUT;      CLC1SEL3 = 0x22;     // LC1G1D3N disabled;LC1G1D2N disabled; LC1G1D4N disabled; LC1G1D1T enabled; LC1G1D3T disabled;LC1G1D2T disabled; LC1G1D4T enabled; LC1G1D1N disabled;      CLC1GLS0 = 0x82;     // LC1G2D2N disabled;LC1G2D1N disabled; LC1G2D4N disabled; LC1G2D3N disabled; LC1G2D2T enabled;LC1G2D1T disabled; LC1G2D4T disabled; LC1G2D3T disabled;      CLC1GLS1 = 0x08;     // LC1G3D1N disabled;LC1G3D2N disabled; LC1G3D3N disabled; LC1G3D4N disabled; LC1G3D1T disabled;LC1G3D2T enabled; LC1G3D3T enabled; LC1G3D4T disabled;      CLC1GLS2 = 0x28;     // LC1G4D1N disabled;LC1G4D2N disabled; LC1G4D3N disabled; LC1G4D4N disabled; LC1G4D1T disabled;LC1G4D2T disabled; LC1G4D3T enabled; LC1G4D4T enabled;      CLC1GLS3 = 0xA0;     // LC1EN enabled; INTNenabled; INTP enabled; MODE 2-input D flip-flop with R;      CLC1CON = 0x9D;     // Clear the CLC interruptflag     PIR5bits.CLC1IF = 0;     // Enabling CLC1interrupt.     PIE5bits.CLC1IE = 1; } void CLC1_ISR(void) {     // Clear the CLC interruptflag     PIR5bits.CLC1IF = 0; } bool CLC1_OutputStatusGet(void) {    return(CLC1CONbits.LC1OUT); 
 } 
 
 
 |