二、按键小技巧
1、在中断里延时是不好的操作
2、一般情况下按键需要延时10ms进行消抖,若此按键是外部中断,可以使用以下方法避免在中断中延时
首先定义一个全局变量,作为中断标志位。在中断处理函数中改写此标志位;在按键扫描函数中检测标志位,若被置1则延时10ms,接着检测按键所对应IO口的状态,以判断按键是否被按下,并达到消抖的效果。
代码:
uint8_t exti_flag=0;
void EXTI0_1_IRQHandler(void)
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0);
exti_flag=1;
}
void Key_Inter(void)
{
if(exti_flag==1)
{
LL_mDelay(10);
exti_flag=0;
if(LL_GPIO_IsInputPinSet(KA0_GPIO_Port,KA0_Pin))
{
...
}
}
}
int main(void)
{
while (1)
{
Key_Inter();
}
}
三、ch452驱动
.c
#include "ch452.h"
void CH452_Write(unsigned short cmd)
{
unsigned char i;
DISABLE_KEY_INTERRUPT;
CH452_LOAD_CLR;
CH452_LOAD_D_OUT;
CH452_DOUT_D_IN;
CH452_DIN_D_OUT;
CH452_DCLK_D_OUT;
for(i=0;i!=12;i++)
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;}
CH452_DCLK_CLR;
cmd>>=1;
CH452_DCLK_SET;
}
CH452_LOAD_SET;
ENABLE_KEY_INTERRUPT;
}
unsigned char CH452_Read( void )
{
unsigned char i;
unsigned char cmd,keycode;
DISABLE_KEY_INTERRUPT;
cmd=0x07;
CH452_LOAD_CLR;
for(i=0;i!=4;i++)
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;}
CH452_DCLK_CLR;
cmd>>=1;
CH452_DCLK_SET;
}
CH452_LOAD_SET;
keycode=0;
for(i=0;i!=7;i++)
{
keycode<<=1;
if (CH452_DOUT) keycode++;
CH452_DCLK_CLR;
CH452_DCLK_SET;
}
CLEAR_KEY_INTER_FLAG;
ENABLE_KEY_INTERRUPT;
return(keycode);
}
void CH452_Init()
{
CH452_Write(0x0201);
CH452_Write(0x0403);
CH452_Write(0x0580);
}
.h
#ifndef _CH452_H_
#define _CH452_H_
#define CH452_NOP 0x0000
#define CH452_RESET 0x0201
#define CH452_LEVEL 0x0100
#define CH452_CLR_BIT 0x0180
#define CH452_SET_BIT 0x01C0
#define CH452_SLEEP 0x0202
#define CH452_LEFTMOV 0x0300
#define CH452_LEFTCYC 0x0301
#define CH452_RIGHTMOV 0x0302
#define CH452_RIGHTCYC 0x0303
#define CH452_SELF_BCD 0x0380
#define CH452_SYSOFF 0x0400
#define CH452_SYSON1 0x0401
#define CH452_SYSON2 0x0403
#define CH452_SYSON2W 0x0423
#define CH452_NO_BCD 0x0500
#define CH452_BCD 0x0580
#define CH452_TWINKLE 0x0600
#define CH452_GET_KEY 0x0700
#define CH452_DIG0 0x0800
#define CH452_DIG1 0x0900
#define CH452_DIG2 0x0a00
#define CH452_DIG3 0x0b00
#define CH452_DIG4 0x0c00
#define CH452_DIG5 0x0d00
#define CH452_DIG6 0x0e00
#define CH452_DIG7 0x0f00
#define USE_KEY 1
#define CH452_BCD_SPACE 0x10
#define CH452_BCD_PLUS 0x11
#define CH452_BCD_MINUS 0x12
#define CH452_BCD_EQU 0x13
#define CH452_BCD_LEFT 0x14
#define CH452_BCD_RIGHT 0x15
#define CH452_BCD_UNDER 0x16
#define CH452_BCD_CH_H 0x17
#define CH452_BCD_CH_L 0x18
#define CH452_BCD_CH_P 0x19
#define CH452_BCD_DOT 0x1A
#define CH452_BCD_SELF 0x1E
#define CH452_BCD_TEST 0x88
#define CH452_BCD_DOT_X 0x80
#define CH452_KEY_MIN 0x40
#define CH452_KEY_MAX 0x7F
sbit CH452_DCLK=P4^4;
sbit CH452_DIN=P4^3;
sbit CH452_LOAD=P4^2;
sbit CH452_DOUT=P3^2;
#define CH452_DCLK_SET {CH452_DCLK=1;}
#define CH452_DCLK_CLR {CH452_DCLK=0;}
#define CH452_DCLK_D_OUT {}
#define CH452_DIN_SET {CH452_DIN=1;}
#define CH452_DIN_CLR {CH452_DIN=0;}
#define CH452_DIN_D_OUT {}
#define CH452_LOAD_SET {CH452_LOAD=1;}
#define CH452_LOAD_CLR {CH452_LOAD=0;}
#define CH452_LOAD_D_OUT {}
#define CH452_DOUT_D_IN {CH452_DOUT=1;}
#define DISABLE_KEY_INTERRUPT {EX0=0;}
#define ENABLE_KEY_INTERRUPT {EX0=1;}
#define CLEAR_KEY_INTER_FLAG {IE0=0;}
unsigned char CH452_Read(void);
void CH452_Write(unsigned short cmd);
void CH452_Init();
#endif