您的位置 首页 软件

stm32_ps2键盘显现测验程序

[cpp]viewplaincopyPS2键盘测试程序,可换行,按shift不放接着输入可输出大写,按下CAPS输出大写,再次按下输出小写此程序只用来测

[cpp]view plaincopy

  1. //PS2键盘测验程序,可换行,按shift不放接着输入
  2. //可输出大写,按下CAPS输出大写,再次按下输出小写
  3. //此程序只用来测验,代码冗余,仅供参考,可根据需求自行删减
  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);//声明函数原型
  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,组2
  16. }
  17. //外部中止15~10服务程序
  18. voidEXTI15_10_IRQHandler(void)
  19. {
  20. staticu8data;//声明部分静态变量来保存扫描码
  21. if(!PAin(15))//假如是下降沿触发中止
  22. {
  23. if(bitcount<11&&bitcount>2)//3到10位是数据,开始位,校验位和中止位疏忽
  24. {
  25. data=(data>>1);//右移保存数据
  26. if(PAin(13)&0x01)
  27. {
  28. data|=0x80;//存储一个1
  29. }
  30. }
  31. }
  32. else//假如是上升沿触发中止
  33. {
  34. if(–bitcount==0)//假如11位悉数接纳结束
  35. {
  36. Decode(data);//将扫描码翻译成ASCII码
  37. bitcount=11;//从头设为11位数据
  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. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/261415.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部