数码之家

 找回密码
 立即注册
搜索
查看: 17045|回复: 105

[外设] 用笔记本键盘做个USB办公键盘[原创/数码之家首发]

    [复制链接]
发表于 2020-2-3 15:16:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
新年了,先给大家拜个年。。2020年开局不畅,大家且行且珍惜,祝身体健康,开心快乐!


一、先说说为什么想做这么个冻冻?

话说N年前,曾有那么一台笔记本摆在我的面前,编程打字的手感那是爽得不要不要的,如果苍天能再放一台那个本本在我面前,也许。。。。。。。。。。。。。。我会说那机机还是慢了点点。我也用过那么一种导电橡胶键盘,码字也是很好用,可惜时间长老化了,打字居然有些按不下去。而机械键盘青轴过吵,红轴和茶轴没用过,好像也需要垫那么个缓冲垫才能基本静音,而且行程还是长了。打字跟不上自己的思想节奏。。咳咳,好吧,我心虚的承认下回还是要弄个茶轴玩玩的。。办新电脑的时候,给自己弄了个机械手感键盘,键盘方向键居然有问题,卖电脑的熟人说让我去换,可键盘外观被同事弄变形可不好再退回。只能放一边,年前弄了个双面导电的铜胶带修复备用。。
到现在实在是不想乱买那些台式机键盘冒险。但仍很想找个笔记本键盘连台式机使用。闲来查查,发现有一款IBM的现成键盘,但占地面积比较大,我那小桌面是摆不下了。至于价格呢,旧的都要几百。性价比还是差了,没意思。那么还是动手吧。。别当懒鬼了。


二、怎么做?

怎么做?是不好做啊。。关于笔记本键盘的接口线序是怎样?网上资料真是很难查。用哪种硬件接口笔记本键盘?上USB还是PS2?应该用USB吧?好像USB广泛些。那用USB的话,用哪种芯片呢?全是问题。想不通那就先一步步查资料吧。先得确定用哪种品牌笔记本的键盘?嗯。。我曾经用的那台笔记本是什么型号来着?不记得了。。搜吧!

于是,搜到了ACER Aspire 4710。嗯,就是这家伙,可这键盘居然多了个角?我曰。。为什么!
ACER4710键盘图.jpg

网上找的图。
好吧。。不管了。为了情怀,继续吧!
然后就是狂野的在网上找资料。。N天后,毫无头绪。。于是逆向搜索,从TB上找键盘,大不了拿到后再测试。
好消息,搜到了。标题是4701、4310啥啥啥的。为了不乱做广啊告什么的。我就不上图了。。等等,4710搜不到,那是不是可以试试4310?那是不是可以搜搜呢?搜!MS在PUDN搜到了PDF。真是得来全不费工夫。。。。
键盘位置接口如图,

ACER4710键盘接口.jpg

原理图是26脚+2个接地脚,没有引脚间距。PCB引脚定义上是25个。纠结。。
于是把TB上的广告图复制打印下来,一个一个的算,确认是26个脚,而且看间距应该是1mm。于是可以采购相关材料了。1.0mm26脚FPC正好有买过,找部门领导弄了两个。够用了~
趁着双11,把红包全用掉,买了个键盘回来。丫比别的笔记本键盘贵些,还不确定是原装,额。。
买好了,下面就该定方案了。


三、动手

方案定了三种,做了下先后选择。
方案一之一支独秀:STM32做为主控,STM32直接和键盘接口,STM32还自带USB接口,仿一个HID键盘应是最简单的方式。搜了几个方案,后来确定了用某一个高手DIY机械键盘的方案。可以不动脑筋了,BS自己一下先。
方案二之移形换影:用通用USB键盘接口芯片。把笔记本键盘伪装成为一个薄膜键盘?不错不错,这个好,只用找个芯片把笔记本键盘接口到USB键盘接口芯片就行了。(其实一点都不轻松,后面详解。)
方案三之移形换影CPLD篇:和方案二差不多,只是可以顺便练习一下CPLD。FPGA搞过NIOSII,VHDL什么的生硬得很,算是个B计划吧。
3.1方案一的实现:电路上没有什么好说的,不过因为要确认笔记本键盘接口方向(也就是说哪边是KOW8,哪边是KCOL1),还是要注意一下键盘排线接反后的通用性。

电路如下:
方案一电路图.jpg


从图可见,做了两种USB接口,方便用打印机口,或是MICRO口。考虑到接口IO的数量、还需要显示调试信息,使用了STM32F103RBT6。显示用了一个0.96寸的OLED,SPI接口,编程方便。LM1117 3.3V就不表了。三个LED用来显示NUMLOCK、SCROLL_LOCK、CAPS_LOCK。还一个是POWER_LED。
在此感谢一下某创的PCB打样,双面板50*50,5元。很OK。。
原程序已经包含了USB枚举、按键输出等等了,我只用检测按键(多按键同时按下也应该判断)。

  1. <font size="3" face="微软雅黑">while(1)
  2.          {
  3.                   for(i=0;i<8;i++)tx_buf=0x00;
  4.                   do
  5.                   {
  6.                           keynum=0;
  7.                           
  8.                           for(r=1;r<9;r++)
  9.                   {
  10.                           
  11.                           //1.第1ROW到第8ROW
  12.                           changeRowlineDir(r);
  13.                           //查COL是否有0;
  14.                           for(j=1;j<19;j++)
  15.                           {
  16.                                    if(0==detectcol(j))
  17.                                             {
  18.                                                      
  19.                                                      OLED_ShowNum(0,0,j,2,12);
  20.                                                      OLED_ShowNum(0,2,r,2,12);
  21.                                                      temp=KEYMAP[j][r];
  22.                                                      if(keynum<2)
  23.                                                      {keys[keynum]=temp;
  24.                                             keynum++;}
  25.                                                      OLED_ShowNum(0,4,temp,2,12);
  26.                                             
  27.                                                      //如果按键是SHIFT或ALT或CTRL
  28.                                                      if(temp==KEYMAP[3][5]) flagrshift=TRUE;
  29.                                                      elseif(temp==KEYMAP[3][2] ) flaglshift=TRUE;   
  30.                                                      elseif(temp==KEYMAP[4][3]) flaglctrl=TRUE;
  31.                                                      elseif(temp==KEYMAP[4][8]) flagrctrl=TRUE;      
  32.                                                      elseif(temp==KEYMAP[7][6]) flaglalt=TRUE;
  33.                                                      elseif(temp==KEYMAP[7][7]) flagralt=TRUE;      
  34.                                                      elseif(temp==KEYMAP[5][4] )flagwin=TRUE;
  35.                                                      else
  36.                                                      {
  37.                                                              tx_buf[2]=temp;
  38.                                                      }
  39.                                                                                                          
  40.                                             }
  41.                           }
  42.                           //OLED显示,行i,列j.至少显示3个键。
  43.                           //方向改回
  44.                           iogetback(r);
  45.                   }
  46.                   //获取完成,保存了keynum个按键,且放到了keys数组里。
  47.                   if(keynum!=0)
  48.                   {
  49.                           cansend=TRUE;
  50.                           for(i=keynum;i<3;i++)
  51.                           {
  52.                                    keys=0x00;
  53.                           }
  54.                   }
  55.                   else
  56.                   {
  57.                                    for(i=0;i<3;i++)oldkey=0;
  58.                           for(i=0;i<3;i++)keys=0;
  59.                           for(i=0;i<8;i++)tx_buf=0x00;
  60.                            flaglshift=FALSE;
  61. flaglalt=FALSE;
  62. flaglctrl=FALSE;
  63. flagrshift=FALSE;
  64. flagralt=FALSE;
  65. flagrctrl=FALSE;
  66. flagwin=FALSE;
  67.                   }
  68.                   if(     (keys[0]==oldkey[0]) &&(keys[1]==oldkey[1]) &&(keys[2]==oldkey[2] ))
  69.                   {cansend=FALSE;for(i=0;i<8;i++)tx_buf=0x00;}
  70.                   
  71.                   }
  72.                   while(cansend==FALSE);
  73.                           //扫描完成,判断后,从USB发送按键。
  74.                   //应该判断WIN键、CTL、SHIFT键。用USBTRACE工具判断是否输出。
  75.                           if(flaglshift)tx_buf[0]|=0x02;if(flagrshift) tx_buf[0]|=0x20;
  76.                   if(flaglctrl)tx_buf[0]|=0x01;if(flagrctrl) tx_buf[0]|=0x10;
  77.                   if(flaglalt)tx_buf[0]|=0x04;if(flagralt) tx_buf[0]|=0x40;
  78.                   if(flagwin)  tx_buf[0]|=0x08;
  79.                           
  80.                   //发送
  81.                   UserToPMABufferCopy(tx_buf,GetEPTxAddr(ENDP2), 8);
  82.          
  83.          SetEPTxValid(ENDP2);
  84.          delay_ms(10);
  85.                                             UserToPMABufferCopy(up,GetEPTxAddr(ENDP2), 8);
  86.          
  87.          SetEPTxValid(ENDP2);
  88.          delay_ms(10);
  89.                                             
  90.                    flaglshift=FALSE;
  91. flaglalt=FALSE;
  92. flaglctrl=FALSE;
  93. flagrshift=FALSE;
  94. flagralt=FALSE;
  95. flagrctrl=FALSE;
  96. flagwin=FALSE;
  97.                   
  98.                   
  99.                   
  100.                   for(i=0;i<3;i++)oldkey=keys;
  101.                   for(i=0;i<3;i++)keys=0;
  102.                   for(i=0;i<8;i++)tx_buf=0x00;
  103.          OLED_ShowNum(64,4,oldkey[0],2,12);
  104.                                    
  105.          }</font>
复制代码


程序写得不是很好,OLED显示行列信息。基本实现了CTRL、SHIFT、ALT、WIN键的组合键。而且按键常按的情况没考虑。FN键不知道如何响应,估计要用另外一个ENDPOINT,对USB还是不太了解。。虚汗一把。。
1.jpg

3.jpg


3.2 方案二的实现:

问题:经过搜索,查到HT82k629av160这个芯片性价比比较好。首次搜到度娘上的数据文档有人说文档有错误,不过没有详说。那可能大部分是正确的吧。下载一个最新版本,先画图。然后问题是用哪种芯片接大约至少8+18+8+20=54个IO。还应该即时响应HT82k629的查询电平。AVR是肯定没有那么多脚了,STM8可能有,不过我用得少,写过几个程序,但没上过工程,PASS。STM32好像只能接3.3V IO。后来又找了一大圈,回头突然发现STM32部分(其实可算是大部分)引脚可以容忍5V,就它了。找STM32F103VBT6数据文档,一个IO一个IO的数,5V容忍IO还是挺多的嘛。。于是确定好芯片,图也好画出来。如下:
方案二电路图.jpg

从图中可以看到,依旧加了OLED来显示调试信息(后来程序里没用上)。因为HT82k629是COL线输出低电平,考虑到STM32的下降沿中断没有20条那么多,所以用了三个74HC21两个四输入与门芯片,把8个下降沿中断放到了EXTI9_5_IRQHandler和EXTI15_10_IRQHandler两个中断向量上。HT82k629有内部3V输出,没用过,还是弄个1117 3.3v 做STM32的供电,也是USB线的上拉。
至于程序和方案一一脉相承。
先看main函数
  1. while(1)
  2.          {
  3.                   
  4.                           for(r=0;r<8;r++)
  5.                   {
  6.                           
  7.                           //1.第1ROW到第8ROW
  8.                           changeRowlineDir(r);
  9.                           //查COL是否有0;
  10.                           for(j=0;j<18;j++)
  11.                           {
  12.                                    if(0==detectcol(j))
  13.                                             {
  14.                                                      //setthebit(r,j,0);
  15.                                                      k629buf[k629col[j][r]]&=~(1<<k629row[j][r]);
  16.                                             
  17.                                                                                                          
  18.                                             }
  19.                                             else
  20.                                                      {
  21.                                                              k629buf[k629col[j][r]]|=(1<<k629row[j][r]);
  22.                                                      }
  23.                           }
  24.                           //OLED显示,行i,列j.至少显示3个键。
  25.                           //方向改回
  26.                           iogetback(r);
  27.                   }
  28.                                    
  29. }
复制代码

这段程序是狂扫键盘IO,看哪些脚按下了,保存到k629buf数组里。
然后是中断函数

  1. void EXTI9_5_IRQHandler(void)
  2. {
  3. u8 ret1;
  4.          ret1=22;//超出20
  5.    if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  6.     {
  7.        EXTI_ClearITPendingBit(EXTI_Line8);
  8.        if(0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)) ret1=15;
  9.                                    elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)) ret1=14;
  10.                                             elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)) ret1=13;
  11.                                                      elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)) ret1=12;
  12.     }
  13.    if(EXTI_GetITStatus(EXTI_Line9) != RESET)
  14.     {
  15.        EXTI_ClearITPendingBit(EXTI_Line9);
  16.        if(0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)) ret1=2;
  17.                                    elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)) ret1=3;
  18.                                             elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2)) ret1=4;
  19.                                                      elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)) ret1=5;
  20.     }
  21.    if(ret1<20)
  22.                   {
  23.                           //在K926的ROW上输出k629buf[ret1]。
  24.                           GPIO_WriteBit(GPIOE,GPIO_Pin_4,(k629buf[ret1]&(1<<0))?Bit_SET:Bit_RESET);
  25.                           GPIO_WriteBit(GPIOE,GPIO_Pin_5,(k629buf[ret1]&(1<<1))?Bit_SET:Bit_RESET);
  26.                           GPIO_WriteBit(GPIOE,GPIO_Pin_6,(k629buf[ret1]&(1<<2))?Bit_SET:Bit_RESET);
  27.                           GPIO_WriteBit(GPIOE,GPIO_Pin_7,(k629buf[ret1]&(1<<3))?Bit_SET:Bit_RESET);
  28.                           GPIO_WriteBit(GPIOD,GPIO_Pin_8,(k629buf[ret1]&(1<<4))?Bit_SET:Bit_RESET);
  29.                           GPIO_WriteBit(GPIOD,GPIO_Pin_9,(k629buf[ret1]&(1<<5))?Bit_SET:Bit_RESET);
  30.                           GPIO_WriteBit(GPIOD,GPIO_Pin_10,(k629buf[ret1]&(1<<6))?Bit_SET:Bit_RESET);
  31.                           GPIO_WriteBit(GPIOD,GPIO_Pin_11,(k629buf[ret1]&(1<<7))?Bit_SET:Bit_RESET);
  32.                   }
  33.                   else
  34.                   {
  35.                           
  36.                   }
  37. }
  38. void EXTI15_10_IRQHandler(void)
  39. {
  40. u8 ret1;
  41.          ret1=22;//超出20
  42.    if(EXTI_GetITStatus(EXTI_Line10) != RESET)
  43.     {
  44.        EXTI_ClearITPendingBit(EXTI_Line10);
  45.        if(0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)) ret1=6;
  46.                                    elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)) ret1=7;
  47.                                             elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)) ret1=0;
  48.                                                      elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)) ret1=1;
  49.     }
  50.    if(EXTI_GetITStatus(EXTI_Line11) != RESET)
  51.     {
  52.        EXTI_ClearITPendingBit(EXTI_Line11);
  53.        if(0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12)) ret1=11;
  54.                                    elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13)) ret1=10;
  55.                                             elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14)) ret1=9;
  56.                                                      elseif (0==GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15)) ret1=8;
  57.     }
  58.     if(EXTI_GetITStatus(EXTI_Line12) != RESET)
  59.     {
  60.        EXTI_ClearITPendingBit(EXTI_Line12);
  61.        if(0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)) ret1=16;
  62.                                    elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_13)) ret1=17;
  63.                                             elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)) ret1=18;
  64.                                                      elseif (0==GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_15)) ret1=19;
  65.     }
  66.    if(ret1<20)
  67.                   {
  68.                           //if(ret1==1)
  69.                           {
  70.                                    //在K926的ROW上输出k629buf[ret1]。
  71.                           GPIO_WriteBit(GPIOE,GPIO_Pin_4,(k629buf[ret1]&(1<<0))?Bit_SET:Bit_RESET);
  72.                           GPIO_WriteBit(GPIOE,GPIO_Pin_5,(k629buf[ret1]&(1<<1))?Bit_SET:Bit_RESET);
  73.                           GPIO_WriteBit(GPIOE,GPIO_Pin_6,(k629buf[ret1]&(1<<2))?Bit_SET:Bit_RESET);
  74.                           GPIO_WriteBit(GPIOE,GPIO_Pin_7,(k629buf[ret1]&(1<<3))?Bit_SET:Bit_RESET);
  75.                           GPIO_WriteBit(GPIOD,GPIO_Pin_8,(k629buf[ret1]&(1<<4))?Bit_SET:Bit_RESET);
  76.                           GPIO_WriteBit(GPIOD,GPIO_Pin_9,(k629buf[ret1]&(1<<5))?Bit_SET:Bit_RESET);
  77.                           GPIO_WriteBit(GPIOD,GPIO_Pin_10,(k629buf[ret1]&(1<<6))?Bit_SET:Bit_RESET);
  78.                           GPIO_WriteBit(GPIOD,GPIO_Pin_11,(k629buf[ret1]&(1<<7))?Bit_SET:Bit_RESET);
  79.                           }
  80.                           
  81.                   }
  82.                   else
  83.                   {
  84.                           
  85.                   }
  86. }
复制代码

进入相关中断后,读取k629buf的各相关位,如果是低电平,那么置低相关IO。否则(这个很重要,否则HT82k629误认为无关键是按下的,会导致按键乱触发),重新恢复高电平输出。
比如这句:
GPIO_WriteBit(GPIOD,GPIO_Pin_11,(k629buf[ret1]&(1<<7))?Bit_SET:Bit_RESET);

就是把PD11脚按k629buf[ret1]的第8位置高或置低。ret1保存了HT82k629目前是扫描到哪个列线了。
程序比较简单。IO脚的输入输出速度比HT82k629的扫描时间(大概400HZ)快得多,完美欺骗了HT82k629。

但调试还是有波折的,首先是用了stm32cubeMX生成程序框架,加上我的代码后,程序乱跳,调了很久不明所以。。然后是拿方案一的程序删减,仍是使用我的原版代码,程序工作正常。调试中”a”、“z”键那一列键出不来。拿示波器看IO脚,发现扫到a/z时的下降沿被板子吃掉了。拿放大镜检查STM32F103VBT6引脚正常,而HT82k629的24脚没焊好。我叉。。STM32F103VBT6 那100个脚没点问题,偏偏这个48脚芯片焊接失误。。曰!
继续调试,发现PAGEUP、PAGEDOWN、INS键出错。仔细查程序没有问题,突然想起之前度娘里那句“文档有错”,估计文档确实仍有问题。虽然文档的问题大概应该是硬件,现在也只能死马当活马医了。大胆把KEY MATRIX表格pageup/pagedown/ins/sleep对调。改好程序表格后,编译,下载正常。。然后把欧元符号和$符合定义为音量加减,完工。
哦耶。。。。
不过,还是有个问题,FN键组合没调出来。程序没问题,文档内也不详。于是为了不影响使用,暂时把FN改成了numlock键。。如果本坛有哪个高手弄过这个,请给点拔一下,谢谢啦。。
然后,来把红白模拟器“魂斗罗30条命S弹枪”吧先。。哈哈哈。。嗯,还剩5条时通关了。。想当年1条命就可以玩过全关。。现在嘛,只能怪天冷了。。


方案三:板子画了,上的EPM7128,5V IO必须的。可惜程序前两天写完,编译发现门不够。。再曰。应该还是可以再优化优化的。。欢迎大家自己试试。


现在的键盘的情况是这样的,用了一根三_星的手机数据线(也是在坛子里某人那买的,用得很久了)连到电脑。我手上没有双面胶了,键盘无法固定。后续完成还得等手上有材料再说,还在想怎么固定好,怎么变得美观。现在更是想再买一块带数字键盘的笔记本键盘,前两天已经物色好,也许今天就会付款了。


4.jpg

6.jpg

5.jpg

本帖的最后:

这小工程其实没有完工,这东东完全像个样子看来是个很漫长的过程,而年后应该会又忙起来了。
那突如其来的新型肺炎给全国都带来了巨大损失,真心祝福武汉!祝福我们国家!希望病毒赶紧被消灭,让大家都恢复到正常生活中去!


电路和代码的问题:
就看看大家是怎样顶帖的了。

折腾的问题:
不是需要解释的问题。




用stm32开发小板改笔记本内置键盘为普通USB键盘, 含固件:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=122321

打赏

参与人数 16家元 +255 收起 理由
古都8384 + 1 優秀文章
qq826702639 + 1 这就是瘟疫害的,吃饱了没事干,.
jtcat + 5
jimixiaozi + 20 優秀文章
ch104517745 + 20
zhongyidiy + 5 原創內容
o759 + 50 求助,我的笔记本 键盘的67YUHJNM按键不能.
hydize + 10 会电路会编程,厉害
cushion + 20 原創內容
suhaiyuan + 20 謝謝分享

查看全部打赏

 楼主| 发表于 2020-2-16 20:04:20 | 显示全部楼层
