datasheet

单片机之矩阵键盘的驱动程序

2019-08-15来源: eefocus关键字:单片机  矩阵键盘  驱动程序


#include

 

#define KEYPORT P1

#include "./delay/delay.h"

 

sbit seg_select = P2^0;      //段选

sbit bit_select = P2^1;      //位选

#define SEGPORT  P0

 

 

unsigned char segdata[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char TempData[2];

 

void display(void)

{

  static unsigned char i = 0;

  SEGPORT = 0x0;              //消除重影

  seg_select = 1;

  seg_select = 0;

  

  SEGPORT = 0xff;

  bit_select = 1;

  bit_select = 0;

  SEGPORT = TempData[i];

  seg_select = 1;

  seg_select = 0;

  

  SEGPORT = bitdata[i];

  bit_select = 1;

  bit_select = 0;

  

    i++;

    if(2 == i)

    {

i = 0;

}

}

 

void timer0_init(void)                       //中断函数

{

EA = 1;                               //打开总中断

  TMOD |= 0x01;                        //设置定时器工作方式

  TH0 = (65536 - 2000) / 256;

  TL0 = (65536 - 2000) % 256;

  ET0 = 1;                           //打开定时器中断允许

  TR0 = 1;                           

}

 

void timer0_isr(void) interrupt 1    //中断服务程序

{

TH0 = (65536 - 2000) / 256;

  TL0 = (65536 - 2000) % 256;

  display();

  

}

 

 

unsigned char key_scan(void)

{

unsigned char keyvalue;

  KEYPORT = 0xf0;

  if(0xf0 != KEYPORT)                                // 有按键按下  

{

delay_ms(10);

  if(0xf0 != KEYPORT)                          //确实有按键按下

{

  //KEYPORT &= 0xfo;

KEYPORT = 0xfe;

  if(0xfe != KEYPORT)

{

keyvalue = KEYPORT;

  while(0xfe != KEYPORT);           //有按键抬起

delay_ms(10);

while(0xfe != KEYPORT);          //确实有按键抬起

return keyvalue;

}

KEYPORT = 0xfd;

if(0xfd != KEYPORT)

{

 

}

KEYPORT = 0xfb;

if(0xfb != KEYPORT)

{

 

}

KEYPORT = 0xf7;

if(0xf7 != KEYPORT)

{

 

}

}

}

return 0xff;

}

 

unsigned key_prc()

{

unsigned char keynum;

  keynum = key_scan();

  switch(keynum)

{

case 0x7e: return 0; break;

  case 0xbe: return 1; break;

  case 0xde: return 2; break;

  case 0xee: return 3; break;

  default: return 0xff; break;

}

}

 

void main()

{

unsigned char key;

timer0_init();

  while(1)

{

key = key_prc();

  if(0xff != key)

{

  TempData[0] = segdata[key / 16];

  TempData[1] = segdata[key % 16];

}

}

}

 

/*********delay.c*******/

void delay_us(unsigned char t)

{

while(--t);

}

 

void delay_ms(unsigned char t)

{

while(t--)

{

delay_us(245);

delay_us(245);

}

}

 

void delay_s(unsigned char t)

{

    while(t--)

{

        delay_ms(200);

delay_ms(200);

  delay_ms(200);

delay_ms(200);

  delay_ms(200);

}

}

 

/*******delay.h******/

#ifndef _DELAY_H_

#define _DELAY_H_

 

extern void delay_us(unsigned char t);

extern void delay_ms(unsigned char t);

extern void delay_s(unsigned char t);

 

#endif


关键字:单片机  矩阵键盘  驱动程序

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

上一篇:单片机码表的驱动程序
下一篇:单片机之利用按键来使数码管上两位示数增加

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

推荐阅读

矩阵键盘扫描原理详解——单片机

键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10
发表于 2019-08-16

单片机读入4*4矩阵键盘

一、什么是矩阵键盘矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4*4和8*8,其中用的最多的是4*4。网上搜了两张实物图,大家可以看看看上图就知道,4*4键盘还是很多地方用到的吧^_^二、矩阵键盘的原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通
发表于 2019-08-16
单片机读入4*4矩阵键盘

利用单片机的数码管模拟时钟的显示时间

#include <reg52.h> #define SEGPORT P0sbit seg_select = P2^1;        sbit bit_select = P2^0;           unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};               unsigned char
发表于 2019-08-15

单片机之利用按键来使数码管上两位示数增加

#include <reg52.h>#include "./delay/delay.h" sbit seg_select = P2^1;sbit bit_select = P2^0;sbit key1 = P1^0;  #define SEGPORT  P0  unsigned char segdata[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char bitdata[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
发表于 2019-08-15

单片机码表的驱动程序

#include <reg52.h>#include "./delay/delay.h" #define SEGPORT P0 sbit start = P1^0;sbit end = P1^1;sbit seg_select = P2^1;        sbit bit_select = P2^0;           unsigned char flag = 1;unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,
发表于 2019-08-15

基于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