datasheet

利用中断实现的4*4矩阵键盘扫描

2019-08-16来源: eefocus关键字:中断  4*4矩阵键盘  扫描


#include

#include

typedef unsigned char UINT8;

typedef unsigned int UINT16;

 

UINT8 num = 0, temp = 0, key = 16, t0 = 0, t1 = 0, shu = 0;

 

/* 数码管编码 */

 

UINT8 code table[]=

{

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00

};

 

/* 初始化函数 */

void init()

{

P1 = 0xf0;

/* 初始化定时器 */

TMOD = 0x01; /* 定时器0和定时器1同时设置为16位定时方式 */

TH0 = (65536 - 50000) / 256;   // 放在高八位当中 

TL0 = (65536 - 50000) % 256;

EA = 1; //开总中断

ET0 = 1; //开定时器0中断

TR0 =1; //启动定时器0

}

 

/* 显示函数 */

/* 按键扫描函数 */

UINT8 scan_key()

{

P1 = 0xef;

temp = P1;

temp = temp&0xf0;

if (temp != 0xf0)

{

temp = P1;

switch(temp)

{

  case 0xee:

   key=0;

   break;

  case 0xed:

   key=1;

   break;

  case 0xeb:

   key=2;

   break;

  case 0xe7:

   key=3;

   break;

  default:   

  break;

}

P1=0xfe;

}

P1 = 0xdf;

temp = P1;

temp = temp&0x0f;

if(temp != 0x0f)

{

temp = P1;

switch(temp)

{

  case 0xde:

   key = 4;

   break;

  case 0xdd:

   key = 5;

   break;

  case 0xdb:

   key = 6;

   break;

  case 0xd7:

   key = 7;

   break;

  default:

  break;

}

}

P1 = 0xbf;

temp = P1;

temp = temp&0x0f;

if(temp != 0x0f)

{

temp = P1;

switch(temp)

{

  case 0xbe:

   key = 8;

   break;

 

  case 0xbd:

   key = 9;

   break;

 

  case 0xbb:

   key = 10;

   break;

 

  case 0xb7:

   key = 11;

   break;

  default:

   break;

}

}

P1 = 0x7f;

temp = P1;

temp = temp&0x0f;

if(temp != 0x0f)

{   

temp = P1;

switch(temp)

{

  case 0x7e:

   key = 12;

   break;

 

  case 0x7d:

   key = 13;

   break;

 

  case 0x7b:

   key = 14;

   break;

 

  case 0x77:

   key = 15;

   break;

  

  default:

  break;

}

}

return key;

}

 

/* 显示函数 */

void display(unsigned char num)

{

     P0 = table[num];

}

 

/* 定时器0的中断 */

void timer0() interrupt 1

{

/* 装初值 */

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

t0++;

display(key);

if ( t0 == 1)

{

t0 = 0;

key = scan_key();

P1 = 0x00;

}

}

 

void main()

{

init();

while(1)

{

;

}

}

关键字:中断  4*4矩阵键盘  扫描

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471312.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:共阴极数码管的显示刷新
下一篇:单片机读入4*4矩阵键盘

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

8.STM32之EXIT外部中断

每个IO口都可以作为一个外部中断输入,但只有7条外部中断线。流程:1.时钟使能2.GPIO配置3.IO口和中断线的映射4.NVIC设置,使能5.中断服务函数的处理6.进入中断后即可清除中断标志位#include <exti_con.h>#include <stm32f4xx_exti.h>#include <key.h>#include <delay.h>#include <led.h> void EXTI_Con(){ RCC_APB2PeriphResetCmd(RCC_APB2Periph_EXTIT,ENABLE); Key_Init
发表于 2019-08-16

6.中断优先级分组NVIC

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) typedef struct NVIC_InitTypeDef{uint8_t NVIC_IRQChannel; //中断通道uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级uint8_t NVIC_IRQChannelSubPriority;   //响应优先级FunctionalState
发表于 2019-08-16

初探STM32 SPI2中断接收多组数据的处理方式

一、描述        两块STM32板子之间进行SPI通讯,都使用的是SPI2。主机连续发送多组数据(数据的格式为半字,即16位),从机采用SPI2中断方式接受主机发过来的多组数据。针对从机中断接受方法我尝试了两种方案:方案一:从机每接收主机发来的一组数据就进入中断一次,即主机发来几组数据从机就进入几次中断。方案二:仅当主机发来第一组数据时,从机才触发一次中断,然后关闭中断,以循环接受的方式接受主机发过来的剩下几组数据,当所有数据接受完后,再打开从机的接受中断。二、程序        因为两种方案的主机程序是一样的,如下:uint16_t 
发表于 2019-08-15

STM32F103做从机SPI通信SPI3中断异常

在做AM335D板子与STM32F103使用SPI通信时,需要用到STM32的从机模式,所以特别对于ST的从机模式进行了研究,由于硬件上使用的是STM32F103的SPI3,所以过程中遇到了一点麻烦,这里记录一下过程,以备查阅:使用SPI3通信时,从机时钟产生不了中断,经过查阅资料,是因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下两点就可以了:1.开启GPIO时钟的同时,开启AFIO时钟,如下:RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE ); 
发表于 2019-08-15

STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

的特别需要注意的是GPIO_IRQ的配置:GPIO mode 要选External Interrupt Mode 而不是External Event Mode(默认是选了这个,必须要手动选回来!!)使能并且设置中断的优先级把init as a pair of .c/.h勾上就不会出现把引脚初始化的代码全填到main.c里,都懂的生成IAR的项目了,点开就可以开写了,很方便(IAR在配置,编译,Debug时都非常好,但是Editor没有完善的自动补全功能,所以在生成项目时,可以再生成一个Keil的项目,在Keil里编程比较舒服)Stm32的Flash刷写的寿命是有限的,听说是1K次,所以在SRAM中调试学习变得非常必要,只需要
发表于 2019-08-15
STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

基于stm32f103的矩阵键盘

我现在的任务是做一个8*8的矩阵键盘,制PCB版之前,我用电路板搭了一个3*3的矩阵键盘来模拟一下,设置PA0、PA1、PA2为PP输出,设置P3、P4、P5下拉输入。大多数的芯片内部上拉或下拉电阻都是弱上拉或弱下拉,stm32f103的内部也一样,内部上拉或下拉的电阻阻值约为40K,这样可以方便外部调整,但是,在作为一些通讯引脚时,可能会出现上电时数据不稳定的问题,如I2C通讯,解决的办法是在外部在加上一个较强的上拉或下拉即可。具体程序如下:#include <stm32f10x.h>#include "usart.h"void KeyBoard_Init(void)//按键初始化
发表于 2019-08-16

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved