//PS2键盘测试程序,可换行,按shift不放接着输入 //可输出大写,按下CAPS输出大写,再次按下输出小写 //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减 //PA13->PS2.CLK PA15->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" const u8 unshifted[][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 }; const u8 shifted[][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 }; void Decode(u8 scancode);// 声明函数原型 u8 bitcount=11,ascii=' '; // bitcount为位计数值;ascii为翻译后的ASCII码,初值为空格 u8 hang=0,lie=0; //彩屏显示位置 int main(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--需要翻译的扫描码 返回值 : 无 ********************************************/ void Decode(u8 scancode) { static u8 up=0,shift=0; //up为通、断码标志,shift为shift键按下标志 u8 i; if (!up) //已接收的11位数据是通码(up为0) { switch (scancode)//开始翻译扫描码 { case 0xF0: //键盘释放标志(随后的一个字节是断码) up=1; //设置up为断码标志 break; case 0x12: //左shift键按下 shift=1; //设置shift为按下标志 break; case 0x59: //右shift键按下 shift=1; //设置shift为按下标志 break; case 0x58: //CAPS键按下处理 shift=(shift==0)?1:0;//shift取反 break; case 0x66: // backspace键按下时处理 //backspace键按下时处理 break; case 0x5a:// 回车键按下时处理:换行 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键释放 { case 0x12 : //左shift键 shift = 0; break; case 0x59 : //右shift键 shift = 0; break; default: break; } } } 此外还需修改中断文件夹中的两个函数[cpp] view plaincopy void EXTIX_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服务程序 void EXTI15_10_IRQHandler(void) { static u8 data; // 声明局部静态变量来保存扫描码 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; // }else if(KEY1==0)//按键1 // { // LED1=!LED1; // } // EXTI->PR=1<<13; //清除LINE13上的中断标志位 EXTI->PR=1<<15; //清除LINE15上的中断标志位 }
导读:目前正在解读《stm32_ps2键盘显示测试程序》的相关信息,《stm32_ps2键盘显示测试程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《stm32_ps2键盘显示测试程序》的详细说明。
简介:本文给大家分享了一个stm32_ps2键盘显示测试程序。
提醒:《stm32_ps2键盘显示测试程序》最后刷新时间 2024-03-14 00:57:55,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《stm32_ps2键盘显示测试程序》该内容的真实性请自行鉴别。