📄 main.c
字号:
/*====================File Name:main.asm================
;;Program Name: TouchSwitch.Prj
;;File Name: main.c
;;MCU Body: HT45R35
;;Programer: guoxj
;;Email: guoxj@holteksz.com.cn
;;HT_IDE Version: V7.0
;;-----------------------------------------------
;;Mask Option:
;;-----------------------------------------------
;;SysVolt: 5V
;;SysFreq: 4M
;;Package: 28SSOP-A
;;Wake-up PA0-7: None-Wake-up
;;Pull-high pA0-7: None-Pull-high
;;PA0- Function Option:RC
;;PA4 Function Option:RC
;;PA5 Function Option:RC
;;PA6 Function Option:RC
;;PA7 Function Option:RC
;;Pull-high PB0-7: None-Pull-high
;;WDT clock source: WDTOSC
;;WDT: Disable
;;CLR WDT: 1 instruction
;;LVR: Disable
;;LVR voltage: 3.0V
;;OSC mode: XTAL mode
;;INTO trigger edge:disable
;;INT1 trigger edge:disable
;;======================================================*/
#include <ht45r35.h>
#define sensitive 40
#define sensitive_high 200
#pragma rambank0
bit key_flag;
bit scan_flag;
bit update_flag;
#pragma norambank
unsigned char rf_cx;
unsigned char cnt1;
unsigned char cnt2;
unsigned char cnt3;
unsigned char cnt4;
unsigned char sure_key;
unsigned char current_key;
unsigned char last_key;
unsigned char sure_cnt;
unsigned char total_key;
signed long data_temp;
unsigned long base_temp;
unsigned long interrupt;
unsigned char press_on[12];
unsigned long base[12];
unsigned long base_current[12];
const unsigned char table[14]={0x0e,0x16,0x26,0x46,0x0d,0x15,0x43,0x23,0x13,0x0b,0x45,0x25,0x78,0x07}; //...,all on,all off
#pragma vector isr_c @ 0x0c //timer interrupt
/*-----------------------------------------------------
delay
-----------------------------------------------------*/
void delay_ms(unsigned long tmp)
{
unsigned long i;
for(i=0;i<tmp;i++)
_delay(1000); //1ms
}
/*-----------------------------------------------------
wait for overflow
-----------------------------------------------------*/
void wait_overflow(void)
{
unsigned long count;
count=65535-1000;
_rcoccr=0;
_rcocr=3;
_rcocf=0;
_tmrbl=count;
_tmrbh=count>>8;
_tmral=0;
_tmrah=0;
_rcoccr=0x10;
while(_rcocf==0)
_nop();
_rcocf=0;
}
/*-----------------------------------------------------
first timer setup
-----------------------------------------------------*/
void first_time_setup(void)
{
for(rf_cx=0;rf_cx<12;rf_cx++)
{
switch(rf_cx)
{
case 0:
_ascr0=0xfe;
_ascr1=0xff;
break;
case 1:
_ascr0=0xfd;
_ascr1=0xff;
break;
case 2:
_ascr0=0xfb;
_ascr1=0xff;
break;
case 3:
_ascr0=0xf7;
_ascr1=0xff;
break;
case 4:
_ascr0=0xef;
_ascr1=0xff;
break;
case 5:
_ascr0=0xdf;
_ascr1=0xff;
break;
case 6:
_ascr0=0xbf;
_ascr1=0xff;
break;
case 7:
_ascr0=0x7f;
_ascr1=0xff;
break;
case 8:
_ascr0=0xff;
_ascr1=0xfe;
break;
case 9:
_ascr0=0xff;
_ascr1=0xfd;
break;
case 10:
_ascr0=0xff;
_ascr1=0xfb;
break;
case 11:
_ascr0=0xff;
_ascr1=0xf7;
break;
}
wait_overflow();
base[rf_cx]=_tmrah;
base[rf_cx]<<=8;
base[rf_cx]+=_tmral;
}
}
/*-----------------------------------------------------
initial
-----------------------------------------------------*/
void initial(void)
{
unsigned char i;
delay_ms(300);
key_flag=0;
scan_flag=0;
update_flag=0;
interrupt=0;
rf_cx=0;
sure_key=0;
total_key=0;
current_key=0;
last_key=0;
for(i=0;i<12;i++)
{
_mp0=press_on[i];
_iar0=0;
}
_pbc=0;
_pb=0;
first_time_setup();
_pb=0x78; //all on
delay_ms(1000);
_pb=0x07; //all off
_emi=1;
_eti=1;
_tmr=131; //1ms
_tmrc=0x85;
_ton=1;
rf_cx=0;
}
/*-----------------------------------------------------
update base
-----------------------------------------------------*/
void update_base(void)
{
for(rf_cx=0;rf_cx<12;rf_cx++)
{
switch(rf_cx)
{
case 0:
_ascr0=0xfe;
_ascr1=0xff;
break;
case 1:
_ascr0=0xfd;
_ascr1=0xff;
break;
case 2:
_ascr0=0xfb;
_ascr1=0xff;
break;
case 3:
_ascr0=0xf7;
_ascr1=0xff;
break;
case 4:
_ascr0=0xef;
_ascr1=0xff;
break;
case 5:
_ascr0=0xdf;
_ascr1=0xff;
break;
case 6:
_ascr0=0xbf;
_ascr1=0xff;
break;
case 7:
_ascr0=0x7f;
_ascr1=0xff;
break;
case 8:
_ascr0=0xff;
_ascr1=0xfe;
break;
case 9:
_ascr0=0xff;
_ascr1=0xfd;
break;
case 10:
_ascr0=0xff;
_ascr1=0xfb;
break;
case 11:
_ascr0=0xff;
_ascr1=0xf7;
break;
}
wait_overflow();
base_current[rf_cx]=_tmrah;
base_current[rf_cx]<<=8;
base_current[rf_cx]+=_tmral;
}
for(rf_cx=0;rf_cx<12;rf_cx++)
{
data_temp=base_current[rf_cx]-base[rf_cx];
if(data_temp<sensitive)
base[rf_cx]=base_current[rf_cx];
}
update_flag=0;
rf_cx=0;
}
/*-----------------------------------------------------
scan all key
-----------------------------------------------------*/
void scan_key(void)
{
switch(rf_cx)
{
case 0:
_ascr0=0xfe;
_ascr1=0xff;
break;
case 1:
_ascr0=0xfd;
_ascr1=0xff;
break;
case 2:
_ascr0=0xfb;
_ascr1=0xff;
break;
case 3:
_ascr0=0xf7;
_ascr1=0xff;
break;
case 4:
_ascr0=0xef;
_ascr1=0xff;
break;
case 5:
_ascr0=0xdf;
_ascr1=0xff;
break;
case 6:
_ascr0=0xbf;
_ascr1=0xff;
break;
case 7:
_ascr0=0x7f;
_ascr1=0xff;
break;
case 8:
_ascr0=0xff;
_ascr1=0xfe;
break;
case 9:
_ascr0=0xff;
_ascr1=0xfd;
break;
case 10:
_ascr0=0xff;
_ascr1=0xfb;
break;
case 11:
_ascr0=0xff;
_ascr1=0xf7;
break;
default:
break;
}
base_temp=base[rf_cx];
wait_overflow();
data_temp=_tmrah;
data_temp<<=8;
data_temp+=_tmral;
key_flag=0;
data_temp=data_temp-base_temp;
if(data_temp>sensitive && data_temp<sensitive_high)
key_flag=1;
if(key_flag==1)
{
current_key=rf_cx;
total_key++;
}
else
press_on[rf_cx]=0;
rf_cx++;
if(rf_cx==12)
{
rf_cx=0;
scan_flag=1;
}
}
/*-----------------------------------------------------
key check
-----------------------------------------------------*/
void key_check(void)
{
if(total_key==1)
{
if(current_key==last_key)
{
sure_cnt++;
if(sure_cnt>=3)
{
sure_key=current_key;
_pb=table[sure_key];
}
}
}
else
_pb=0x07; //all off
last_key=current_key;
total_key=0;
rf_cx=0;
scan_flag=0;
}
/*-----------------------------------------------------
1ms interrupt
-----------------------------------------------------*/
void isr_c(void)
{
interrupt++;
if(interrupt==2000)
{
update_flag=1;
interrupt=0;
}
}
/*-----------------------------------------------------
main
-----------------------------------------------------*/
void main(void)
{
initial();
while(1)
{
if(scan_flag==0)
scan_key();
else
key_check();
if(update_flag==1)
update_base();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -