📄 key_read.c
字号:
#define keyboard_base (*(volatile unsigned char *)0x06000000)
//#define UCHAR unsigned char
//volatitle UCHAR * KEYBOARD_base=(UCHAR *)0x06000000;
#define KEY_VALUE_MASK 0x0F
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"
//#include "..\inc\tp.h"
void keyboardint();
/********************************************************
*函数名称: init_keyboard
*函数功能: 键盘控制初始化部分
*参数: 无
*返回: 无
********************************************************/
void init_keyboard()
{
// rINTMOD=0x0;
// rINTCON=0x5;
rINTMSK=~(BIT_GLOBAL|BIT_EINT0);
pISR_EINT0=(int)keyboardint;
/*PORTG*/
// rPCONG=0xffff;
// rEXTINT=rEXTINT|0x20;
// rI_ISPC=BIT_EINT0;
// rEXTINPND=0xf;
}
/***********************************************************
*函数名称: keyboardint
*函数功能: 键盘中断服务程序
*参数: 无
*返回: 无
************************************************************/
void keyboardint(void)
//void keyboard_ISR(void)
{
char x,y,xrecord,yrecord,temp;
rI_ISPC=BIT_EINT0; //clear pending_bit
Delay(400); //delay 40ms
if((rPDATF&0x1E0)==0x1E0)
{
return 0; //no keyboard press,return
}
else
{
x=1;
y=1;
xrecord=(~((rPDATF&0x1E0)>>1));
xrecord=xrecord>>4;
while(xrecord!=0x1) //judge row
{
x=x+1;
xrecord=xrecord>>1;
if(xrecord==0)
{
rPDATG=0X0F;
// no ,return
return 0;}
}
Delay(200); //delay 20ms
rPDATG=0XEF; //input high
while((rPDATF&0x1E0)==0x1E0)
{
rPDATG=rPDATG<<1;
temp=rPDATG;
if((temp&0xf0)==0XF0) //noboard press,return
{
rPDATG=0X0F;
return 0;}
}
Delay(200); //delay 10ms
yrecord=~((rPDATG&0xF0)>>4)&0x0F;
while(yrecord!=0x1) // judge line
{
y=y+1;
yrecord=yrecord>>1;
if(yrecord==0)
{
rPDATG=0X0F;
//no board press,return
return 0;}
}
Led_Display(x+(y-1)*4-1);
Uart_Printf("%3d",x+(y-1)*4-1);
Delay(1200); //delay 40ms
rPDATG=0X0F;
}
}
/*
int value;
rI_ISPC=BIT_EINT0;
rEXTINPND=0xf;
value=key_read();
if(value>-1)
digit_led_Symbol(value);
// digit_Led_Symbol(value);
rI_ISPC=BIT_EINT0;
rINTCON=0x1;
}
/*数码管短码表*/
/******************************************************
*函数名称: Digit_Led_Segment
*函数功能: 8段数码管显示控制
*参数: seg_num____数码管段号
*返回: 无
**************************************/
/* void Digit_Led_Symbol(int value)
{
if((value>=0)&&(value<16))
//* ledbuffer=~Symbol[value];
*(unsigned char *)led_Address=~Symbol[value];
return(1);
}*/
/***************************************************
void Digit_Led_Symbol(int seg_num)
{
//segment control
if((seg_num>=0)&&(seg_num<8))
*(unsigned char *)led_Address=~Seg[seg_num];
}
*****************************************************/
/*************************************************************
* 函数名称: KEY_READ
* 函数功能: 读键盘值
* 参数: 无
* 返回: 正确时返回键盘值,错误时返回-1
*************************************************************/
inline int key_read()
{
int value;
char temp;
temp= *(unsigned char *) (keyboard_base+0xFD); //读地址1(A1为低)
if((temp&KEY_VALUE_MASK)!=KEY_VALUE_MASK) //判断是否有键盘按下
{
if((temp&0x1)==0) //判断按键所对应的数据位
value=3;
else if((temp&0x2)==0)
value=2;
else if((temp&0x4)==0)
value=1;
else if((temp&0x8)==0)
value=0;
return value;
}
temp= *(unsigned char *) (keyboard_base+0xFB); //读地址2(A2为低)
if((temp&KEY_VALUE_MASK)!=KEY_VALUE_MASK) //判断是否有键盘按下
{
if((temp&0x1)==0) //判断按键所对应的数据位
value=7;
else if((temp&0x2)==0)
value=6;
else if((temp&0x4)==0)
value=5;
else if((temp&0x8)==0)
value=4;
return value;
}
temp= *(unsigned char *) (keyboard_base+0xF7); //读地址3(A3为低)
if((temp&KEY_VALUE_MASK)!=KEY_VALUE_MASK) //判断是否有键盘按下
{
if((temp&0x1)==0) //判断按键所对应的数据位
value=0xb;
else if((temp&0x2)==0)
value=0xa;
else if((temp&0x4)==0)
value=9;
else if((temp&0x8)==0)
value=8;
return value;
}
temp= *(unsigned char *) (keyboard_base+0xEF); //读地址4(A4为低)
if((temp&KEY_VALUE_MASK)!=KEY_VALUE_MASK) //判断是否有键盘按下
{
if((temp&0x1)==0) //判断按键所对应的数据位
value=0xf;
else if((temp&0x2)==0)
value=0xe;
else if((temp&0x4)==0)
value=0xd;
else if((temp&0x8)==0)
value=0xc;
return value;
}
return -1; //按键读/写失败
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -