新聞中心

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

        stm32_ps2鍵盤顯示測試程序

        作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
        [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為位計(jì)數(shù)值;ascii為翻譯后的ASCII碼,初值為空格
        153. u8hang=0,lie=0;//彩屏顯示位置
        154. intmain(void)
        155. {
        156. Stm32_Clock_Init(9);//系統(tǒng)時鐘設(shè)置
        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為通、斷碼標(biāo)志,shift為shift鍵按下標(biāo)志
        181. u8i;
        182. if(!up)//已接收的11位數(shù)據(jù)是通碼(up為0)
        183. {
        184. switch(scancode)//開始翻譯掃描碼
        185. {
        186. case0xF0://鍵盤釋放標(biāo)志(隨后的一個字節(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鍵按下時處理
        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表,表中左列是掃描碼,右列是對應(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)//檢測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.104case.com/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);//關(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)先級2,組2
        15. MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//搶占2,子優(yōu)先級1,組2
        16. }
        17. //外部中斷15~10服務(wù)程序
        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ù),起始位,校驗(yàn)位和停止位忽略
        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;//重新設(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鍵盤顯示測

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 铜鼓县| 淮阳县| 六盘水市| 铜梁县| 师宗县| 肥东县| 双流县| 三都| 巨鹿县| 曲阜市| 长寿区| 营口市| 永德县| 大连市| 论坛| 娄烦县| 乡城县| 高尔夫| 黄陵县| 祁阳县| 天等县| 巴彦县| 肥西县| 基隆市| 巩义市| 灵丘县| 孙吴县| 九龙城区| 杭锦旗| 静宁县| 牡丹江市| 金山区| 娱乐| 曲麻莱县| 苗栗市| 聂荣县| 太康县| 台湾省| 太和县| 沅江市| 枣庄市|