最新效果:我本打算搞两块三合板凑合的。感谢@jpdd521帮我折腾了个限量版底座。这瞬间高大尚了两三个数量级。。。感谢!灰常感谢!



2.jpg

1.jpg

3.jpg

4.jpg

5.jpg


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-3 15:16:43 | 显示全部楼层
占楼。沙发不留。
回复 支持 反对

使用道具 举报

发表于 2020-2-3 16:42:53 | 显示全部楼层
折腾的价值大于实际价值...
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-3 17:09:09 | 显示全部楼层
为了一条领带,配了一身西装:tongue:
回复 支持 2 反对 0

使用道具 举报

发表于 2020-2-4 09:35:41 | 显示全部楼层
表示我就看看    这工程量真是     支持一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 10:23:55 | 显示全部楼层
邪恶海盗 发表于 2020-2-3 16:42
折腾的价值大于实际价值...

开心就好:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 10:25:56 | 显示全部楼层
bass 发表于 2020-2-3 17:09
为了一条领带,配了一身西装

开心就好
回复 支持 反对

使用道具 举报

发表于 2020-2-4 12:08:58 | 显示全部楼层
oled是键盘没到时调试用的??
回复 支持 反对

使用道具 举报

发表于 2020-2-4 14:56:40 | 显示全部楼层
考虑下ThinkPad小红点独立键盘?基本就是个笔记本键盘的大小
回复 支持 反对

使用道具 举报

发表于 2020-2-4 15:40:25 来自手机浏览器 | 显示全部楼层
如能研究下怎样玩转ThinkPad的红点键盘,不胜感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 17:13:30 | 显示全部楼层
yilingking 发表于 2020-2-4 12:08
oled是键盘没到时调试用的??

在还没摸清键盘排线方向时,用来判断行列用的。图片中我没接键盘,但方案一在调试时,按下某键,会在OLED上简单显示行与列。
因此,OLED是在键盘到了后,用于调试的。
最开始的想法还有加上时钟芯片,后来觉得显示时间不是重点,就没整了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 17:22:22 | 显示全部楼层
阿粗 发表于 2020-2-4 15:40
如能研究下怎样玩转ThinkPad的红点键盘,不胜感谢

谢谢你的支持!红点会需要增加鼠标驱动。得从方案一修改。方案一我参考的源码中有结合鼠标驱动。公司开工后,闲暇时应该会继续研究。刚才考虑了考虑,方案一的工程可加上FREERTOS,把键鼠功能独立编程会更轻松,键盘常按时的处理也会简单很多。
回复 支持 反对

使用道具 举报

发表于 2020-2-4 17:22:39 | 显示全部楼层
阿粗 发表于 2020-2-4 15:40
如能研究下怎样玩转ThinkPad的红点键盘,不胜感谢

小红点是ps2协议的,讨论旧tp的论坛三四年前就好几个人出了好几个方案
回复 支持 反对

使用道具 举报

发表于 2020-2-4 17:23:20 | 显示全部楼层
丢把钥匙买套房:sweat:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 17:24:18 | 显示全部楼层
@jpdd521        + 20        画个图纸,免费给你CNC用木头做个底板。.

--------------------------------------------------------------------------------------
感谢!
回复 支持 反对

使用道具 举报

发表于 2020-2-4 18:07:42 | 显示全部楼层
asnake 发表于 2020-2-4 17:24
@jpdd521        + 20        画个图纸,免费给你CNC用木头做个底板。.

---------------------------------------------- ...

然后,我刚发现,dell XT3的键盘是USB的,直接引出来4根线USB,就可以了。。。
不影响做地板,不影响做底板,重在折腾:lol:
回复 支持 反对

使用道具 举报

发表于 2020-2-4 19:21:13 | 显示全部楼层
大佬就是不同
回复 支持 反对

使用道具 举报

发表于 2020-2-4 20:22:21 | 显示全部楼层
实现了我曾经的愿望!厉害!
回复 支持 反对

使用道具 举报

发表于 2020-2-4 20:47:47 | 显示全部楼层
楼主 我知道你要的是什么手感的键盘
是笔记本键盘 X结构的
我现在打字用的就是同款 不过是台式机
联想给一个一体机做的出口产品 标准键盘布局
搜索  JME7597P 有惊喜!
价格么  我当时买不到50
后来好用  又买个 70多
现在这个键盘已经快10年了
手感依旧如故
很好的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 10:20 , Processed in 0.280800 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表