精华内容
下载资源
问答
  • 本文为 51单片机矩阵键盘扫描程序,下面一起来学习一下
  • 文章主要介绍了单片机矩阵键盘扫描的两种方式
  • 原标题:51单片机矩阵键盘扫描程序#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=...

    原标题:51单片机矩阵键盘扫描程序

    #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

    #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

    #define KeyPort P1

    sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

    sbit LATCH2=P2^3;// 位锁存

    unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

    0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F

    unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

    unsigned char TempData[8]; //存储显示值的

    void DelayUs2x(unsigned char t);//us级延时函数声明

    void DelayMs(unsigned char t); //ms级延时

    void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数

    unsigned char KeyScan(void);//键盘扫描

    unsigned char KeyPro(void);

    void Init_Timer0(void);//定时器初始化

    /*------------------------------------------------

    主函数

    ------------------------------------------------*/

    void main (void)

    {

    unsigned char num,i,j;

    unsigned char temp[8];

    Init_Timer0();

    while (1) //主循环

    {

    num=KeyPro();

    if(num!=0xff)

    {

    if(i<8)

    {

    temp[i]=dofly_DuanMa[num];

    for(j=0;j<=i;j++)

    TempData[7-i+j]=temp[j];

    }

    i++;

    if(i==9)//多出一个按键输入为了清屏 原本应该为8

    {

    i=0;

    for(j=0;j<8;j++)//清屏

    TempData[j]=0;

    }

    }

    //Display(0,8); //显示全部8位

    //主循环中添加其他需要一直工作的程序

    }

    }

    /*------------------------------------------------

    uS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

    长度如下 T=tx2+5 uS

    ------------------------------------------------*/

    void DelayUs2x(unsigned char t)

    {

    while(--t);

    }

    /*------------------------------------------------

    mS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编

    ------------------------------------------------*/

    void DelayMs(unsigned char t)

    {

    while(t--)

    {

    //大致延时1mS

    DelayUs2x(245);

    DelayUs2x(245);

    }

    }

    /*------------------------------------------------

    显示函数,用于动态扫描数码管

    输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示

    如输入0表示从第一个显示。

    Num表示需要显示的位数,如需要显示99两位数值则该值输入2

    ------------------------------------------------*/

    void Display(unsigned char FirstBit,unsigned char Num)

    {

    static unsigned char i=0;

    DataPort=0; //清空数据,防止有交替重影

    LATCH1=1; //段锁存

    LATCH1=0;

    DataPort=dofly_WeiMa[i+FirstBit]; //取位码

    LATCH2=1; //位锁存

    LATCH2=0;

    DataPort=TempData[i]; //取显示数据,段码

    LATCH1=1; //段锁存

    LATCH1=0;

    i++;

    if(i==Num)

    i=0;

    }

    /*------------------------------------------------

    定时器初始化子程序

    ------------------------------------------------*/

    void Init_Timer0(void)

    {

    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

    //TH0=0x00; //给定初值

    //TL0=0x00;

    EA=1; //总中断打开

    ET0=1; // 打开

    TR0=1; //定时器开关打开

    }

    /*------------------------------------------------

    定时器中断子程序

    ------------------------------------------------*/

    void Timer0_isr(void) 1

    {

    TH0=(65536-2000)/256; //重新赋值 2ms

    TL0=(65536-2000)%256;

    Display(0,8); // 调用数码管扫描

    }

    /*------------------------------------------------

    按键扫描函数,返回扫描键值

    ------------------------------------------------*/

    unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法

    {

    unsigned char Val;

    KeyPort=0xf0;//高四位置高,低四位拉低

    if(KeyPort!=0xf0)//表示有按键按下

    {

    DelayMs(10); //去抖

    if(KeyPort!=0xf0)

    { //表示有按键按下

    KeyPort=0xfe; //检测第一行

    if(KeyPort!=0xfe)

    {

    Val=KeyPort&0xf0;

    Val+=0x0e;

    while(KeyPort!=0xfe);

    DelayMs(10); //去抖

    while(KeyPort!=0xfe);

    return Val;

    }

    KeyPort=0xfd; //检测第二行

    if(KeyPort!=0xfd)

    {

    Val=KeyPort&0xf0;

    Val+=0x0d;

    while(KeyPort!=0xfd);

    DelayMs(10); //去抖

    while(KeyPort!=0xfd);

    return Val;

    }

    KeyPort=0xfb; //检测第三行

    if(KeyPort!=0xfb)

    {

    Val=KeyPort&0xf0;

    Val+=0x0b;

    while(KeyPort!=0xfb);

    DelayMs(10); //去抖

    while(KeyPort!=0xfb);

    return Val;

    }

    KeyPort=0xf7; //检测第四行

    if(KeyPort!=0xf7)

    {

    Val=KeyPort&0xf0;

    Val+=0x07;

    while(KeyPort!=0xf7);

    DelayMs(10); //去抖

    while(KeyPort!=0xf7);

    return Val;

    }

    }

    }

    return 0xff;

    }

    /*------------------------------------------------

    按键值处理函数,返回扫键值

    ------------------------------------------------*/

    unsigned char KeyPro(void)

    {

    switch(KeyScan())

    {

    case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值

    case 0x7d:return 1;break;//1

    case 0x7b:return 2;break;//2

    case 0x77:return 3;break;//3

    case 0xbe:return 4;break;//4

    case 0xbd:return 5;break;//5

    case 0xbb:return 6;break;//6

    case 0xb7:return 7;break;//7

    case 0xde:return 8;break;//8

    case 0xdd:return 9;break;//9

    case 0xdb:return 10;break;//a

    case 0xd7:return 11;break;//b

    case 0xee:return 12;break;//c

    case 0xed:return 13;break;//d

    case 0xeb:return 14;break;//e

    case 0xe7:return 15;break;//f

    default:return 0xff;break;

    }

    }

    责任编辑:

    展开全文
  • 本文为51单片机矩阵键盘扫描程序,希望对你的学习有所帮助。
  • 51单片机矩阵键盘扫描程序详解#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2...

    51单片机矩阵键盘扫描程序详解

    #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

    #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

    #define KeyPort  P1

    sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

    sbit LATCH2=P2^3;//                 位锁存

    unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,

    0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F

    unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

    unsigned char TempData[8]; //存储显示值的全局变量

    void DelayUs2x(unsigned char t);//us级延时函数声明

    void DelayMs(unsigned char t); //ms级延时

    void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数

    unsigned char KeyScan(void);//键盘扫描

    unsigned char KeyPro(void);

    void Init_Timer0(void);//定时器初始化

    /*------------------------------------------------

    主函数

    ------------------------------------------------*/

    void main (void)

    {

    unsigned char num,i,j;

    unsigned char temp[8];

    Init_Timer0();

    while (1)         //主循环

    {

    num=KeyPro();

    if(num!=0xff)

    {

    if(i<8)

    {

    temp[i]=dofly_DuanMa[num];

    for(j=0;j<=i;j++)

    TempData[7-i+j]=temp[j];

    }

    i++;

    if(i==9)//多出一个按键输入为了清屏 原本应该为8

    {

    i=0;

    for(j=0;j<8;j++)//清屏

    TempData[j]=0;

    }

    }

    //Display(0,8); //显示全部8位

    //主循环中添加其他需要一直工作的程序

    }

    }

    /*------------------------------------------------

    uS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

    长度如下 T=tx2+5 uS

    ------------------------------------------------*/

    void DelayUs2x(unsigned char t)

    {

    while(--t);

    }

    /*------------------------------------------------

    mS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编

    ------------------------------------------------*/

    void DelayMs(unsigned char t)

    {

    while(t--)

    {

    //大致延时1mS

    DelayUs2x(245);

    DelayUs2x(245);

    }

    }

    /*------------------------------------------------

    显示函数,用于动态扫描数码管

    输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示

    如输入0表示从第一个显示。

    Num表示需要显示的位数,如需要显示99两位数值则该值输入2

    ------------------------------------------------*/

    void Display(unsigned char FirstBit,unsigned char Num)

    {

    static unsigned char i=0;

    DataPort=0;   //清空数据,防止有交替重影

    LATCH1=1;     //段锁存

    LATCH1=0;

    DataPort=dofly_WeiMa[i+FirstBit]; //取位码

    LATCH2=1;     //位锁存

    LATCH2=0;

    DataPort=TempData[i]; //取显示数据,段码

    LATCH1=1;     //段锁存

    LATCH1=0;

    i++;

    if(i==Num)

    i=0;

    }

    /*------------------------------------------------

    定时器初始化子程序

    ------------------------------------------------*/

    void Init_Timer0(void)

    {

    TMOD |= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

    //TH0=0x00;       //给定初值

    //TL0=0x00;

    EA=1;            //总中断打开

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

    TR0=1;           //定时器开关打开

    }

    /*------------------------------------------------

    定时器中断子程序

    ------------------------------------------------*/

    void Timer0_isr(void) interrupt 1

    {

    TH0=(65536-2000)/256;    //重新赋值 2ms

    TL0=(65536-2000)%256;

    Display(0,8);       // 调用数码管扫描

    }

    /*------------------------------------------------

    按键扫描函数,返回扫描键值

    ------------------------------------------------*/

    unsigned char KeyScan(void)  //键盘扫描函数,使用行列逐级扫描法

    {

    unsigned char Val;

    KeyPort=0xf0;//高四位置高,低四位拉低

    if(KeyPort!=0xf0)//表示有按键按下

    {

    DelayMs(10);  //去抖

    if(KeyPort!=0xf0)

    {           //表示有按键按下

    KeyPort=0xfe; //检测第一行

    if(KeyPort!=0xfe)

    {

    Val=KeyPort&0xf0;

    Val+=0x0e;

    while(KeyPort!=0xfe);

    DelayMs(10); //去抖

    while(KeyPort!=0xfe);

    return Val;

    }

    KeyPort=0xfd; //检测第二行

    if(KeyPort!=0xfd)

    {

    Val=KeyPort&0xf0;

    Val+=0x0d;

    while(KeyPort!=0xfd);

    DelayMs(10); //去抖

    while(KeyPort!=0xfd);

    return Val;

    }

    KeyPort=0xfb; //检测第三行

    if(KeyPort!=0xfb)

    {

    Val=KeyPort&0xf0;

    Val+=0x0b;

    while(KeyPort!=0xfb);

    DelayMs(10); //去抖

    while(KeyPort!=0xfb);

    return Val;

    }

    KeyPort=0xf7; //检测第四行

    if(KeyPort!=0xf7)

    {

    Val=KeyPort&0xf0;

    Val+=0x07;

    while(KeyPort!=0xf7);

    DelayMs(10); //去抖

    while(KeyPort!=0xf7);

    return Val;

    }

    }

    }

    return 0xff;

    }

    /*------------------------------------------------

    按键值处理函数,返回扫键值

    ------------------------------------------------*/

    unsigned char KeyPro(void)

    {

    switch(KeyScan())

    {

    case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值

    case 0x7d:return 1;break;//1

    case 0x7b:return 2;break;//2

    case 0x77:return 3;break;//3

    case 0xbe:return 4;break;//4

    case 0xbd:return 5;break;//5

    case 0xbb:return 6;break;//6

    case 0xb7:return 7;break;//7

    case 0xde:return 8;break;//8

    case 0xdd:return 9;break;//9

    case 0xdb:return 10;break;//a

    case 0xd7:return 11;break;//b

    case 0xee:return 12;break;//c

    case 0xed:return 13;break;//d

    case 0xeb:return 14;break;//e

    case 0xe7:return 15;break;//f

    default:return 0xff;break;

    }

    }

    展开全文
  • stc89c51单片机矩阵键盘扫描

    千次阅读 2016-10-07 18:46:55
    c51单片机矩阵键盘扫描实现代码
    直接上代码了,不多说
    #include<reg52.h>
    #include<stdio.h>
    
    #define GPIO_KEY P0
    #define GPIO_LED P1
    unsigned char KeyValue;//存储键值
    unsigned char code DIG_CODE[]={
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
    0x7F,0x6F};
    
    void Delay10ms();//延时10ms
    void KeyDown();//监测按键函数
    
    void main(void)
    {
     while(1)
     {
      KeyDown();
      GPIO_LED=~DIG_CODE[KeyValue];
     }
    }
    
    void Delay10ms()
    {
            unsigned char i,j,k;
            for(i=5;i>0;i--)
            for(j=4;j>0;j--)
            for(k=248;k>0;k--);
    }
    
    
    void KeyDown(void)//扫描键盘代码
    {
     char a=0;
     GPIO_KEY=0x0f;
     if(GPIO_KEY!=0x0f)//读取按键是否按下
     {
      Delay10ms();//延时10ms进行消抖
      if(GPIO_KEY!=0x0f)//在此监测按键是否按下
       {
        GPIO_KEY=0x0f;//测试列
    	switch(GPIO_KEY)
    	{
    	 case(0x07): KeyValue=0;break;
    	 case(0x0b): KeyValue=1;break;
    	 case(0x0d): KeyValue=2;break;
    	 case(0x0e): KeyValue=3;break;
    	}
    	//测试行								
    	GPIO_KEY=0xf0;
    	switch(GPIO_KEY)
    	{
    	 case(0x70): KeyValue=KeyValue;break;
    	 case(0xb0): KeyValue=KeyValue+4;break;
    	 case(0xd0): KeyValue=KeyValue+8;break;
    	 case(0xe0): KeyValue=KeyValue+12;break;
    	}
    	while((a<50)&&(GPIO_KEY!=0xf0))//按键松手测试
    	{
    	 Delay10ms();
    	 a++;
    	}
       }
     }
    }

    解释:这里使用的方法是十字交叉法,就是一横一纵确定一个交叉点,当然方法不止一种。

    展开全文
  • 适合初学者的单片机矩阵键盘扫描程序。C语言编写,很经典。。
  • 【汇编】51单片机矩阵键盘扫描程序,LCD显示。
  • } uchar key_scan() //键盘扫描函数 { uchar k; uchar z; x=0x00; y=0x00; P3=0xf0; //先给P3赋一个初值 if(P3!=0xf0) //判断P3不等于所赋初值,说明有健按下 { delay(10); //消除键盘抖动 延时10ms if(P3!=0...

    //小菜出品---严禁抄袭,转载请注明出处

    #include

    #include

    #define uchar unsigned char

    #define uint unsigned int

    uchar idata  x,y;

    uchar code disp_code[] =

    {

    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90,

    // 0-9      0 1 2 3 4 5 6 7 8 9

    0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,

    // 10-15    a b c d e f

    0x7F, 0xBF, 0x9C, 0xFF

    // 16-19    . - 。null

    };    //数码管显示值列表

    void delay(uchar c)                        //延时函数

    {

    char a,b;

    for(a=c;a>0;a--)

    for(b=110;b>0;b--);

    }

    uchar key_scan()                        //键盘扫描函数

    {

    uchar k;

    uchar z;

    x=0x00;

    y=0x00;

    P3=0xf0;                            //先给P3赋一个初值

    if(P3!=0xf0)                        //判断P3不等于所赋初值,说明有健按下

    {

    delay(10);                      //消除键盘抖动  延时10ms

    if(P3!=0xf0)

    {

    x=P3;                    /*这里稍作解释:起初我们已经给P3赋了一个0xf0的值,如果有键按下,P3便一定不再是0xf0 ,

    如果我们这时查看P3的值我们就能知道是哪一列的键按下了(说明一下,我的开发板上P3.0-P3.3接的是列)

    但这时我们先不看P3的值,这时我们先把P3的值赋给x,再给P3赋一个0x0f的值,由于这两条语句执行的速度是

    很快的,是us级的,而我们按一个按键怎么也得几十到上百ms,尽管我们在前面已经做过一个10ms的延时,但是

    在我们给P3重新赋值后,按键一定还是闭合的,所以P3被赋0xof后由于有按键闭合,故P3的值又变了,这时候我们

    查看P3的值就可以判断出来是是哪一行的按键按下了.然后我们把这时的P3值赋给y,再用x或上y,把他们的值赋给z

    然后判断z的值就可以知道是具体哪一个键被按下了!(行和列都确定了,具体是哪一个键自然就确定了) */

    P3=0x0f;

    y=P3;

    z=x|y;

    switch(z)

    {

    case 0xee: k=0; break;

    case 0xed: k=1; break;

    case 0xeb: k=2; break;

    case 0xe7: k=3; break;

    case 0xde: k=4; break;

    case 0xdd: k=5; break;

    case 0xdb: k=6; break;

    case 0xd7: k=7; break;

    case 0xbe: k=8; break;

    case 0xbd: k=9; break;

    case 0xbb: k=10;break;

    case 0xb7: k=11;break;

    case 0x7e: k=12;break;

    case 0x7d: k=13;break;

    case 0x7b: k=14;break;

    case 0x77: k=15;break;

    }

    }

    }

    return(k);

    }

    void main()

    {

    uchar dat;

    while(1)

    {

    P3=0xf0;

    while(P3!=0xf0)

    {

    dat=key_scan();

    P1=0;

    P0=disp_code[dat];

    }

    }

    }

    我感觉一般初学者会有疑问的地方 已经做出了详细的解释

    如果还有弄不明白的地方 可以回帖提问  我会尽量做出解答

    以期共同进步

    展开全文
  • 矩阵键盘扫描C程序 矩阵键盘扫描C程序;内有所用的学习板原理图
  • 51单片机矩阵键盘扫描

    千次阅读 多人点赞 2015-06-24 14:53:00
    矩阵键盘检测之行列扫描法:对矩阵键盘按1至16的顺序进行编号,通过下面的扫描程序得到返回数值即可确定是哪个键被按下。矩阵键盘检测原理: 1、查询是否有键按下。 2、键的抖动处理。 3、查询按下键所在行和列...
  • 本代码利用矩阵键盘行线和列线以及引脚上高低电平变化的规律以2进制来判断按键位置从而显示在数码管上, 其中运用到数字电路的逻辑运算。 线反转法扫描方式代码少,更便于理解和掌握。 所有代码加起来不超过40行。
  • 一个简单的矩阵键盘扫描显示程序,适合初学者
  • 51单片机矩阵键盘动态扫描,我就看见例程编的程序都有个把io口值赋给一个temp,例如P3=temp然后再位与,然后再判断temp。。。。。。我的问题就是为毛不直接判断P3口的值,多此一举干什么,直接用P3来判断按键按下不...
  • 矩阵键盘扫描程序,以做成头文件,直接放在工程文件夹里就行
  • 这是一个用汇编语言实现单片机矩阵键盘扫描程序,虽然它比C语言难,但是对个人的编程是一个很好的煅炼!
  • 正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理。矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。 权当个记录。...矩阵键盘扫描方法有两种,书中采用的是 逐行扫描 。 在此尝试用
  • C51单片机矩阵键盘扫描去抖程序   最近有一个C51的项目,用的是新华龙的C51 F020单片机。项目中要实现4*5的矩阵键盘。矩阵电路图如下如示   其中,四条列线接在F020的P2~P5口线上,5条行线接在P5口线上...
  • 我想实现led灯循环点亮,每个亮一秒,当按下矩阵键盘中任意一个按键,led灯熄灭,在按任意一个键,恢复循环,要求用查询法,我这个程序下到板子上按键识别并不灵敏,按键按下去有时有用有时没用,我想问一下能怎么改...
  • 51单片机矩阵键盘动态扫描,我就看见例程编的程序都有个把io口值赋给一个temp,例如P3=temp然后再位与,然后再判断temp。。。。。。我的问题就是为毛不直接判断P3口的值,多此一举干什么,直接用P3来判断按键按下不...
  • KEYCARD BIT 00H ;用于标志是否有键按下KEYS EQU 5AH;记录键值KEY1 EQU 5BH;记录行扫描时的值KEY2 EQU 5CH;记录列扫描时的值 ORG 0000H;程序开始 AJMP STAR...
  • 循环扫描键盘  ACALL KEY_CHECK  JNB KEYCARD,DISPLAY  INC KEYCOU DISPLAY: ;显示程序  MOV A,KEYCOU ;选显示第一位高位  DA A  ANL A,#0xF0 ;获得高四位  SWAP A ;将A的高四位和低四位对调  ...
  • 单片机汇编矩阵键盘扫描

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,944
精华内容 777
关键字:

单片机矩阵键盘扫描