精华内容
下载资源
问答
  • 51单片机扫描键盘程序   //-----------------------函数声明,变量定义-------------------------------------------------------- #include sbit LED_1 =P1^4; sbit LED_2 =P1^5; sbit LED_3 =P1^6; sbit ...

    51单片机扫描键盘程序

     

    //-----------------------函数声明,变量定义--------------------------------------------------------
    #include 
    sbit LED_1 =P1^4;
    sbit LED_2 =P1^5;
    sbit LED_3 =P1^6;
    sbit LED_4 =P1^7;
    #define KEY P2
    
    unsigned char scan_key();              //扫描键盘,返回键值(高四位代表行,低四位代表列)
    void delay(unsigned int N);
    
    //-----------------------变量声明---------------------------------------------------------------------
    
      main()
    {
    int ge=0,j=0,shi=0,bai=0,qian=0,key_value,key_flag,key_flash_num;
    char leddisplay[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
    while(1)
      {
        key_value=scan_key();
    
        if (key_value==0x18)//按下1键
           { 
               key_flag=1;
                    key_flash_num=0;
              }
    
        if (key_value==0x28)//按下2键
               key_flag=0;
    
        if (key_value==0x48&&key_flag==1)//按下3键,3键的功能,用于增加闪烁位的值
              {
                ge++;
                    if (ge==10)
                        ge=0;
           }
        if (key_value==0x14&&key_flag==1)//按下4键,4键的功能,用于减小闪烁位的值
              {
                ge--;
                    if (ge==0)
                        ge=0;
           }
    
        if (key_flag==0)
            {
         if (j==100)
               {
                    ge++;
                    if(ge==10)
                   {
                            ge=0;
                       shi++;
                            if(shi==6)
                       {
                                    shi=0;
                                    bai++;
                                    if (bai==10)
                                       {
                                            bai=0;
                                            qian++;
                                            if (qian==6)
                                               {
                                                    ge=0;
                                                    shi=0;
                                                    bai=0;
                                                    qian=0;                                                
                                                    }
                                            }
                                    }
                            }
                    j=0;
                    }
             j++;
            }
    
       if (key_flag==0)
       {
         LED_1=0;
         P0=leddisplay[ge];
            delay(100);
         LED_1=1;
       }
       else 
       {
         if (key_flash_num==8)
               {
             LED_1=0;
             P0=leddisplay[ge];
                delay(100);
             LED_1=1;
                    key_flash_num=0;
                    }
       }
         key_flash_num++;
    
            LED_2=0;
         P0=leddisplay[shi];
            delay(100);
         LED_2=1;
       
         LED_3=0;
         P0=leddisplay[bai];
            delay(100);
         LED_3=1;
    
         LED_4=0;
         P0=leddisplay[qian];
            delay(100);
         LED_4=1;
       }
    }
    /*A---88H  3---48H  2---28H  1---18H
      B---84H  6---44H  5---24H  4---14H
      C---82H  9---42H  8---22H  7---12H
      D---81H  E---41H  0---21H  F---11H
      */
    //--------------------------------------------------------------------------------------------------
    // 函数名称: scan_key
    // 函数功能: //扫描键盘,返回键值(高四位代表行,低四位代表列)
    //--------------------------------------------------------------------------------------------------
    unsigned char scan_key()              //扫描键盘,返回键值(高四位代表行,低四位代表列)
      {
       unsigned char scancode,keycode,keycode_nd;
       scancode=0xef;                    //键盘扫描码,采用逐行扫描的方法
       while(scancode!=0xff)
       {
        KEY=scancode;                      //输入扫描码,扫描P2.4对应的行
        keycode=KEY;                       //读出数据,看是否在此行上的某列键盘被按下   
        if((keycode&0x0f)!=0x0f)  
             {
           while (((keycode_nd=KEY)&0x0f)!=0x0f);
           break;                             //扫描到按下的键,则退出  
             }
        scancode=(keycode<<1)|0x0f;        //否则,更新扫描码继续扫描  
       }  
       keycode=~keycode; 
       return(keycode);
       }
    
    void delay(unsigned int N)
    {
      int i;
      for (i=0;i<N;I++);
    }


     

     

     

     ---★ 本文转自『IT在线:http://www.itolhome.cn』→原文地址:http://www.itolhome.cn/thread-6805-1-157.html

    展开全文
  • 单片机键盘扫描程序

    2013-11-04 11:04:29
    单片机键盘扫描程序
  • #include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换#define KeyPort P1sbit LATCH1=P2^2;//定义锁存使能端口 段锁存...

    #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单片机矩阵键盘扫描程序,希望对你的学习有所帮助。
  • /****************************************键盘_不采用定时器_不延时特点:按键在松手后有效,灵敏度高,消耗资源少,运行效率高独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;矩阵键盘为:行(上到下)_P2.3_P...
  • 单片机4*4键盘扫描c语言程序,很好使....
  • 飞思卡尔单片机键盘扫描程序扫描并点亮响应的LED灯
  • 51单片机键盘扫描程序,算法简单有效,键盘_不采用定时器_不延时,按键在松手后有效,灵敏度高,消耗资源少,运行效率高.
  • 矩阵键盘扫描C程序 矩阵键盘扫描C程序;内有所用的学习板原理图
  • 用定时器扫描 可实现长安短按
  • 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;

    }

    }

    展开全文
  • 本文为89C52单片机矩阵键盘行列扫描程序,一起来学习一下
  • 本文给大家分享了51单片机行列式键盘扫描程序
  • 基于MSP430单片机键盘扫描C程序设计
  • 本文主要讲了一下关于单片机行列式键盘扫描程序,希望对你的学习有所帮助。
  • 矩阵键盘扫描程序,以做成头文件,直接放在工程文件夹里就行
  • 适合初学者的单片机矩阵键盘扫描程序。C语言编写,很经典。。
  • c 语言实现的单片机键盘扫描程序实现状态机,希望对需要的朋友有所帮助。
  • 这是一个用汇编语言实现单片机的矩阵键盘扫描程序,虽然它比C语言难,但是对个人的编程是一个很好的煅炼!
  • 在MCS51单片机上实现键盘扫描,并控制LCD显示的程序.
  • 本文为单片机4x4矩阵键盘扫描程序,希望对你的学习有所帮助。
  • 很有用的单片机实例,对初学者提高单片机特别有用!
  • } 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];

    }

    }

    }

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

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

    以期共同进步

    展开全文

空空如也

空空如也

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

单片机扫描键盘程序