新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > stm32_ps2鍵盤顯示測試程序

stm32_ps2鍵盤顯示測試程序

作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
[cpp]view plaincopy
  1. //PS2鍵盤測試程序,可換行,按shift不放接著輸入
  2. //可輸出大寫,按下CAPS輸出大寫,再次按下輸出小寫
  3. //此程序只用來測試,代碼冗余,僅供參考,可根據(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鍵沒按下譯碼表
  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為位計數(shù)值;ascii為翻譯后的ASCII碼,初值為空格
  153. u8hang=0,lie=0;//彩屏顯示位置
  154. intmain(void)
  155. {
  156. Stm32_Clock_Init(9);//系統(tǒng)時鐘設置
  157. delay_init(72);//延時初始化
  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. 返回值:無
  177. ********************************************/
  178. voidDecode(u8scancode)
  179. {
  180. staticu8up=0,shift=0;//up為通、斷碼標志,shift為shift鍵按下標志
  181. u8i;
  182. if(!up)//已接收的11位數(shù)據(jù)是通碼(up為0)
  183. {
  184. switch(scancode)//開始翻譯掃描碼
  185. {
  186. case0xF0://鍵盤釋放標志(隨后的一個字節(jié)是斷碼)
  187. up=1;//設置up為斷碼標志
  188. break;
  189. case0x12://左shift鍵按下
  190. shift=1;//設置shift為按下標志
  191. break;
  192. case0x59://右shift鍵按下
  193. shift=1;//設置shift為按下標志
  194. break;
  195. case0x58://CAPS鍵按下處理
  196. shift=(shift==0)?1:0;//shift取反
  197. break;
  198. case0x66://backspace鍵按下時處理
  199. //backspace鍵按下時處理
  200. break;
  201. case0x5a://回車鍵按下時處理:換行
  202. ascii=;
  203. hang=0;
  204. lie=lie+16;
  205. break;
  206. default:
  207. if(!shift)//如果shift鍵沒有按下
  208. {//查找unshifted表,表中左列是掃描碼,右列是對應的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;//將斷碼標志復位
  231. switch(scancode)//檢測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://m.butianyuan.cn/article/201611/320430.htm

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

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



評論


技術專區(qū)

關閉