<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32_ps2鍵盤顯示測(cè)試程序

          stm32_ps2鍵盤顯示測(cè)試程序

          作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
          [cpp]view plaincopy
          1. //PS2鍵盤測(cè)試程序,可換行,按shift不放接著輸入
          2. //可輸出大寫,按下CAPS輸出大寫,再次按下輸出小寫
          3. //此程序只用來(lái)測(cè)試,代碼冗余,僅供參考,可根據(jù)需要自行刪減
          4. //PA13->PS2.CLKPA15->PS2.DATA
          5. #include<stm32f10x_lib.h>
          6. #include"sys.h"
          7. #include"usart.h"
          8. #include"delay.h"
          9. #include"led.h"
          10. #include"key.h"
          11. #include"exti.h"
          12. #include"wdg.h"
          13. #include"timer.h"
          14. #include"lcd.h"
          15. constu8unshifted[][2]=//shift鍵沒(méi)按下譯碼表
          16. {
          17. 0x0e,`,
          18. 0x15,q,
          19. 0x16,1,
          20. 0x1a,z,
          21. 0x1b,s,
          22. 0x1c,a,
          23. 0x1d,w,
          24. 0x1e,2,
          25. 0x21,c,
          26. 0x22,x,
          27. 0x23,d,
          28. 0x24,e,
          29. 0x25,4,
          30. 0x26,3,
          31. 0x29,,
          32. 0x2a,v,
          33. 0x2b,f,
          34. 0x2c,t,
          35. 0x2d,r,
          36. 0x2e,5,
          37. 0x31,n,
          38. 0x32,b,
          39. 0x33,h,
          40. 0x34,g,
          41. 0x35,y,
          42. 0x36,6,
          43. 0x39,,,
          44. 0x3a,m,
          45. 0x3b,j,
          46. 0x3c,u,
          47. 0x3d,7,
          48. 0x3e,8,
          49. 0x41,,,
          50. 0x42,k,
          51. 0x43,i,
          52. 0x44,o,
          53. 0x45,0,
          54. 0x46,9,
          55. 0x49,.,
          56. 0x4a,/,
          57. 0x4b,l,
          58. 0x4c,;,
          59. 0x4d,p,
          60. 0x4e,-,
          61. 0x52,,
          62. 0x54,[,
          63. 0x55,=,
          64. 0x5b,],
          65. 0x5d,,
          66. 0x61,<,
          67. 0x69,1,
          68. 0x6b,4,
          69. 0x6c,7,
          70. 0x70,0,
          71. 0x71,.,
          72. 0x72,2,
          73. 0x73,5,
          74. 0x74,6,
          75. 0x75,8,
          76. 0x79,+,
          77. 0x7a,3,
          78. 0x7b,-,
          79. 0x7c,*,
          80. 0x7d,9,
          81. 0,0
          82. };
          83. constu8shifted[][2]=//shift鍵按下譯碼表
          84. {
          85. 0x0e,~,
          86. 0x15,Q,
          87. 0x16,!,
          88. 0x1a,Z,
          89. 0x1b,S,
          90. 0x1c,A,
          91. 0x1d,W,
          92. 0x1e,@,
          93. 0x21,C,
          94. 0x22,X,
          95. 0x23,D,
          96. 0x24,E,
          97. 0x25,$,
          98. 0x26,#,
          99. 0x29,,
          100. 0x2a,V,
          101. 0x2b,F,
          102. 0x2c,T,
          103. 0x2d,R,
          104. 0x2e,%,
          105. 0x31,N,
          106. 0x32,B,
          107. 0x33,H,
          108. 0x34,G,
          109. 0x35,Y,
          110. 0x36,^,
          111. 0x39,L,
          112. 0x3a,M,
          113. 0x3b,J,
          114. 0x3c,U,
          115. 0x3d,&,
          116. 0x3e,*,
          117. 0x41,<,
          118. 0x42,K,
          119. 0x43,I,
          120. 0x44,O,
          121. 0x45,),
          122. 0x46,(,
          123. 0x49,>,
          124. 0x4a,?,
          125. 0x4b,L,
          126. 0x4c,:,
          127. 0x4d,P,
          128. 0x4e,_,
          129. 0x52,",
          130. 0x54,{,
          131. 0x55,+,
          132. 0x5b,},
          133. 0x5d,|,
          134. 0x61,>,
          135. 0x69,1,
          136. 0x6b,4,
          137. 0x6c,7,
          138. 0x70,0,
          139. 0x71,.,
          140. 0x72,2,
          141. 0x73,5,
          142. 0x74,6,
          143. 0x75,8,
          144. 0x79,+,
          145. 0x7a,3,
          146. 0x7b,-,
          147. 0x7c,*,
          148. 0x7d,9,
          149. 0,0
          150. };
          151. voidDecode(u8scancode);//聲明函數(shù)原型
          152. u8bitcount=11,ascii=;//bitcount為位計(jì)數(shù)值;ascii為翻譯后的ASCII碼,初值為空格
          153. u8hang=0,lie=0;//彩屏顯示位置
          154. intmain(void)
          155. {
          156. Stm32_Clock_Init(9);//系統(tǒng)時(shí)鐘設(shè)置
          157. delay_init(72);//延時(shí)初始化
          158. uart_init(72,9600);//串口1初始化
          159. EXTIX_Init();
          160. LED_Init();
          161. LCD_Init();
          162. LCD_Clear(YELLOW);
          163. POINT_COLOR=RED;
          164. BACK_COLOR=YELLOW;
          165. while(1)
          166. {
          167. if(hang>=240)//換行
          168. {hang=0;lie+=16;if(lie>=320)lie=0;}
          169. LCD_ShowChar(hang,lie,ascii,16,0);//顯示鍵盤字符
          170. }
          171. }
          172. /*******************************************
          173. 函數(shù)名稱:Decode
          174. 功能:
          175. 參數(shù):scancode--需要翻譯的掃描碼
          176. 返回值:無(wú)
          177. ********************************************/
          178. voidDecode(u8scancode)
          179. {
          180. staticu8up=0,shift=0;//up為通、斷碼標(biāo)志,shift為shift鍵按下標(biāo)志
          181. u8i;
          182. if(!up)//已接收的11位數(shù)據(jù)是通碼(up為0)
          183. {
          184. switch(scancode)//開(kāi)始翻譯掃描碼
          185. {
          186. case0xF0://鍵盤釋放標(biāo)志(隨后的一個(gè)字節(jié)是斷碼)
          187. up=1;//設(shè)置up為斷碼標(biāo)志
          188. break;
          189. case0x12://左shift鍵按下
          190. shift=1;//設(shè)置shift為按下標(biāo)志
          191. break;
          192. case0x59://右shift鍵按下
          193. shift=1;//設(shè)置shift為按下標(biāo)志
          194. break;
          195. case0x58://CAPS鍵按下處理
          196. shift=(shift==0)?1:0;//shift取反
          197. break;
          198. case0x66://backspace鍵按下時(shí)處理
          199. //backspace鍵按下時(shí)處理
          200. break;
          201. case0x5a://回車鍵按下時(shí)處理:換行
          202. ascii=;
          203. hang=0;
          204. lie=lie+16;
          205. break;
          206. default:
          207. if(!shift)//如果shift鍵沒(méi)有按下
          208. {//查找unshifted表,表中左列是掃描碼,右列是對(duì)應(yīng)的ASCII碼
          209. for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
          210. if(unshifted[i][0]==scancode)
          211. {
          212. ascii=unshifted[i][1];
          213. hang=hang+8;
          214. }
          215. }
          216. else//如果shift鍵按下
          217. {//查找shifted表
          218. for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);
          219. if(shifted[i][0]==scancode)
          220. {
          221. ascii=shifted[i][1];
          222. hang=hang+8;
          223. }
          224. }
          225. break;
          226. }
          227. }
          228. else//已接收的11位數(shù)據(jù)是斷碼(up為1)
          229. {
          230. up=0;//將斷碼標(biāo)志復(fù)位
          231. switch(scancode)//檢測(cè)shift鍵釋放
          232. {
          233. case0x12://左shift鍵
          234. shift=0;
          235. break;
          236. case0x59://右shift鍵
          237. shift=0;
          238. break;
          239. default:
          240. break;
          241. }
          242. }
          243. }

          本文引用地址:http://www.ex-cimer.com/article/201611/320430.htm

          此外還需修改中斷文件夾中的兩個(gè)函數(shù)

          [cpp]view plaincopy
          1. voidEXTIX_Init(void)
          2. {
          3. RCC->APB2ENR|=1<<2;//使能PORTA時(shí)鐘
          4. JTAG_Set(JTAG_SWD_DISABLE);//關(guān)閉JTAG和SWD
          5. GPIOA->CRL&=0XFFFFFFF0;//PA0設(shè)置成輸入
          6. GPIOA->CRL|=0X00000008;
          7. GPIOA->CRH&=0X0F0FFFFF;//PA13,15設(shè)置成輸入
          8. GPIOA->CRH|=0X80800000;
          9. GPIOA->ODR|=1<<13;//PA13上拉,PA0默認(rèn)下拉
          10. GPIOA->ODR|=1<<15;//PA15上拉
          11. Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿觸發(fā)
          12. //Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿觸發(fā)
          13. Ex_NVIC_Config(GPIO_A,15,FTIR|RTIR);//下降、上升沿觸發(fā)
          14. MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//搶占2,子優(yōu)先級(jí)2,組2
          15. MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//搶占2,子優(yōu)先級(jí)1,組2
          16. }
          17. //外部中斷15~10服務(wù)程序
          18. voidEXTI15_10_IRQHandler(void)
          19. {
          20. staticu8data;//聲明局部靜態(tài)變量來(lái)保存掃描碼
          21. if(!PAin(15))//如果是下降沿觸發(fā)中斷
          22. {
          23. if(bitcount<11&&bitcount>2)//3到10位是數(shù)據(jù),起始位,校驗(yàn)位和停止位忽略
          24. {
          25. data=(data>>1);//右移保存數(shù)據(jù)
          26. if(PAin(13)&0x01)
          27. {
          28. data|=0x80;//存儲(chǔ)一個(gè)1
          29. }
          30. }
          31. }
          32. else//如果是上升沿觸發(fā)中斷
          33. {
          34. if(--bitcount==0)//如果11位全部接收完畢
          35. {
          36. Decode(data);//將掃描碼翻譯成ASCII碼
          37. bitcount=11;//重新設(shè)為11位數(shù)據(jù)
          38. }
          39. }
          40. //delay_ms(10);//消抖
          41. //if(KEY0==0)//按鍵0
          42. //{
          43. //LED0=!LED0;
          44. //}elseif(KEY1==0)//按鍵1
          45. //{
          46. //LED1=!LED1;
          47. //}
          48. //EXTI->PR=1<<13;//清除LINE13上的中斷標(biāo)志位
          49. EXTI->PR=1<<15;//清除LINE15上的中斷標(biāo)志位
          50. }



          關(guān)鍵詞: stm32ps2鍵盤顯示測(cè)

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();