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

📄 keyboard451.c

📁 这是一称的项目原文件,包括T9汉字输入,打印机,24C512,已经引用到产品上
💻 C
字号:
/*******************************************************************************
*  标题:  蓝海微芯LJD-SY-5100单片机开发系统演示程序                            *
*  文件:  keyboard451.c                                                              *
*  日期:  2006-7-22                                                             *
*  版本:  1.0                                                                  *
*  作者:  Pillar                                                             *
********************************************************************************
*  描述:                                                                       *
*              键盘管理                                         *     
*                                                                              *

********************************************************************************
* 【版权】 Copyright(C) belongs to 天宇蓝翔科技有限公司     All Rights Reserved *          
* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
*******************************************************************************/
#include <keyboard451.h>

BYTE   ch451_key;		                   // 存放键盘中断中读取的键值
BOOL   renew_key_id;
//*************************************************

void ch451_init()                          //初始化
{ 
  P1 = 0x60;
  
  ch451_din =0;
  ch451_dclk=1;                            //先低后高,选择4线输入
  ch451_din =1;
  ch451_load=1;
  ch451_dout=1;


  IT1=0;			                       //设置低电平触发
  IE1=0;			                       //清中断标志
  PX1=1;			                       //设置中断1为高优先级
  EX1=1;			                       //开外部中断1
  //ch451_write(0x201);                    //451 reset
  ch451_write(0x402);                      //set keyboard mode

}
//*****************************************************
//used in num key
BYTE get_num_address_from_key_value(BYTE key_value)  //读键值
{
   switch (key_value){
      case ZONGQING_KEY:                   //6
         return 5;
      case DANQING_KEY:                    //7
         return 6;
      case HUIZONG_KEY:                    //8
         return 7;
      case ZIDONG_KEY:                     //9
         return 8;
	  case JIUCUO_KEY:                     //
         return 'e';
      case ZONGZHONG_KEY:                  //
         return 1;
      case CHAXUN_KEY:                     //
         return 2;
      case ZOUZHI_KEY:                     //
         return 3;
      case BEIGUANG_KEY:   
		 return 4;
      case CUNRU_KEY:                     //
         return 'f';
      case GUILING_KEY:                   //0
         return 0;      
      case ZONGCI_KEY:                    //1
         return 9;
      case LEIBIE_KEY:                    //2
         return 'a';
      case SHEPI_KEY:                     //3
         return 'b';
      case RIQI_KEY:                      //4
         return 'c';
      case SHIJIAN_KEY:                   //5
         return 'd';
	  case GUANJI_KEY:                    //5
         return 'g';
      default :
         return 17;
   }

}

 void ch451_write(WORD command)               
{
  BYTE i;
  WORD tem;
  
  tem = command;
  EX1=0;			                       //禁止键盘中断
  //tem1 = command&0xff;
  ch451_load=0;                            //命令开始       
  for(i=0;i<12;i++){                       //送入12位数据,低位在前
    
    ch451_din = (tem &1);				
    ch451_dclk=0;
    tem = (tem >> 1);
    ch451_dclk =1;                         //上升沿有效
  }
  ch451_load =1;                           //加载数据
  EX1=1;
}



//*************************************************
//输入命令子程序,MCU从451读一字节
BYTE ch451_read()
{
  BYTE i;
  BYTE command,keycode;	                  //定义命令字,和数据存储器
  EX1=0;			                      //关中段	
  command=0x07;			                  //输入读451命令字	
  ch451_load=0;
  for(i=0;i<4;i++){
 
    ch451_din=command&1;		         //送入最低位
    ch451_dclk=0;			 
    command>>=1;			             //往右移一位
    ch451_dclk=1;			             //产生时钟上升沿锁通知CH451输入位数据
 }
  ch451_load=1;				             //产生加载上升沿通知CH451处理命令数据
  keycode=0;				             //清除keycode
  for(i=0;i<7;i++){
    keycode<<=1;	        		     //数据移入keycode,高位在前,低位在后
    keycode|=ch451_dout;		         //从高到低读入451的数据
    ch451_dclk=0;			             //产生时钟下升沿通知CH451输出下一位
    ch451_dclk=1;
 }
  IE1=0;				                 //清中断标志
  EX1=1;
  return(keycode);			             //反回键值
}


//*************************************************
//中断子程序  使用中断2,寄存器组1

void ch451_inter(void) interrupt 2 using 1
{			                 
  BYTE i,keycode;
  BYTE command;  

  EX1 = 0;                              //关中断
  command=0x07;                         //读取键值命令的高4位0111B
  ch451_load=0;                         //命令开始
  for(i=0;i<4;i++){
    ch451_din=command&1;                //低位在前,高位在后
    ch451_dclk=0;
    command>>=1;                        //右移一位
    ch451_dclk=1;                       //产生时钟上升沿锁通知CH451输入位数据
 }
  ch451_load=1;                         //产生加载上升沿通知CH451处理命令数据
  keycode=0;                            //清除keycode
  for(i=0;i<7;i++){
    keycode<<=1;                        //数据作移一位,高位在前,低位在后
    keycode|=ch451_dout;                //从高到低读入451的数据
    ch451_dclk=0;                       //产生时钟下升沿通知CH451输出下一位
    ch451_dclk=1;
 }
  ch451_key=keycode;                    //保存上次的键值 
  renew_key_id = 1;
   EX1 = 1;                             //开中断
   IE1 = 0;				                //清中断标志,可由cpu自动进行
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -