📄 xbjikeyboadone.c
字号:
#include "interface.h"
#if KEYBOARD_EN //键盘操作的条件编译
////////////////////////////////////////////////////////////////
//键值全局变量定义
unsigned char c_key_value;//当前键值
unsigned char c_key_valueP1;//当前键值
//###########################################################################################
//键盘驱动操作
/////////////////////////////////////////////////////////////////
//功能:获取当前键值
//注:
unsigned char get_key(void)
{
unsigned char key;
//
key=c_key_value;
c_key_value=NOKEY;//
return(key);
}
unsigned char get_keyP1(void)
{
unsigned char key;
//
key=c_key_valueP1;
c_key_valueP1=NOKEY;//
return(key);
}
/////////////////////////////////////////////////////////////////
//功能:初始化键盘
//
void keyboard_ins(void)
{
//
out_port_bit(KH1,0);//SET 0
out_port_bit(KH2,0);//SET 0
out_port_bit(KH3,0);//SET 0
in_port_bit(KV1);
in_port_bit(KV2);
in_port_bit(KV3);
//
op_p1p2_I(KV1,1); //开中断
op_p1p2_I(KV2,1); //开中断
op_p1p2_I(KV3,1); //开中断
P1DIR&=0xfd;
P1IE|=0x02;//开中断
P1IES&=0xfd;//上升沿
P1IFG&=0xfd;
c_key_valueP1=NOKEY;//
c_key_value=NOKEY;//
//开总中断允许 GIE set 1
_BIS_SR(GIE);//
}
/////////////////////////////////////////////////////////////////
//功能:用于主程序中,当没有键按下时,开键盘中断
//
void open_keyboard(void)
{
//
//unsigned char i;
//i=P1IN;
//i=P1IN;
//P2
if((P2IN&0x60)==0x60){
//没有键按下,开键盘中断
P2IFG&=0x9f;
P2IE|=0x60;
}
}
/////////////////////////////////////////////////////////////////
//功能:用于主程序中,当没有键按下时,开键盘中断
//
void open_keyboardP1(void)
{
if((P1IN&0x02)==0x00){
//没有键按下,开键盘中断
P1DIR&=0xfd;
P1IES&=0xfd;//上升沿中断触发
P1IFG&=0xfd;//中断标志
P1IE|=0x02;//中断功能
}
}
/////////////////////////////////////////////////////////////////
//功能:打开或关闭P1、P2口中指定位的中断功能
//入口参数:port端口----如P32==0x32;输出值----0x01为置位 0x00为清零.
// value:为1打开,为0关闭
//注:
void op_p1p2_I(unsigned char port,unsigned char value)
{
unsigned char i,j;
i=port&0x0f;
i=0x01<<i;
j=i;
i=~i;
if(value){
// ==0x01 开中断
switch(port&0xf0){
case 0x10://P1
P1IES|=j;
P1IFG&=i;
P1IE|=j;
break;
case 0x20://P2
P2IES|=j;
P2IFG&=i;
P2IE|=j;
break;
}
}
else{
// ==0x00 关中断
switch(port&0xf0){
case 0x10://P1
P1IE&=i;
break;
case 0x20://P2
P2IE&=i;
break;
}
}
}
/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序 ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中
//interrupt[PORT2_VECTOR] void Port2_interrupt(void)
interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
P1IE&=0xfd;
P1IFG&=0xfd;//清标志位
clr_WDT();//清WDT
c_key_valueP1=scan_boardP1();
if((P1IN&0x02)==0x00){
//没有键按下,开键盘中断
P1DIR&=0xfd;
P1IES&=0xfd;
P1IFG&=0xfd;
P1IE|=0x02;
}
c_key_value=scan_board();
//清标志位
op_p1p2_I(KV1,1); //开中断
op_p1p2_I(KV2,1); //开中断
op_p1p2_I(KV3,1); //开中断
}
/////////////////////////////////////////////////////////////////
//功能: 用于键盘操作中的取键值
//注:在有键按下时调用该函数取值
//注:CEN20051231时修改,由于将MCLK=DCOCLK,所以延时由20mS改为4mS。已作测试及高低温实验。
unsigned char scan_boardP1(void)
{
unsigned char tk;
delay_1us(4000);//4mS cen20051230
//开始取键值
tk=P1IN;
tk=P1IN;
if((tk&0x02)==0x02){
tk=0x01;
}
else{
tk=0;
}
return(tk);
}
/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序 ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中
//#pragma vector=PORT1_VECTOR
//__interrupt void Port1_interrupt(void)
/*interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
c_key_value=scan_board();
//清标志位
op_p1p2_I(KV1,1); //开中断
op_p1p2_I(KV2,1); //开中断
op_p1p2_I(KV3,1); //开中断
}*/
/////////////////////////////////////////////////////////////////
//功能:P1口中断服务程序 ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中
/*interrupt[PORT1_VECTOR] void Port1_interrupt(void)
{
c_key_value=scan_board1();
//清标志位
P1DIR&=0xfd;
P1IES&=0xfd;
P1IFG&=0xfd;
P1IE|=0x02;
}
*/
/////////////////////////////////////////////////////////////////
//功能:P2口中断服务程序 ---- 用于键盘操作中的取键值
//所得值存放在c_key_value中
//#pragma vector=PORT2_VECTOR
//__interrupt void Port2_interrupt(void)
interrupt[PORT2_VECTOR] void Port2_interrupt(void)
{
P2IE&=0x1f;
P2IFG&=0x1f;//清标志位
c_key_value=scan_board();
if((P2IN&0x60)==0x60){
//没有键按下,开键盘中断
P2IFG&=0x9f;
P2IE|=0x60;
}
}
/////////////////////////////////////////////////////////////////
//功能: 用于键盘操作中的取键值
//注:在有键按下时调用该函数取值
//注:CEN20051231时修改,由于将MCLK=DCOCLK,所以延时由20mS改为4mS。已作测试及高低温实验。
unsigned char scan_board(void)
{
unsigned char tk;
//delay_1us(20000);//延时20mS
delay_1us(4000);//4mS cen20051230
//开始取键值
out_port_bit(KH1,0);//SET 0
out_port_bit(KH2,1);//SET 1
out_port_bit(KH3,1);//SET 1
tk=in_port_bit(KV3);
tk=tk<<1;
tk=tk+in_port_bit(KV2);
tk=tk<<1;
tk=tk+in_port_bit(KV1);
tk=~tk;
tk=tk&0x07;
if(tk>0){
tk=tk+0x10;//KH1
}
else{
out_port_bit(KH1,1);//SET 1
out_port_bit(KH2,0);//SET 0
out_port_bit(KH3,1);//SET 1
tk=in_port_bit(KV3);
tk=tk<<1;
tk=tk+in_port_bit(KV2);
tk=tk<<1;
tk=tk+in_port_bit(KV1);
tk=~tk;
tk=tk&0x07;
if(tk>0){
tk=tk+0x20;//KH2
}
else{
out_port_bit(KH1,1);//SET 1
out_port_bit(KH2,1);//SET 1
out_port_bit(KH3,0);//SET 0
tk=in_port_bit(KV3);
tk=tk<<1;
tk=tk+in_port_bit(KV2);
tk=tk<<1;
tk=tk+in_port_bit(KV1);
tk=~tk;
tk=tk&0x07;
if(tk>0){
tk=tk+0x30;//KH3
}
}
}
//KV 值取值
if((tk&0x0f)==0x04){
tk=tk&0xf0;
tk=tk+0x03;
}
out_port_bit(KH1,0);//SET 0
out_port_bit(KH2,0);//SET 0
out_port_bit(KH3,0);//SET 0
return(tk);
}
#endif //键盘操作的条件编译
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -