4X4键盘矩阵

发布者:genius5最新更新时间:2016-11-04 来源: eefocus关键字:4X4  键盘矩阵 手机看文章 扫描二维码
随时随地手机看文章
//实验目的:熟悉键盘矩阵的扫描方法

//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。
//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)
//无按键按下的时候显示FF 
//按键跟按键的扫描结果满足如下关系:
//   按键     扫描结果(result)        按键       扫描结果  
//   K10            0XE7                K18          0XB7
//   K11            0XEB                K19          0XBB
//   K12            0XED                K20          0XBD
//   K13            0XEE                K21          0XBE
//   K14            0XD7                K22          0X77
//   K15            0XDB                K23          0X7B
//   K16            0XDD                K24          0X7D
//   K17            0XDE                K25          0X7E

#include              //包含单片机内部资源预定义
 __CONFIG(0xf73a);        
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

 int  result;
 void  delay();              //delay函数申明
 void  init();               //I/O口初始化函数申明
 void  scan();               //按键扫描程序申明
 void  display(int x);       //显示函数申明
//---------------------------------------------------
                             //主程序  
void main()
{
  while(1)                   //循环工作
    {
      init();                //调用初始化子程序
      scan();                //调用按键扫描子程序
      display(result);       //调用结果显示子程序
    }
 }
 
//---------------------------------------------------
//初始化函数
void init() 
 {
  ADCON1=0X07;               //设置A口为普通I/O口
  TRISA=0X0f;                //设置A口高2位为输出,低4位为输入
  TRISC=0XF0;                //设置C口高4位为输入,低4位为输出
  TRISD=0X00;                //设置D口为输出
  PORTA=0XFF;              
  PORTD=0XFF;                //先清除所有显示
 }

//---------------------------------------------------
//按键扫描程序
void scan()
{
 PORTC=0XF7;                 //C3输出低电平,其他三位输出高电平
 asm("nop");                 //插入一定延时,确保电平稳定
 result=PORTC;               //读回C口高4位结果
 result=result&0xf0;         //清除低4位
 if(result!=0xf0)            //判断高4位是否为全1(全1代表没按键按下)?
   {
     result=result|0x07;     //否,加上低4位0x07,做为按键扫描的结果
   }
 else                        //是,改变低4位输出,重新判断是否有按键按下
   {
   PORTC=0XFb;               //C2输出低电平,其他三位输出高电平
   asm("nop");               //插入一定延时,确保电平稳定
   result=PORTC;             //读回C口高4位结果
   result=result&0xf0;       //清除低4位
   if(result!=0xf0)          //判断高4位是否为全1(全1代表没按键按下)
     {
     result=result|0x0b;     //否,加上低4位0xb,做为按键扫描的结果
     }
   else                      //是,改变低4位输出,重新扫描
       {
       PORTC=0XFd;           //C1输出低电平,其他三位输出高电平
       asm("nop");           //插入一定延时,确保电平稳定
       result=PORTC;         //读回C口高4位结果
       result=result&0xf0;   //清除低4位
       if(result!=0xf0)      //判断高4位是否为全1(全1代表没按键按下)
        {
        result=result|0x0d;  //否,加上低4位0x0d,做为按键扫描的结果
        }
       else                  //是,改变低4位的输出,重新扫描
          {
          PORTC=0XFe;        //C0输出低电平,其他三位输出高电平
          asm("nop");        //插入一定延时,确保电平稳定
          result=PORTC;      //读回C口高4位结果
          result=result&0xf0;//清除低4位
          if(result!=0xf0)   //判断高四位是否为全1(全1代表没有按键按下)
            {
             result=result|0x0e;//否,加上低4位0x0e,做为按键扫描的结果
            }
          else               //是,全部按键扫描结束,没有按键按下,置无按键按下标志位
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }   
          }      
      }
   }
 }

//----------------------------------------------------------
//显示程序
void   display(int x)
  {
   switch(result)                 
      {
       case 0xe7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;   //K10
       case 0xeb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;   //K11
       case 0xed:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;   //K12
       case 0xee:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;   //K13
       case 0xd7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;   //K14
       case 0xdb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;   //K15
       case 0xdd:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X82;PORTA=0X1F;delay();break;   //K16
       case 0xde:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0XF8;PORTA=0X1F;delay();break;   //K17
       case 0xb7:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X80;PORTA=0X1F;delay();break;   //K18
       case 0xbb:
                 PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X90;PORTA=0X1F;delay();break;   //K19
       case 0xbd:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;   //K20
       case 0xbe:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;   //K21
       case 0x77:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;   //K22
       case 0x7b:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;   //K23
       case 0x7d:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;   //K24
       case 0x7e:
                 PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;   //K25
       case 0xff:
                 PORTD=0x8e;PORTA=0X2F;delay(); PORTD=0x8e; PORTA=0X1F; delay();      //无按键按下
      }
   }

//------------------------------------------------------------------
//延时程序
void  delay()              //延时程序
    {
     int i;                 //定义整形变量
     for(i=0x100;i--;);     //延时
    }

关键字:4X4  键盘矩阵 引用地址:4X4键盘矩阵

上一篇:基本I/O口操作
下一篇:SPI串行通信模块应用(一)

