stm32_ps2键盘显示测试程序

发布者:脑电风暴最新更新时间:2015-09-09 来源: eefocus关键字:stm32  ps2键盘显示  测试程序 手机看文章 扫描二维码
随时随地手机看文章
  1. //PS2键盘测试程序,可换行,按shift不放接着输入  
  2. //可输出大写,按下CAPS输出大写,再次按下输出小写  
  3. //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减  
  4. //PA13->PS2.CLK  PA15->PS2.DATA  
  5.   
  6. #include   
  7. #include "sys.h"  
  8. #include "usart.h"        
  9. #include "delay.h"    
  10. #include "led.h"   
  11. #include "key.h"  
  12. #include "exti.h"  
  13. #include "wdg.h"  
  14. #include "timer.h"  
  15. #include "lcd.h"         
  16.   
  17. const u8 unshifted[][2]=            //shift键没按下译码表  
  18.         
  19.   0x0e,'`',  
  20.   0x15,'q',  
  21.   0x16,'1',  
  22.   0x1a,'z',  
  23.   0x1b,'s',  
  24.   0x1c,'a',  
  25.   0x1d,'w',  
  26.   0x1e,'2',  
  27.   0x21,'c',  
  28.   0x22,'x',  
  29.   0x23,'d',  
  30.   0x24,'e',  
  31.   0x25,'4',  
  32.   0x26,'3',  
  33.   0x29,' ',  
  34.   0x2a,'v',  
  35.   0x2b,'f',  
  36.   0x2c,'t',  
  37.   0x2d,'r',  
  38.   0x2e,'5',  
  39.   0x31,'n',  
  40.   0x32,'b',  
  41.   0x33,'h',  
  42.   0x34,'g',  
  43.   0x35,'y',  
  44.   0x36,'6',  
  45.   0x39,',',  
  46.   0x3a,'m',  
  47.   0x3b,'j',  
  48.   0x3c,'u',  
  49.   0x3d,'7',  
  50.   0x3e,'8',  
  51.   0x41,',',  
  52.   0x42,'k',  
  53.   0x43,'i',  
  54.   0x44,'o',  
  55.   0x45,'0',  
  56.   0x46,'9',  
  57.   0x49,'.',  
  58.   0x4a,'/',  
  59.   0x4b,'l',  
  60.   0x4c,';',  
  61.   0x4d,'p',  
  62.   0x4e,'-',  
  63.   0x52,''',  
  64.   0x54,'[',  
  65.   0x55,'=',  
  66.   0x5b,']',  
  67.   0x5d,'\',  
  68.   0x61,'<',  
  69.   0x69,'1',  
  70.   0x6b,'4',  
  71.   0x6c,'7',  
  72.   0x70,'0',  
  73.   0x71,'.',  
  74.   0x72,'2',  
  75.   0x73,'5',  
  76.   0x74,'6',  
  77.   0x75,'8',  
  78.   0x79,'+',  
  79.   0x7a,'3',  
  80.   0x7b,'-',  
  81.   0x7c,'*',  
  82.   0x7d,'9',  
  83.   0,0  
  84. };  
  85. const u8 shifted[][2]=      //shift键按下译码表  
  86.  
  87.   0x0e,'~',  
  88.   0x15,'Q',  
  89.   0x16,'!',  
  90.   0x1a,'Z',  
  91.   0x1b,'S',  
  92.   0x1c,'A',  
  93.   0x1d,'W',  
  94.   0x1e,'@',  
  95.   0x21,'C',  
  96.   0x22,'X',  
  97.   0x23,'D',  
  98.   0x24,'E',  
  99.   0x25,'$',  
  100.   0x26,'#',  
  101.   0x29,' ',  
  102.   0x2a,'V',  
  103.   0x2b,'F',  
  104.   0x2c,'T',  
  105.   0x2d,'R',  
  106.   0x2e,'%',  
  107.   0x31,'N',  
  108.   0x32,'B',  
  109.   0x33,'H',  
  110.   0x34,'G',  
  111.   0x35,'Y',  
  112.   0x36,'^',  
  113.   0x39,'L',  
  114.   0x3a,'M',  
  115.   0x3b,'J',  
  116.   0x3c,'U',  
  117.   0x3d,'&',  
  118.   0x3e,'*',  
  119.   0x41,'<',  
  120.   0x42,'K',  
  121.   0x43,'I',  
  122.   0x44,'O',  
  123.   0x45,')',  
  124.   0x46,'(',  
  125.   0x49,'>',  
  126.   0x4a,'?',  
  127.   0x4b,'L',  
  128.   0x4c,':',  
  129.   0x4d,'P',  
  130.   0x4e,'_',  
  131.   0x52,'"',  
  132.   0x54,'{',  
  133.   0x55,'+',  
  134.   0x5b,'}',  
  135.   0x5d,'|',  
  136.   0x61,'>',  
  137.   0x69,'1',  
  138.   0x6b,'4',  
  139.   0x6c,'7',  
  140.   0x70,'0',  
  141.   0x71,'.',  
  142.   0x72,'2',  
  143.   0x73,'5',  
  144.   0x74,'6',  
  145.   0x75,'8',  
  146.   0x79,'+',  
  147.   0x7a,'3',  
  148.   0x7b,'-',  
  149.   0x7c,'*',  
  150.   0x7d,'9',  
  151.   0,0  
  152. };  
  153.   
  154. void Decode(u8 scancode);// 声明函数原型  
  155. u8 bitcount=11,ascii=' ';   // bitcount为位计数值;ascii为翻译后的ASCII码,初值为空格  
  156. u8 hang=0,lie=0;  //彩屏显示位置  
  157.   
  158. int main(void)  
  159.         
  160.   Stm32_Clock_Init(9);//系统时钟设置  
  161.     delay_init(72);     //延时初始化  
  162.     uart_init(72,9600); //串口1初始化    
  163.     EXTIX_Init();  
  164.     LED_Init();  
  165.     LCD_Init();  
  166.     LCD_Clear(YELLOW);  
  167.       
  168.     POINT_COLOR=RED;  
  169.     BACK_COLOR=YELLOW;  
  170.       
  171.   while(1)   
  172.                 
  173.         if(hang>=240) //换行  
  174.         {hang=0;lie+=16;if(lie>=320)lie=0;}   
  175.         LCD_ShowChar(hang,lie,ascii,16,0);      // 显示键盘字符  
  176.                                                     
  177.  
  178.   
  179.   
  180. void Decode(u8 scancode)  
  181.  
  182.  static u8 up=0,shift=0;    //up为通、断码标志,shift为shift键按下标志  
  183.  u8 i;  
  184.  if (!up)          //已接收的11位数据是通码(up为0)  
  185.   
  186.   switch (scancode)//开始翻译扫描码  
  187.    
  188.    case 0xF0:      //键盘释放标志(随后的一个字节是断码)  
  189.         up=1;      //设置up为断码标志  
  190.         break;  
  191.    case 0x12:      //左shift键按下  
  192.         shift=1;   //设置shift为按下标志  
  193.         break;  
  194.    case 0x59:      //右shift键按下  
  195.         shift=1;   //设置shift为按下标志  
  196.         break;     
  197.      case 0x58:  //CAPS键按下处理  
  198.           shift=(shift==0)?1:0;//shift取反  
  199.             break;  
  200.      case 0x66: // backspace键按下时处理  
  201.             //backspace键按下时处理  
  202.             break;  
  203.      case 0x5a:// 回车键按下时处理:换行  
  204.             ascii=' ';  
  205.             hang=0;  
  206.             lie=lie+16;  
  207.             break;  
  208.    default:          
  209.         if(!shift)            //如果shift键没有按下  
  210.                             //查找unshifted表,表中左列是扫描码,右列是对应的ASCII码  
  211.            for(i=0;unshifted[i][0]!=scancode&&unshifted[i][0];i++);  
  212.            if(unshifted[i][0]==scancode)   
  213.             
  214.             ascii=unshifted[i][1];  
  215.                      hang=hang+8;  
  216.             
  217.           
  218.         else                  //如果shift键按下  
  219.                             //查找shifted表  
  220.            for(i=0;shifted[i][0]!=scancode&&shifted[i][0];i++);  
  221.            if(shifted[i][0]==scancode)   
  222.             
  223.             ascii=shifted[i][1];  
  224.                       hang=hang+8;  
  225.             
  226.             
  227.         break;  
  228.    
  229.    
  230.  else                   //已接收的11位数据是断码(up为1)  
  231.   
  232.   up 0;               //将断码标志复位  
  233.   switch (scancode)     //检测shift键释放  
  234.    
  235.    case 0x12          //左shift键  
  236.         shift 0;  
  237.         break;  
  238.    case 0x59          //右shift键  
  239.         shift 0;  
  240.         break;  
  241.    default:  
  242.         break;  
  243.    
  244.   
  245.  

 

此外还需修改中断文件夹中的两个函数

  1. void EXTIX_Init(void)  
  2.  
  3.     RCC->APB2ENR|=1<<2;     //使能PORTA时钟  
  4.     JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD     
  5.   
  6.     GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入        
  7.     GPIOA->CRL|=0X00000008;     
  8.     GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入        
  9.     GPIOA->CRH|=0X80800000;                   
  10.     GPIOA->ODR|=1<<13;    //PA13上拉,PA0默认下拉  
  11.     GPIOA->ODR|=1<<15;    //PA15上拉  
  12.   
  13.     Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发  
  14.     //Ex_NVIC_Config(GPIO_A,13,FTIR);//下降沿触发  
  15.     Ex_NVIC_Config(GPIO_A,15,FTIR|RTIR);//下降、上升沿触发  
  16.   
  17.     MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2  
  18.     MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2      
  19.  
  20.   
  21. //外部中断15~10服务程序  
  22. void EXTI15_10_IRQHandler(void)  
  23.             
  24.       
  25.     static u8 data;   // 声明局部静态变量来保存扫描码  
  26.   if (!PAin(15))                // 如果是下降沿触发中断  
  27.    
  28.   if(bitcount 11 && bitcount 2)    //3到10位是数据,起始位,校验位和停止位忽略  
  29.     
  30.     data (data >> 1);                  //右移保存数据  
  31.     if(PAin(13)&0x01)  
  32.      
  33.       data|=0x80;                      //存储一个'1'  
  34.      
  35.    
  36.    
  37.  else                    //如果是上升沿触发中断  
  38.    
  39.   if(--bitcount==0)      //如果11位全部接收完毕  
  40.    
  41.    Decode(data);     //将扫描码翻译成ASCII码     
  42.    bitcount 11;        //重新设为11位数据  
  43.    
  44.   
  45. //  delay_ms(10);    //消抖              
  46. //  if(KEY0==0)      //按键0  
  47. //   
  48. //      LED0=!LED0;  
  49. //  }else if(KEY1==0)//按键1  
  50. //   
  51. //      LED1=!LED1;  
  52. //   
  53. //  EXTI->PR=1<<13;     //清除LINE13上的中断标志位    
  54.     EXTI->PR=1<<15;     //清除LINE15上的中断标志位    
  55.   

关键字:stm32  ps2键盘显示  测试程序 引用地址:stm32_ps2键盘显示测试程序

上一篇:LPC1114/LPC11U14和LPC1343对比学习(二)GPIO
下一篇:STM32F4xx FPU的设置

推荐阅读最新更新时间:2024-03-16 14:31

STM32速成笔记(9)—RTC
一、RTC简介 RTC(Real Ti me Clock) 实时时钟 ,它是一个独立的 定时器 。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供 时钟 日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置都是在后备区域,无论单片机处于何种状态,只要保证后备区正常 供电 ,RTC就会一直工作。 二、 STM32 的RTC 2.1 主要特性 • 可 编程 的预分频系数 :分频系数最高为2^20 • 32位的可编程计数器 ,可用于较长时间段的测量 • 可以选择以下三种RTC的时钟源 ─ HSE时钟除以128 ─ LSE 振荡器 时钟 ─ LSI振荡器时钟 • 3个专门的可屏蔽中断
[单片机]
<font color='red'>STM32</font>速成笔记(9)—RTC
STM32】HAL库-DAC
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。 DAC框图 DAC引脚 为了避免寄生的干扰和额外的功耗,引脚PA4或者PA5在之前应当设置成模拟输入(AIN)。 使能DAC 将DAC_CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间tWAKEUP,DAC通道x即被使能。 注意: ENx位只会使能DAC通道x的模拟部分,即便该位被置’0’,DAC通道x的数字部分仍然工作。 使能DAC输出缓存 DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓
[单片机]
【<font color='red'>STM32</font>】HAL库-DAC
基于stm32的超声波测距
首先来看模块图 在某宝上一搜就能找到,关于它的使用也是非常简单,先看数据手册里面需要注意的几点 1 基本的参数 在实际测试当中,最大测量三米多的距离还是可以,最小距离我没有做测试,我测的最小距离是50厘米,再往下没有继续测。 2 测距的基本原理 这里的基本原理其实应该是它的使用方法,如果你仔细看它的数据手册会发现这种测距模块还有另外一种使用方法:USART通信。 看文字不是很直观,简单粗暴来看图 在写程序的时候没有使用USART的方法,因为上图的这种驱动方式我认为比较简单,后面的程序也是按照这个时序图来编写的。 注意:上图中关于测距的公式,在程序中我没有使用他给的公式,这一
[单片机]
基于<font color='red'>stm32</font>的超声波测距
Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
概述 Windows下使用Keil MDK5进行 STM32F401 的开发和编译, 配合ST-LINK工具进行烧录, 使用硬件抽象库HAL. STM32F401硬件环境和连接 略, 与SPL环境相同 STM32F4 硬件抽象库 STM32F4xx_HAL_Driver 直接下载 STM32CubeF4 MCU 固件开发包 前往 https://github.com/STMicroelectronics/STM32CubeF4 点击Code - Download ZIP 文件比较大, 有接近300M, 解压备用 当前版本是v1.26.2. ST硬件抽象库HAL结构说明 STM32CubeF4Drivers 目录结构
[单片机]
STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法
1. 前言 bxCAN是STM32系列最稳定的IP核之一,无论有哪个新型号出来,这个IP核基本未变,可见这个IP核的设计是相当成熟的。本文所讲述的内容属于这个IP核的一部分,掌握了本文所讲内容,就可以很方便地适用于所有STM32系列中包含bxCAN外设的型号。有关bxCAN的过滤器部分的内容在参考手册中往往看得“不甚明白“,本文就过滤器的4种工作模式进行详细讲解并使用具体的代码进行演示,这些代码都进行过实测验证通过的,希望能给读者对于bxCAN过滤器有一个清晰的理解。 2. 准备工作 2.1. 为什么要过滤器? 在这里,我们可以将CAN总线看成一个广播消息通道,上面传输着各种类型的消息,好比报纸,有体育新闻,财经新闻,政治新
[单片机]
<font color='red'>STM32</font>的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法
STM32 FSMC的用法--LCD
1. LCD/LCM的基本概念 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。 LCM(LCD Module)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。 在平时的学习开发中,我们一般使用的是LCM,带有驱动IC和LCD屏幕等多个模块。 2. FSMC的基本概念 在STM32上开发LCD显示,可以有两种方式来对LCD进行操作,一种是通过普通的IO口,连接LCM的相应引脚来进行操作,
[单片机]
STM32系列第26篇--电容触摸屏
触摸屏分类: 电阻式:定位准确,单点触摸 电容感应式:电容感应式:支持多点触摸,价格偏贵。工业应用最广泛 红外线式:价格低廉,但其外框易碎,容易产生光干扰,曲面情况下失真 表面声波式:解决各种缺点,但是屏幕表面如果有水滴和尘土会使触摸屏变的迟钝 注:触摸屏本质上与液晶是分离的,触摸屏负责的是检测触摸点,液晶屏负责的是显示。区别开来;电容触摸屏一般都需要一个驱动IC来检测电容触摸,且一般是通过IIC接口输出触摸数据的。 常见的驱动IC: GT9147:采用17*10的驱动结构(10个感应通道,17个驱动通道) OTT2001A:采用13*8的驱动结构(8个感应通道,13个驱动通道) 注:它们与MCU连接通过4根线:
[单片机]
<font color='red'>STM32</font>系列第26篇--电容触摸屏
基于STM32的步进电机速度控制
项目需求 在制作一个使用全向轮的机器人底盘,对于全向轮,电机的精度是影响效果的重要因素。所以使用了步进电机,使用步进电机的优点是可以不使用编码器,开环控制即可达到高精度的效果。 调整占空比或者调整周期 众所周知,PWM有两个重要参数,周期与占空比。 步进电机的运动方式是,每收到一个脉冲,就旋转指定的角度。因此影响电机速度的唯一参数就是PWM的频率。以下附图两张来说明调整占空比与调整周期的区别。 周期固定,调整占空比 上图中有4个PWM,它们的周期是一样的,不同之处是拥有从80%至20%的占空比。可以看出,无论占空比为多少,在1s内,它们产生的高电平的数量是一样的,即无论占空比为多少,PWM的频率都一致。因此也就无法调整步进
[单片机]
基于<font color='red'>STM32</font>的步进电机速度控制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved