[cpp]view plaincopy
- //PS2键盘测验程序,可换行,按shift不放接着输入
- //可输出大写,按下CAPS输出大写,再次按下输出小写
- //此程序只用来测验,代码冗余,仅供参考,可根据需求自行删减
- //PA13->PS2.CLKPA15->PS2.DATA
- #include<stm32f10x_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,组2
- }
- //外部中止15~10服务程序
- voidEXTI15_10_IRQHandler(void)
- {
- staticu8data;//声明部分静态变量来保存扫描码
- if(!PAin(15))//假如是下降沿触发中止
- {
- if(bitcount<11&&bitcount>2)//3到10位是数据,开始位,校验位和中止位疏忽
- {
- data=(data>>1);//右移保存数据
- if(PAin(13)&0x01)
- {
- data|=0x80;//存储一个1
- }
- }
- }
- else//假如是上升沿触发中止
- {
- if(–bitcount==0)//假如11位悉数接纳结束
- {
- Decode(data);//将扫描码翻译成ASCII码
- bitcount=11;//从头设为11位数据
- }
- }
- //delay_ms(10);//消抖
- //if(KEY0==0)//按键0
- //{
- //LED0=!LED0;
- //}elseif(KEY1==0)//按键1
- //{
- //LED1=!LED1;
- //}
- //EXTI->PR=1<<13;//铲除LINE13上的中止标志位
- EXTI->PR=1<<15;//铲除LINE15上的中止标志位
- }