微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32_ps2键盘显示测试程序

stm32_ps2键盘显示测试程序

时间:11-23 来源:互联网 点击:
[cpp]view plaincopy

  1. //PS2键盘测试程序,可换行,按shift不放接着输入
  2. //可输出大写,按下CAPS输出大写,再次按下输出小写
  3. //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减
  4. //PA13->PS2.CLKPA15->PS2.DATA
  5. #includestm32f10x_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);//声明函数原型
  152. u8bitcount=11,ascii=;//bitcount为位计数值;ascii为翻译后的ASCII码,初值为空格
  153. u8hang=0,lie=0;//彩屏显示位置
  154. intmain(void)
  155. {
  156. Stm32_Clock_Init(9);//系统时钟设置
  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. 函数名称:Decode
  174. 功能:
  175. 参数:scancode--需要翻译的扫描码
  176. 返回值:无
  177. ********************************************/
  178. voidDecode(u8scancode)
  179. {
  180. staticu8up=0,shift=0;//up为通、断码标志,shift为shift键按下标志
  181. u8i;
  182. if(!up)//已接收的11位数据是通码(up为0)
  183. {
  184. switch(scancode)//开始翻译扫描码
  185. {
  186. case0xF0://键盘释放标志(随后的一个字节是断码)
  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位数据是断码(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. }

此外还需修改中断文件夹中的两个函数

[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);//上升沿触发
  12. //Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
  13. Ex_NVIC_Config(GPIO_A,15,FTIR|RTIR);//下降、上升沿触发
  14. MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
  15. MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top