推荐阅读最新更新时间:2024-03-16 15:19

3*5矩阵键盘(IO任意定义)
#include "reg51.h" #include "intrins.h" typedef unsigned char uint8; // 无符号8位整型变量 typedef signed char int8; // 有符号8位整型变量 typedef unsigned short uint16; // 无符号16位整型变量 typedef signed short int16; // 有符号16位整型变量 typedef unsigned int uint32; // 无符号32位整型变量 typedef
[单片机]
4×4矩阵键盘,控制数码管显示
题目要求: 两个数码管显示0-59秒的秒表。一矩阵键盘,输入0-F。 当A键按下后,进入修改时间状态,此时在分别按下0-9中的任意两个数,数码管时间更改。 如按下09,数码管此时显示09。 再按下A键,数码管从09继续跑。 写出C语言程序,端口随便接。 问题关键是如何实现A按下后,数码管秒数的改变。麻烦行家帮帮忙。非常感谢。 悬赏分:100 | 解决时间:2011-3-11 16:55 //======================================= 最佳答案: 下列程序已经调好,按键显示电路可见: http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef
[单片机]
4×4<font color='red'>矩阵</font><font color='red'>键盘</font>,控制数码管显示
51单片机之矩阵键盘的驱动实现
用这个矩阵键盘做单片机输入,插 P1 口的 P1.0~P1.6。 想问的是,当: 按下 1 键 P0 口的 P0.0 输出高电平; 按下 2 键 P0.1 输出高电平; …… 一直到 8 键就可以了。 还有一个要求,当按下一个键时延时5秒并锁住其它按键,5秒之后回到起点。用汇编语言 ;===================================================== ;如下即可: ORG 0000H START: MOV P0, #255 MOV P1, #255 CLR P1.0 NOP JNB P1.4, K1 JNB P1.5, K2 JNB P1.6, K3 MOV P1, #
[单片机]
51单片机之<font color='red'>矩阵</font><font color='red'>键盘</font>的驱动实现
AVR扩展4*4矩阵键盘的CVAVR程序
// 8位LED动态显示按键值 // 芯片 ATMEGA16L // 时钟 4MHz 内部 // 采用系统自带延时程序 #include mega16.h #include delay.h void leddisplay(); // 数码管显示 unsigned char keyin(void); // 键盘扫描 unsigned char ledxs ={16,16,16,16,16,16,0,0}; // 数码管显示缓冲区 flash unsigned char tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39
[单片机]
4X4键盘矩阵键盘程序
//按键跟按键的扫描结果满足如下关系: // 按键 扫描结果(result) 按键 扫描结果 // K10 0XE7 K18 0XB7 // K11 0XEB K19 0XBB // K12 0XED K20 0XBD // K13 0XEE K21 0XBE // K14 0XD7 K22 0X77 // K15 0XDB K23 0X7B // K16 0XDD K24 0
[单片机]
51单片机矩阵键盘的编程
C51单片机上的外设键盘键是使用的矩阵方式扩展的,但是硬件仿真时必须把蜂民器的开关打开触使行扫描的74HC53的E端接地为输出型,否则测死了也没反应,我还以为是我的程序有问题呢,后来才找到的。 其原理 74HC138译码器在输出端Y1与WR(P3^6)都处于低电平通过或非门,转化成行扫描的74HC53的片选端打开写入数据,在输出端的高4位通过移位方式输出到外设键盘中。然后给WR一个高电平来给74HC53一个低电平使得输入无效进行锁存操作。然后通过RD(P3^7)与Y2共同输出低电平通过或非门加上个非门把低电平送到列扫描的74HC53的片选端E上,在读取数据前必须先将要获取的高4位进行置1,然后读取高4位数据,通过RD送出高电平进行
[单片机]
51单片机矩阵键盘与8051连接设计
众所周知,51单片机一般的键盘检测原理为非编码键盘检测,没有专门用来产生键编码号或键值的电路芯片;而我们使用的电脑键盘为编码键盘,通过编码电路芯片为每个按键产生一个编码号,可以通过串行总线把键值传输给电脑。在进行矩阵键盘检测时,书本或老师一般教的都是扫描检测,即一行一行地检测或者一列一列地检测,代码繁琐复杂,且缺点很多(例如执行效率较低)。 举例电路: 矩阵键盘与8051连接如上图所示,首先,令P3=0x0f,检测P30、P31、P32、P33哪一行被按下,将此时P3的值存入寄存器1。然后,令P3=0xf0 | 寄存器1,检测P34、P35、P36、P37哪一列被按下,将此时P3的值存入寄存器2。最后,把寄存器1的值和寄存
[单片机]
51单片机<font color='red'>矩阵</font><font color='red'>键盘</font>与8051连接设计
51单片机矩阵键盘检测源代码(按键数码管显示0-F)
本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52;找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略. hex文件及其工程文件下载:http://www.51hei.com/f/juzhen.rar 以下是通过测试的源代码: /* *功能:使用矩阵按键使得按键按下时数码管上显示各自对应的数字(0 ~ F); *日期:2013-05-03-17:51; *作者:徐冉 *特别说明:本程序代码已经通过调试,仅供学习使用; * */ /***********AT89C52-RC 单片机51hei 实验板***********/ /*****************51hei-开发板****************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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