⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key_read.c

📁 用hitool开发的8段数码管的显示程序 c语言的程序 嵌入一点汇编
💻 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 + -