/*********************************************************************/
/*文件说明:段式液晶LCD显示 电容触摸屏*/
/*硬件配置: MCU:PIC16F1933, 使用片内4M振荡器工作频率*/
/*软件配置:开发环境MPLAB X IDE v3.20 编译器HI-TECH PICC (V9.83) */
/*版本: v1.0*/
/*作者:杨秀峰 淘宝ID:paifeng253625 QQ:378293151 */
/*店铺:https://shop57636710.taobao.com/ */
/*创建日期: 2016.03.11*/
/*使用说明:段式液晶LCD显示 电容触摸屏 触摸按键 K4 K5*/
/*修改记录:*/
/*版权所有:本程序代码仅用于学习,请勿用于商业目的,请联系作者。*/
/********************************************************************/
#include "pic.h"
#include "LCD.h"
__CONFIG(0x3FE4);
__CONFIG(0xFFF);
//配置字:FCMEN = 1 故障保护时钟监视使能; IESO = 1 内外时钟切换使能
//CLKOUTEN = 1 禁止LCKOUT功能;BOREN = 11 欠压使能
//CPD = 1 禁止数据存储器代码保护; CP = 1禁止程序存储器代码保护
//MCLRE = 1 MCLR;PWRTE = 1 上电延时使能
//WDTE = 00禁止看门狗 FOSC = 100 INTOSC振荡器 引脚IO功能默认500KHz
//--------------------------------------------------------------
//LVP = 0 MCLR高压编程 DEBUG = 0使能在线调试
//BORV = 1 欠压复位1.9v STVREN = 1堆栈上溢下溢复位使能
//PLLEN = 1使能4xPLL VCAPEN =11VCAP引脚上无电容
//WRT = 11闪存写保护关闭
unsigned char KEY0_Flag;
unsigned char KEY1_Flag;
unsigned char KEY2_Flag;
unsigned char KEY3_Flag;
void System_Init(void)//系统初始化
{
OSCCON = 0b01101000; //内部4MHz
OSCTUNE= 0b00000000; //出厂校准
ADCON1 = 0b10110000; //内部Frc Vref = VDD
ADCON0 = 0b00000001; //ADON = 1 As AN0
TRISA = 0b11111111; //PORTA 输入
ANSELA = 0b00000001; //RA0传感器输入
TRISB = 0b11111111; //RB0-RB3触摸按键
ANSELB = 0b00001111; //4个触摸按键
WPUB = 0b00000000; //无上拉
IOCBP = 0b00000000; //关电平变化中断
IOCBN = 0b00000000;
TRISC = 0b10011000; //串口 I2C
TRISE = 0b00000111; //PORTE输出
WPUE = 0b00000000; //无上拉
LATA = 0x00;
LATB = 0x00;
LATC = 0x00;
LATE = 0x00;
}
//-------------------------------------------------------------------------------
// 触摸按键寄存器初始化
// 使用TMR0定时2.5mS,查寻TMR1 计数值
//-------------------------------------------------------------------------------
void Cap_Init(void)
{
CPSCON0 = 0b10001100; //打开电容模块,高频率振荡
CPSCON1 = 0b0000000; //设置扫描通道 0-3
OPTION_REG = 0b11010011; //TMR0 1:16分
TMR0IF = 0;
TMR0IE = 1;
T1CON = 0b11000101; //计数,时钟来源电容模块 1:1分频
T1GCON = 0b00000000; //与门控位无关
TMR1GIF = 0;
TMR1GIE = 0;
}
//-------------------------------------------------------------------------------
// 切换触摸按键通道
//-------------------------------------------------------------------------------
unsigned char Index = 0; // 触摸键通道计数
void SetNextSensor(void)
{
if(Index == 3) Index = 0; //KEY1 --- KEY4
else Index ++;
CPSCON1 = Index;
}
//-------------------------------------------------------------------------------
// 重新启动 TMR1 计数
//-------------------------------------------------------------------------------
void RestartTimers(void)
{
TMR1ON = 0; //ReStart Timer1
TMR1H = 0;
TMR1L = 0;
TMR1ON = 1;
}
unsigned char AvgIndex = 0; //更新频率计数
unsigned int Cap_Value = 0; //当前按键频率值
const unsigned int trip[4]= {160,160,160,160}; //频率差值
unsigned int Cap_Avg[4] ={600,600,600,600}; //频率平均值
unsigned int KEY_Avg[4] ={0,0,0,0}; //当前频率值区
//-------------------------------------------------------------------------------
// 触摸按键频率服务程序
//-------------------------------------------------------------------------------
void Cap_ISR(void)
{
KEY_Avg[Index] = Cap_Value;
if (Cap_Value < (Cap_Avg[Index] - trip[Index])) //有键按下,不更新频率平均值
{
switch(Index)
{
case 0: KEY0_Flag = 1;break; //CSM 0 KEY1
case 1: KEY1_Flag = 1;break; //CSM 1 KEY2
case 2: KEY2_Flag = 1;break; //CSM 2 KEY3
case 3: KEY3_Flag = 1;break; //CSM 3 KEY4
default : break;
}
}
else if (Cap_Value > (Cap_Avg[Index] - trip[Index] +64)) //无键按下,慢更新频率平均值
{
switch(Index)
{
case 0: KEY0_Flag = 0;break; //CSM 0 KEY1
case 1: KEY1_Flag = 0;break; //CSM 1 KEY2
case 2: KEY2_Flag = 0;break; //CSM 2 KEY3
case 3: KEY3_Flag = 0;break; //CSM 3 KEY4
default : break;
}
if (AvgIndex < 2) AvgIndex ++; //更新频率
else AvgIndex = 0;
if (AvgIndex == 2)
{
if(Cap_Value >= Cap_Avg[Index])
Cap_Avg[Index] = Cap_Avg[Index]+(Cap_Value - Cap_Avg[Index])/16;
else
Cap_Avg[Index] = Cap_Avg[Index]-(Cap_Avg[Index] - Cap_Value)/16;
}
}
}
//-------------------------------------------------------------------------------
// 定时器中断,定时处理程序
//-------------------------------------------------------------------------------
static void interrupt SystemISR(void) //系统中断
{
if(TMR0IE && TMR0IF) //4MHz 2.8ms
{
TMR0IF = 0;
TMR0 = 0x50;
TMR1ON = 0; //停止触摸按键振荡频率计数
Cap_Value = (unsigned int)(TMR1H <<8) + TMR1L; //读取振荡频率
// Cap_Avg[Index] = (unsigned int)(TMR1H <<8) + TMR1L;
Cap_ISR();
SetNextSensor(); //设置通道
RestartTimers(); //重启TMR1
CLRWDT();
}
if (TMR0IE && TMR0IF)
{
TMR0IF = 0;
RestartTimers();
}
}
void Delay_1ms(unsigned int t)//t = 1000大概1s
{
unsigned int i,j;
for(i = 0;i < t;i ++)
for(j = 0;j < 110;j ++);
}
int main(void)
{
System_Init(); //系统初始化
LCD_Init();
Cap_Init(); //CSM 初始化
PEIE = 1; //外设中断允许
GIE = 1; //总中断允许
Display(0);
while (1)
{
if( KEY1_Flag == 1 )
Display(5);
if( KEY2_Flag == 1 )
Display(4);
}
}
/********(C) COPYRIGHT 2015 TaobaoID:paifeng253625 *****END OF FILE********/