- //PS2键盘测试程序,可换行,按shift不放接着输入
- //可输出大写,按下CAPS输出大写,再次按下输出小写
- //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减
- //PA13->PS2.CLK PA15->PS2.DATA
- #include
- #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;
- }
- }
- }
此外还需修改中断文件夹中的两个函数
- 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上的中断标志位
- }
上一篇:STM32GPIO——快速IO的使用
下一篇:STM32入门笔记(1)——时钟
推荐阅读最新更新时间:2024-03-16 14:43
设计资源 培训 开发板 精华推荐
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸
- 千丘智能侍淳博:用数字疗法,点亮“孤独症”儿童的光
- 数药智能冯尚:ADHD数字疗法正为儿童“多动症”提供更有效便捷服务
- Vicor高性能电源模块助力低空航空电子设备和 EVTOL的发展
- 创实技术electronica 2024首秀:加速国内分销商海外拓展之路