精华内容
下载资源
问答
  • 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单片机来完成矩阵键盘电路扫描并把按键的编号通过LED显示出来
  • 本文为 51单片机矩阵键盘扫描程序,下面一起来学习一下
  • 本文为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至16的顺序进行编号,通过下面的扫描程序得到返回数值即可确定是哪个键...先行后列扫描法#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显示。
  • 51单片机矩阵键盘扫描C语言程序,并用四位一体数码管显示。
  • 本代码利用矩阵键盘行线和列线以及引脚上高低电平变化的规律以2进制来判断按键位置从而显示在数码管上, 其中运用到数字电路的逻辑运算。 线反转法扫描方式代码少,更便于理解和掌握。 所有代码加起来不超过40行。
  • 采用线扫描的方式实现键盘识别,所采用键盘为4*4 矩阵键盘
  • 正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理。矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。 权当个记录。 问题描述: 在实验板TX-1C上实现如下描述,实验板上电时,数码管不显示,顺序...

    正在学习郭天祥《51单片机C语言教程(第2版)》第4章,键盘检测原理。矩阵键盘检测部分的代码又长又啰嗦,所以修改了下。
    权当个记录。

    问题描述:
    在实验板TX-1C上实现如下描述,实验板上电时,数码管不显示,顺序按下矩阵键盘后,在数码管上依次显示0-F,6个数码管同时静态显示即可。

    当前代码实现的是:按键按下后,数码管亮起;手放下,不按,数码管关闭不亮。

    尤其说明,只有按键状态变化时,才会重新扫描,数码管的亮灭状态才会变化,而不是连续重复扫描,数码管持续高速亮灭变化。

    矩阵键盘扫描方法有两种,书中采用的是 逐行扫描 。
    在此尝试用 行列扫描:学习板上,行连接的是P3的低4位,列连接的是P3的高4位。所以,当P3口高4位输出高电平,低4位输出低电平,若这4行按键里有按键按下了,那么那一列对应的I/O电平就会拉低,我们就可知道按键的列坐标。类似地,高4位输出低电平,低4位输出高电平,可以得到按键的行坐标。
    (上面一段话引用自文章《矩阵键盘的原理及应用》,链接: link.其中因为按键的接线不同,而有些说法不同。 )

    代码如下:

    #include <reg52.h>
    
    sbit dula = P2^6 ;
    sbit wela = P2^7 ;
    unsigned char code table[]={ 0x3f ,	0x06 , 0x5b , 0x4f ,
    							 0x66 , 0x6d , 0x7d , 0x07 ,
    							 0x7f , 0x6f , 0x77 , 0x7c ,
    							 0x39 , 0x5e , 0x79 , 0x71 };
    
    int delayms( unsigned int );
    int LED_on( unsigned int P0we , unsigned int P0du );
    unsigned int matrixkeyscn();
    
    int main( void )
    {
    	unsigned int num , num0=16 ,temp ;
    	while( 1 )
    	{
    		num = matrixkeyscn();
    		if( num != num0 )                     // 按键状态有变,则(才)需要操作
    		{
    			if( num < 16 )	                  // 按了不同的按键
    			{
    				LED_on( 0xc0 , table[num] );  // 点亮对应的数码管
    				P3 = 0x0f ;
    				temp = P3 ;
    				while( temp != 0x0f )		  // 等放开按键
    				{
    					temp = P3 ;
    				}
    			}
    			else			                  // 先前按了,现在不按了
    			{
    				LED_on( 0xc0 , 0x00 );		  // 关闭数码管
    				P3 = 0x0f ;
    				temp = P3 ;
    				while( temp == 0x0f )		  // 等再按下按键
    				{
    					temp = P3 ;
    				}
    			}
    	   		num0 = num ;
    		}
    	}
    	return 0 ;
    }
    
    unsigned int matrixkeyscn()      // 键盘阵列,行列扫描
    {
    	unsigned char temp ;
    	unsigned int hang , lie , key=16 ;
    
    	P3 = 0x0f ;
    	temp = P3 ;
    	if( temp != 0x0f )
    	{
    		delayms( 10 );	    // 去抖延时
    		P3 = 0x0f ;
    		temp = P3 ;
    		if( temp != 0x0f )
    		{
    			P3 = 0x0f ;
    			temp = P3 ;
    		    switch( temp )
    			{
    			 	case 0x0e : hang = 1; break;
    				case 0x0d : hang = 2; break;
    				case 0x0b : hang = 3; break;
    				case 0x07 : hang = 4; break;
    			}
    
    			P3 = 0xf0 ;
    			temp = P3 ;
    			switch( temp )
    			{
    			 	case 0xe0 : lie = 1; break;
    				case 0xd0 : lie = 2; break;
    				case 0xb0 : lie = 3; break;
    				case 0x70 : lie = 4; break;
    			}
    			key = ( hang - 1 ) * 4 + lie - 1 ;
    		}
    	}
    	return key ;
    }
    
    int LED_on( unsigned int P0we , unsigned int P0du )
    {	
    	wela = 1 ;
    	P0 = P0we ;
    	wela = 0 ;
    		
    	P0 = 0xff ;	  // 消影
    	dula = 1 ;
    	P0 = P0du ;
    	dula = 0 ;
    
    	return 0 ;
    }
    
    int delayms( unsigned int xms )
    {
     	unsigned int i , j ;
    	for( i=0 ; i<xms ; i++ )
    		for( j=0 ; j<110 ; j++ );
    	return 0;
    }
    
    
    展开全文
  • 51单片机扫描键盘程序   //-----------------------函数声明,变量定义-------------------------------------------------------- #include sbit LED_1 =P1^4; sbit LED_2 =P1^5; sbit LED_3 =P1^6; sbit ...
  • 51单片机矩阵键盘扫描程序详解#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2...
  • Proteus 51单片机 C语言 LCD动态显示 键盘扫描
  • 51单片机系列实验之键盘扫描.pdf
  • 单片机键盘扫描C51程序,帮助你了解键盘扫描原理,快速入门。
  • 名称:矩阵键盘依次输入控制 使用行列逐级扫描 中断方式 内容:如计算器输入数据形式相同 从右至左 使用行列扫描方法 中断方式可以有效提供cpu工作效率,在有按键动作时才扫描,平时不进行扫描工作
  • 针对51单片机的矩阵键盘实验,能够根据矩阵按键完成功能。

空空如也

空空如也

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

51单片机键盘扫描