【第7章】解析扫描码【二】

本文介绍了一种通过检测Shift键状态来实现大写字母打印的方法。通过定义全局变量记录Shift键状态,并利用扫描码与Key_Map表相结合的方式,实现了按下Shift键后字母的大写输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     这次我们要配合shift键打印大写的字母,先把代码贴出来:

Code:
  1. static int Shift_L;   
  2. static int Shift_R;   
  3.   
  4. void Keyboard_Read()   
  5. {   
  6.     u8 scan_code;   
  7.     int make;   
  8.     char disp[2];   
  9.     u32 *key_row;   
  10.     u32 key = 0;   
  11.     int col = 0;   
  12.        
  13.     Memory_Set(&disp[0],2,0);   
  14.        
  15.     if(kb_input_buffer.count > 0)   
  16.     {   
  17.         Disable_Int();   
  18.         scan_code = *(kb_input_buffer.p_head);   
  19.         kb_input_buffer.p_head++;   
  20.         kb_input_buffer.count--;   
  21.         if(kb_input_buffer.p_head >= kb_input_buffer.buffer + 256)   
  22.         {   
  23.             kb_input_buffer.p_head = kb_input_buffer.buffer;   
  24.         }   
  25.         Enable_Int();   
  26.            
  27.         if(scan_code == 0xe1)   
  28.         {   
  29.             /* 暂时不做任何操作 */  
  30.         }   
  31.         else if(scan_code == 0xe0)   
  32.         {   
  33.             /* 暂时不做任何操作 */  
  34.         }   
  35.         else  
  36.         {   
  37.             make = (scan_code & NR_SCAN_CODES)? 0 : 1;   
  38.             key_row = &Key_Map[(scan_code & 0x7f) * MAP_COLS];   
  39.                
  40.             if(Shift_L || Shift_R)   
  41.             {   
  42.                 col = 1;   
  43.             }   
  44.                
  45.             key = key_row[col];   
  46.                
  47.             switch(key)   
  48.             {   
  49.                 case SHIFT_L:   
  50.                     Shift_L = make;   
  51.                     key = 0;   
  52.                     break;   
  53.                 case SHIFT_R:   
  54.                     Shift_R = make;   
  55.                     key = 0;   
  56.                     break;   
  57.                 default:   
  58.                     if(!make)   
  59.                     {   
  60.                         key = 0;   
  61.                         break;   
  62.                     }   
  63.             }   
  64.                
  65.             if(key)   
  66.             {   
  67.                 disp[0] = key;   
  68.                 Disp_Color_Str(disp,0xa);   
  69.             }    
  70.         }   
  71.     }   
  72. }  

     先定义了两个static的全局局部变量,用来记录左边的shift和右边的shift键的状态,又在函数中定义了一个局部变量key,用来存放按下的键盘的相应的扫描码在表中对应的值,col和key_row的作用结合代码分析来说。

     首先照例是判断一下按下的键的扫描码是Make Code还是Break Code,然后把key_row定位到指向相应扫描码在表中相应的行的首个元素,再判断之前是否有shift键按下,如果有则把col赋值为1,然后把key值赋值为表中相应的值,这里可以看到col的作用了吧,如果按下的字母键,之前又按下了shift键,key值就为大写字母的ASCII码,接着一个switch语句,如果按下的是左边的shift键,则相应状态就要起变化,Shift_L赋为make,这就很巧妙,如果是Make Code,表示按下状态,如果是Break Code,则为弹起状态,Shift_L就为0了,接着是把key赋值为0,因为shift键是不可打印的。右边的shift键是雷同的,无需赘言。其它的键就判断一下是否是Make Code,如果不是,同样把key赋为0,表示不打印。最后判断一下key的值,如果不为0,就把key赋给disp[0],然后打印出来。

     make,运行,结果如图所示,按住shift不放,再按下字母键,就出现相应的大写字母,如果按下数字键,会出现相应的特殊字符:

     我们的胃口还没有得到满足,还有更多键等着我们处理。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值