stm32_ps2键盘显示测试程序
时间:11-23
来源:互联网
点击:
[cpp]view plaincopy
- //PS2键盘测试程序,可换行,按shift不放接着输入
- //可输出大写,按下CAPS输出大写,再次按下输出小写
- //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减
- //PA13->PS2.CLKPA15->PS2.DATA
- #includestm32f10x_lib.h>
- #include"sys.h"
- #include"usart.h"
- #include"delay.h"
- #include"led.h"
- #include"key.h"
- #include"exti.h"
- #include"wdg.h"
- #include"timer.h"
- #include"lcd.h"
- constu8unshifted[][2]=//shift键没按下译码表
- {
- 0x0e,`,
- 0x15,q,
- 0x16,1,
- 0x1a,z,
- 0x1b,s,
- 0x1c,a,
- 0x1d,w,
- 0x1e,2,
- 0x21,c,
- 0x22,x,
- 0x23,d,
- 0x24,e,
- 0x25,4,
- 0x26,3,
- 0x29,,
- 0x2a,v,
- 0x2b,f,
- 0x2c,t,
- 0x2d,r,
- 0x2e,5,
- 0x31,n,
- 0x32,b,
- 0x33,h,
- 0x34,g,
- 0x35,y,
- 0x36,6,
- 0x39,,,
- 0x3a,m,
- 0x3b,j,
- 0x3c,u,
- 0x3d,7,
- 0x3e,8,
- 0x41,,,
- 0x42,k,
- 0x43,i,
- 0x44,o,
- 0x45,0,
- 0x46,9,
- 0x49,.,
- 0x4a,/,
- 0x4b,l,
- 0x4c,;,
- 0x4d,p,
- 0x4e,-,
- 0x52,,
- 0x54,[,
- 0x55,=,
- 0x5b,],
- 0x5d,\,
- 0x61,<,
- 0x69,1,
- 0x6b,4,
- 0x6c,7,
- 0x70,0,
- 0x71,.,
- 0x72,2,
- 0x73,5,
- 0x74,6,
- 0x75,8,
- 0x79,+,
- 0x7a,3,
- 0x7b,-,
- 0x7c,*,
- 0x7d,9,
- 0,0
- };
- constu8shifted[][2]=//shift键按下译码表
- {
- 0x0e,~,
- 0x15,Q,
- 0x16,!,
- 0x1a,Z,
- 0x1b,S,
- 0x1c,A,
- 0x1d,W,
- 0x1e,@,
- 0x21,C,
- 0x22,X,
- 0x23,D,
- 0x24,E,
- 0x25,$,
- 0x26,#,
- 0x29,,
- 0x2a,V,
- 0x2b,F,
- 0x2c,T,
- 0x2d,R,
- 0x2e,%,
- 0x31,N,
- 0x32,B,
- 0x33,H,
- 0x34,G,
- 0x35,Y,
- 0x36,^,
- 0x39,L,
- 0x3a,M,
- 0x3b,J,
- 0x3c,U,
- 0x3d,&,
- 0x3e,*,
- 0x41,<,
- 0x42,K,
- 0x43,I,
- 0x44,O,
- 0x45,),
- 0x46,(,
- 0x49,>,
- 0x4a,?,
- 0x4b,L,
- 0x4c,:,
- 0x4d,P,
- 0x4e,_,
- 0x52,",
- 0x54,{,
- 0x55,+,
- 0x5b,},
- 0x5d,|,
- 0x61,>,
- 0x69,1,
- 0x6b,4,
- 0x6c,7,
- 0x70,0,
- 0x71,.,
- 0x72,2,
- 0x73,5,
- 0x74,6,
- 0x75,8,
- 0x79,+,
- 0x7a,3,
- 0x7b,-,
- 0x7c,*,
- 0x7d,9,
- 0,0
- };
- voidDecode(u8scancode);//声明函数原型
- u8bitcount=11,ascii=;//bitcount为位计数值;ascii为翻译后的ASCII码,初值为空格
- u8hang=0,lie=0;//彩屏显示位置
- intmain(void)
- {
- Stm32_Clock_Init(9);//系统时钟设置
- delay_init(72);//延时初始化
- uart_init(72,9600);//串口1初始化
- EXTIX_Init();
- LED_Init();
- LCD_Init();
- LCD_Clear(YELLOW);
- POINT_COLOR=RED;
- BACK_COLOR=YELLOW;
- while(1)
- {
- if(hang>=240)//换行
- {hang=0;lie+=16;if(lie>=320)lie=0;}
- LCD_ShowChar(hang,lie,ascii,16,0);//显示键盘字符
- }
- }
- /*******************************************
- 函数名称:Decode
- 功能:
- 参数:scancode--需要翻译的扫描码
- 返回值:无
- ********************************************/
- voidDecode(u8scancode)
- {
- staticu8up=0,shift=0;//up为通、断码标志,shift为shift键按下标志
- u8i;
- if(!up)//已接收的11位数据是通码(up为0)
- {
- switch(scancode)//开始翻译扫描码
- {
- case0xF0://键盘释放标志(随后的一个字节是断码)
- up=1;//设置up为断码标志
- break;
- case0x12://左shift键按下
- shift=1;//设置shift为按下标志
- break;
- case0x59://右shift键按下
- shift=1;//设置shift为按下标志
- break;
- case0x58://CAPS键按下处理
- shift=(shift==0)?1:0;//shift取反
- break;
- case0x66://backspace键按下时处理
- //backspace键按下时处理
- break;
- case0x5a://回车键按下时处理:换行
- ascii=;
- hang=0;
- lie=lie+16;
- break;
- default:
- if(!shift)//如果shift键没有按下
- {//查找unshifted表,表中左列是扫描码,右列是对应的ASCII码
- for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);
- if(unshifted[i][0]==scancode)
- {
- ascii=unshifted[i][1];
- hang=hang+8;
- }
- }
- else//如果shift键按下
- {//查找shifted表
- for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);
- if(shifted[i][0]==scancode)
- {
- ascii=shifted[i][1];
- hang=hang+8;
- }
- }
- break;
- }
- }
- else//已接收的11位数据是断码(up为1)
- {
- up=0;//将断码标志复位
- switch(scancode)//检测shift键释放
- {
- case0x12://左shift键
- shift=0;
- break;
- case0x59://右shift键
- shift=0;
- break;
- default:
- break;
- }
- }
- }
此外还需修改中断文件夹中的两个函数
[cpp]view plaincopy
- voidEXTIX_Init(void)
- {
- RCC->APB2ENR|=1<2;//使能PORTA时钟
- JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
- GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
- GPIOA->CRL|=0X00000008;
- GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
- GPIOA->CRH|=0X80800000;
- GPIOA->ODR|=1<13;//PA13上拉,PA0默认下拉
- GPIOA->ODR|=1<15;//PA15上拉
- Ex_NVIC_Config(GPIO_A,0,RTIR);//上升沿触发
- //Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发
- Ex_NVIC_Config(GPIO_A,15,FTIR|RTIR);//下降、上升沿触发
- MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
- MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,
stm32ps2键盘显示测 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)