精华内容
下载资源
问答
  • 51单片机键盘扫描

    2013-04-24 00:40:24
    初学者,刚刚写完51单片机键盘扫描,拿出来分享,求指点~
  • C语言编写的C51单片机键盘扫描行扫描方法
  • 51单片机键盘扫描实验.zip
  • /****************************************键盘_不采用定时器_不延时特点:按键在松手后有效,灵敏度高,消耗资源少,运行效率高独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;矩阵键盘为:行(上到下)_P2.3_P...
  • 用定时器扫描 可实现长安短按
  • 本文为 51单片机矩阵键盘扫描程序,下面一起来学习一下
  • 运用51单片机来完成矩阵键盘电路扫描并把按键的编号通过LED显示出来
  • 本文为51单片机矩阵键盘扫描程序,希望对你的学习有所帮助。
  • 本文给大家分享了51单片机行列式键盘扫描程序。
  • #include //头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义uchar shi,fen,nshi,nfen,ma 发表于 2020-12-17 51单片机做的温度显示,温度显示在LCD1602液晶屏上。然后按键可以调整温度...

    #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;

    }

    }

    关注eeworld公众号

    快捷获取更多信息

    关注eeworld服务号

    享受更多官方福利

    推荐阅读

    STC15单片机实验名称:使用NTC电阻测量温度实验内容:        使用NTC电阻测量温度并显示在数码管上        读取DS18B20模块测量温度作为参考实验器材:        STC15W408AS_DIP16 x1        DS18B20  x1        TM1637数码管 x1

    发表于 2020-12-17

    13c8c1f1db3591c57b81a47ceb4c8acf.png

    /*一款电子钟程序,此电子钟是四位电子钟数码管组成的,功能分别有走时、响闹、走时间调整、闹钟时间调整等功能!调整部分分别由三个按键实现,一个功能键,一个+(加)键,另一个为-(减)键,其它功能键是复用功能!*/硬键介绍:数码管个位.十位.百位.千位.小数点分别接P0.0 P0.1 P0.2 P0.3 P0.4。蜂鸣器接P3.5脚,功能按键接P3.2 加按键接P3.3 减按键接P3.4以下是两张图片!!!#include //头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义uchar shi,fen,nshi,nfen,ma

    发表于 2020-12-17

    929b95366525f73860d9149dcc838369.png

    51单片机做的温度显示,温度显示在LCD1602液晶屏上。然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……单片机源程序如下:/***************************************************************************************                              基于单片机的实时温度报警系统设计        &nbsp

    发表于 2020-12-17

    d774af01611cbee573d22008cbada9a7.png

    程序代码 仿真图单片机源程序如下:#include#include/*********************宏定义************************/#define uchar unsigned char#define uint unsigned int/************位定义*****************************/sbit Trig=P3^7; //超声波模块触发位sbit LEDRED=P1^0;sbit LEDGREEN=P1^2;sbit speaker=P1^7;sbit person=P1^6;sbit

    发表于 2020-12-09

    ad21780f58d89bc4f43f43de86c206c0.png

    电子秤是基于STC89C51单片机,以及HX711称重模块,利用单片机控制A/D转换,屏幕数据显示,键盘实时输入,设计方案能够易于各种场合使用。单片机源程序如下:#include #include #include #include "main.h"#include "HX711.h"#include "eeprom52.h"#define uchar unsigned char#define uint  unsigned intunsigned long HX711

    发表于 2020-12-09

    f585aee1b43bfbb8d926f654ee1d4793.png

    展开全文
  • 51单片机键盘扫描程序,算法简单有效,键盘_不采用定时器_不延时,按键在松手后有效,灵敏度高,消耗资源少,运行效率高.
  • 51单片机矩阵键盘扫描

    千次阅读 多人点赞 2015-06-24 14:53:00
    矩阵键盘检测原理: 1、查询是否有键按下。 2、键的抖动处理。 3、查询按下键所在行和列位置,得到键值。先行后列扫描法#include<reg51.h> #define uchar unsigned char #define uint unsigned int #define t

    矩阵键盘检测之行列扫描法:

    对矩阵键盘按1至16的顺序进行编号,通过下面的扫描程序得到返回数值即可确定是哪个键被按下。

    我所用开发板的矩阵键盘


    矩阵键盘检测原理:
    1、查询是否有键按下。
    2、键的抖动处理。
    3、查询按下键所在行和列位置,得到键值。


    先行后列扫描法

    #include<reg51.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define temp P2           //定义按键I/O口
        uchar keyscan()
        {
           uchar num;
           temp=0xf0;
           if(temp!=0xf0)    //检测是否有键按下
           {
              delay_ms(5);    //延时消抖
              if(temp!=0xf0)   //再次检测是否有键按下
              {
                 temp=0xf0;     //对应IO口拉高,以便检测
                 switch(temp)   //先确定行
                 {
                    case 0x70: num=1;  break;   //第一行
                    case 0xb0: num=5;  break;   //第二行
                    case 0xd0: num=9;  break;   //第三行
                    case 0xe0: num=13; break;   //第四行
                 }
                 temp=0x0f;     //对应IO口拉高,以便检测
                 switch(temp)   //再确定列
                 {
                    case 0x07: num=num+0; break;   //第一列
                    case 0x0b: num=num+1; break;   //第二列
                    case 0x0d: num=num+2; break;   //第三列
                    case 0x0e: num=num+3; break;   //第四列
                 }
              }
           }
           return num;   //结合行列扫描的值得出按键对应的数值,并返回
        }
    
    

    先列后行扫描法

    #include<reg51.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define temp P2
        uchar keyscan()
        {
           uchar num;
           temp=0x0f;
           if(temp!=0x0f)   
           {
              delay_ms(5);
              if(temp!=0x0f)
              {
                 temp=0x0f;    //先确定列
                 switch(temp)
                 {
                    case 0x07: num=1; break;
                    case 0x0b: num=2; break;
                    case 0x0d: num=3; break;
                    case 0x0e: num=4; break;
                 }
                 temp=0xf0;   //再确定行
                 switch(temp)
                 {
                    case 0x70: num=num+0;  break;
                    case 0xb0: num=num+4;  break;
                    case 0xd0: num=num+8;  break;
                    case 0xe0: num=num+12; break;
                 }
              }
           }
           return num;      
        }
    

    注:这里的行列是相对的,看你自己的接线是怎样的,请自己动手体会,希望能对大家有所帮助!

    展开全文
  • 51单片机矩阵键盘动态扫描,我就看见例程编的程序都有个把io口值赋给一个temp,例如P3=temp然后再位与,然后再判断temp。。。。。。我的问题就是为毛不直接判断P3口的值,多此一举干什么,直接用P3来判断按键按下不...
  • 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++;
    	}
       }
     }
    }

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

    展开全文
  • 【汇编】51单片机矩阵键盘扫描程序,LCD显示。
  • 单片机键盘扫描C51程序,帮助你了解键盘扫描原理,快速入门。
  • 51单片机矩阵键盘扫描C语言程序,并用四位一体数码管显示。
  • 本代码利用矩阵键盘行线和列线以及引脚上高低电平变化的规律以2进制来判断按键位置从而显示在数码管上, 其中运用到数字电路的逻辑运算。 线反转法扫描方式代码少,更便于理解和掌握。 所有代码加起来不超过40行。
  • 矩阵键盘扫描原理详解——单片机

    万次阅读 多人点赞 2016-04-07 20:12:00
    矩阵键盘扫描原理详解根据原理图 键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电...

    矩阵键盘扫描原理详解


    这里写图片描述


    根据原理图
    键盘扫描方法是:行线P10~P13为输出线,列线P14~P17为输入线。一开始单片机将行线(P10~P13)全部输出低电平,此时读入列线数据,若列线全为高电平则没有键按下,当列线有出现低电平时调用延时程序以此来去除按键抖动。延时完成后再判断是否有低电平,如果此时读入列线数据还是有低电平,则说明确实有键按下。最后一步确定键值。现在我们以第二行的S5键为例,若按下S5后我们应该怎么得到这个键值呢?当判断确实有键按下之后,行线轮流输出低电平,根据读入列线的数据可以确定键值。首先,单片机将P10输出为低电平,其它P11~P13输出高电平,此时读取列线的数据全为高电平,说明没有在第一行有键按下;其次,单片机将P11输出低电平,其它P10、P12、P13仍为高电平,此时再来读取列线数据,发现列线读到的数据有低电平,数值为1011(0x0B),如果我们的键盘布局已经确定,那么0x0B就代表S5的值了。转到S5键功能处理子程序就可以达到目的。


    /*  
        功能:矩阵键盘扫面,按键显示键值程序 
        作者:siriuszxn
                                      */
    #include "reg51.h"                                                                                                                
    #define KEYPORT = P1                                                                                                   
    
    unsigned char i;                                                                                                                                         
    unsigned char Keynum;                                                                                                        
    unsigned char Line;                                       //行                                                                 
    unsigned char Mask;                                                                                                         
    unsigned char Col;                                        //列                                                                      
    unsigned char ScanCode;                                                                                              
    
    unsigned char code psegs_table[] =                                                                                            {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};                                                                //共阳极数码管0-F                                                                                                                                            
    
    void delay_ms(unsigned int t)                      //ms延时程序                                                                      
    {                                                                                                                                       
        unsigned char i;                                                                                                                 
         unsigned int x;                                                                                                                  
         x=t;                                                                                                                              
         while(x--)                                                                                                                        
         {                                                                                                                                          
                 for(i=0;i<113;i++);                                                                                                              
         }                                                                                                                                           
    }                                                                                                                                        
    /* 键盘扫描程序 */                                                                                                                                        
    void keyscan()                                                                                                           
    {                                                                                                                                   
        while (1)              //循环扫描键盘       
        {                                                                                                                            
           P1 = 0xff;          //开始                                                         
            Line = 1;                                                                                         
            Mask = 0x01;                                                                                         
    
            for(i = 0; i < 4; i++)                                                                                   
            {                                                                                                                                                                                    
                P1 = ~Mask;                                                                                    
    
                ScanCode = P1 & 0xf0;                                                                                          
    
                if (ScanCode != 0xf0)                                                                                         
                {                                                                                                                                                                                    
                    delay_ms(5);                                                                               
                }                                                                                                                                                                                    
    
                ScanCode = P1 & 0xf0;                                                                                          
    
                switch(ScanCode)                                                
                {                                                                                                                                                                                    
                    case 0xe0:Col=1;break;                                                                                          
                    case 0xd0:Col=2;break;                                                                   
                    case 0xb0:Col=3;break;                                                                          
                    case 0x70:Col=4;break;                                                                  
                    default  :Col=0;break;                                                                                          
                }                                                                                                                                                                                    
    
                if (Col > 0)                                                                                                                                           
                {   
                    //根据行列计算键值                                                                                                                                                         
                    Keynum = (Line - 1) * 4 + Col;                                                                  
                    //通过P0口接数码管显示                                                                                                          
                    P0 = psegs_table[Keynum-1];                                                                                          
    
                    while(1)                                                                                           
                    {                                                                                
                        ScanCode = P1 & 0xf0;                                                                                
                        if(ScanCode == 0xf0)                                                               
                        {                                                                                                                                              
                            break;                                                    
                        }                                                                                                                       
                    }                                                                                
                    Mask <<= 1;                                                                                                      
                    Line++;                                                                                                 
                }                                                                                                                        
            }                                                                                                                                      
        }  
    }                                                                                                                                   
    
    void main()                                                                                         
    {                                                                                                                                     
        while(1)                                                                                                                      
        {                                                                                                                                 
            keyscan();                                                                                         
        }                                                                                                                                 
    }                                                                      
    展开全文
  • 采用线扫描的方式实现键盘识别,所采用键盘为4*4 矩阵键盘
  • 正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理。矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。 权当个记录。 问题描述: 在实验板TX-1C上实现如下描述,实验板上电时,数码管不显示,顺序...
  • 51单片机扫描键盘程序   //-----------------------函数声明,变量定义-------------------------------------------------------- #include sbit LED_1 =P1^4; sbit LED_2 =P1^5; sbit LED_3 =P1^6; sbit ...
  • Proteus 51单片机 C语言 LCD动态显示 键盘扫描
  • 51单片机系列实验之键盘扫描.pdf
  • 名称:矩阵键盘依次输入控制 使用行列逐级扫描 中断方式 内容:如计算器输入数据形式相同 从右至左 使用行列扫描方法 中断方式可以有效提供cpu工作效率,在有按键动作时才扫描,平时不进行扫描工作
  • 这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘、键盘消抖等)包含原理图、代码等(一)基础补充1.键盘的任务2.键盘的识别3.如何消除按键的抖动4.非编码键盘与...

空空如也

空空如也

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

51单片机键盘扫描原理