zoukankan      html  css  js  c++  java
  • 矩阵键盘 数码管

    在没有数字显示的开始,顺序为矩阵键盘后,依次显示的数码管0~F,6同时数字控制静态展示。

     数字控制和矩阵式键盘

    首先关闭全部的数码管的段选不让数码管显示不论什么数字。然后位选中全部的数码管,接下来仅仅须要选中全部的数码管,以后的操作的仅仅须要送段选数据即可了,接着进入while()大循环不停的扫描键盘是否有被按下

    #include<reg52.h>
    #define uchar unsigned char 
    #define uint unsigned int 
    sbit dula=P2^6;
    sbit wela=P2^7;
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    void delayms(uint xms)
    {
    uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);
    }
    void display(uchar num)
    {
    P0=table[num];
    dula=1;
    dula=0;
    }
    void matrixkeyscan()
    {
    uchar temp,key;
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xee:
    key=0;
    break;
    case 0xde:
    key=1;
    break;
    case 0xbe:
    key=2;
    break;
    case 0x7e:
    key=3;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xed:
    key=4;
    break;
    case 0xdd:
    key=5;
    break;
    case 0xbd:
    key=6;
    break;
    case 0x7d:
    key=7;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xeb:
    key=8;
    break;
    case 0xdb:
    key=9;
    break;
    case 0xbb:
    key=10;
    break;
    case 0x7b:
    key=11;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    temp=P3;
    switch(temp)
    {
    case 0xe7:
    key=12;
    break;
    case 0xd7:
    key=13;
    break;
    case 0xb7:
    key=14;
    break;
    case 0x77:
    key=15;
    break;
    }
    while(temp!=0xf0)
    {
    temp=P3;
    temp=temp&0xf0;
    }
    display(key);
    }
    }
    }


    void main()
    {
    P0=0;
    dula=1;
    dula=0;
    P0=0;
    wela=1;
    wela=0;
    while(1)
    {
    matrixkeyscan();
    }
    }


    这里有几个

    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
    delayms(10);
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {  .........

    P3=0xfe 将第1 行线置低电平,其余的行线所有为高电平

    temp=P3 读取P3口当前的状态值赋值给暂时变量temp

    temp=temp&0xf0 将temp与0xf0进行与运算 然后再将结果赋值给temp,主要是推断temp的高4位是否有0。假设temp的高4位没有0。那么他与0xf0“与”运算后的结果仍然等于0xf0.temp的高4位数据实际上就是矩阵键盘的4个列线,从而我们可通过推断temp与“0xf0运算后的结果是否为0xf0来推断出第一行按键是否有按键被按下。

    if(temp!=0xf0) 表示temp是上面P3口数据与0xf0“与”运算后的结果,假设结果temp不等于0xf0来推断出有按键被按下。

    另外

    P3口全部引脚

    其余的想复位引脚RESVPD

    还有EAVPP

    ALEPROG

    这是全部的了,我的是AT89S52(51系列)


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    WebAssembly学习(四):AssemblyScript
    Ramda
    React—生命周期
    网络拓扑图
    手机端的meta信息
    面试题
    Bootstrap路径导航
    Bootstrap 分页翻页
    Bootstrap栅格系统
    Bootstrap 屏幕类型
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4816997.html
Copyright © 2011-2022 走看看