找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2200|回复: 59
收起左侧

四位二进制如何取16个键值?附51单片机程序

  [复制链接]
ID:76027 发表于 2024-5-2 10:01 | 显示全部楼层 |阅读模式
请教各位大佬,四位二进制如何取16个键值。用的是STC8H1K08的MCU,P1口设置为准双向口。

单片机源程序如下:
sbit d0 = P1^2;
sbit d1 = P1^3;
sbit d2 = P1^4;
sbit d3 = P1^5;
unsigned char MatrixKey()

{        unsigned char k=0;

  if(d0==1 && d1==0 &&d2==0 && d3==0) k=1;

         else if(d0==0 && d1==1 && d2==0 && d3==0) k=2;

        else if(d0==1 && d1==1 && d2==0 && d3==0) k=3;

        else if(d0==0 && d1==0 && d2==0 && d3==1) k=4;

        else if(d0==1 && d1==0 && d2==1 && d3==0) k=5;

        else if(d0==0 && d1==1 && d2==1 && d3==0) k=6;

        else if(d0==1 && d1==1 && d2==1 && d3==0) k=7;

        else if(d0==0 && d1==0 && d2==0 && d3==1) k=8;

        else if(d0==1 && d1==0 && d2==0 && d3==1) k=9;

        else if(d0==0 && d1==1 && d2==0 && d3==1) k=0;

        else if(d0==1 && d1==1 && d2==0 && d3==1) k='*';

        else if(d0==0 && d1==0 && d2==1 && d3==1) k='#';

        else if(d0==1 && d1==0 && d2==1 && d3==1) k='A';

        else if(d0==0 && d1==1 && d2==1 && d3==1) k='B';

        else if(d0==1 && d1==1 && d2==1 && d3==1) k='C';

        else if(d0==0 && d1==0 && d2==0 && d3==0) k='D';
return k;
}

新手,请各位大佬多多指教!
回复

使用道具 举报

ID:526108 发表于 2024-5-2 11:01 | 显示全部楼层
k=P1&0x3C
回复

使用道具 举报

ID:235200 发表于 2024-5-2 11:43 | 显示全部楼层
前面加一个16至4位二进制的编码电路,不过这样电路复杂了,不如用8个端口组成行列按键,或者用18个电阻串联分压电路构成16级电压,用ADC识别作为16个按键
回复

使用道具 举报

ID:161164 发表于 2024-5-2 13:13 | 显示全部楼层
  1. unsigned char MatrixKey()
  2. {
  3.         unsigned char k=0;
  4.         unsigned char Temp = (P1>>2) & 0x0F;
  5.         switch(Temp)
  6.         {
  7.                 case 10:k=0;break;
  8.                 case 11:k='*';break;
  9.                 case 12:k='#';break;
  10.                 case 13:k='A';break;
  11.                 case 14:k='B';break;
  12.                 case 15:k='C';break;
  13.                 case 0:k='D';break;
  14.                 default:k=Temp;break;
  15.         }
  16.         return k;
  17. }
复制代码
回复

使用道具 举报

ID:624769 发表于 2024-5-2 13:16 | 显示全部楼层

unsigned char MatrixKey()
{
        unsigned char k=0;
        switch((P2>>2)&0x0f)
        {
                case        0x01:        k=1;        break;
                case        0x02:        k=2;        break;
                case        0x03:        k=3;        break;
                case        0x08:        k=4;        break;        //我也不知道为什么你会有两个相同的按键状态
                case        0x05:        k=5;        break;
                case        0x06:        k=6;        break;
                case        0x07:        k=7;        break;
                case        0x08:        k=8;        break;
                case        0x09:        k=9;        break;
                case        0x0A:        k=0;        break;
                case        0x0B:        k='*';        break;
                case        0x0C:        k='#';        break;
                case        0x0D:        k='A';        break;
                case        0x0E:        k='B';        break;
                case        0x0F:        k='C';        break;
                case        0x00:        k='D';        break;
                default:        k=0xff;        break;
        }
        return k;
}
回复

使用道具 举报

ID:76027 发表于 2024-5-2 14:47 | 显示全部楼层
csmyldl 发表于 2024-5-2 11:43
前面加一个16至4位二进制的编码电路,不过这样电路复杂了,不如用8个端口组成行列按键,或者用18个电阻串联 ...

这是一个DTMF接收输入的二进制码。
回复

使用道具 举报

ID:76027 发表于 2024-5-2 14:49 | 显示全部楼层
188610329 发表于 2024-5-2 13:16
unsigned char MatrixKey()
{
        unsigned char k=0;

新手,没注意,复制后没改过来。
回复

使用道具 举报

ID:883242 发表于 2024-5-2 15:01 | 显示全部楼层
Image-DTMF-Keypad-With-Alloted-Frequencies.jpg

但是你的数据跟DTMF矩阵完全对不上号。
回复

使用道具 举报

ID:76027 发表于 2024-5-2 15:17 | 显示全部楼层
Hephaestus 发表于 2024-5-2 15:01
但是你的数据跟DTMF矩阵完全对不上号。

我这是DTMF解码芯片MT8870 D1-D3输出的数据
回复

使用道具 举报

ID:76027 发表于 2024-5-2 15:21 | 显示全部楼层
这是DTMF的编解码表
回复

使用道具 举报

ID:1109793 发表于 2024-5-2 15:29 | 显示全部楼层
取键值的意义是?直接右移2位,不就得电这个4位的数据了吗?然后该干啥干啥呗
回复

使用道具 举报

ID:76027 发表于 2024-5-2 15:35 | 显示全部楼层
unsigned char k=0;
        switch((P2>>2)&0x0f)     K=0,那0的键值是不是无法提取出来。
回复

使用道具 举报

ID:1109793 发表于 2024-5-2 16:26 | 显示全部楼层
bd5fna 发表于 2024-5-2 15:35
unsigned char k=0;
        switch((P2>>2)&0x0f)     K=0,那0的键值是不是无法提取出来。

4位不就是最多16个啊,看楼上的真值表,0也是有用的,很明显要有一个别的什么信号来确定是不是有按键按下去。
回复

使用道具 举报

ID:1119107 发表于 2024-5-2 16:37 | 显示全部楼层
是不是按键检测识别有问题
回复

使用道具 举报

ID:69038 发表于 2024-5-2 16:42 | 显示全部楼层
你这个是在同一个端口,要取数简直没有更方便了!你参考一下:
temp=P1; //读P1口数据值
temp=temp>>2; //数据值移位,匹配硬件端口:P1^2345
temp=temp & 0x0f; //屏蔽高4位
temp=“0123456789ABCDEF”[temp];//查表
return (temp); //返回键名ASC码
回复

使用道具 举报

ID:76027 发表于 2024-5-2 16:49 | 显示全部楼层
xiaobendan001 发表于 2024-5-2 16:26
4位不就是最多16个啊,看楼上的真值表,0也是有用的,很明显要有一个别的什么信号来确定是不是有按键按下 ...

芯片上有一个STD信号在有按键按下时产生高电平。
回复

使用道具 举报

ID:69038 发表于 2024-5-2 17:13 | 显示全部楼层
bd5fna 发表于 2024-5-2 16:49
芯片上有一个STD信号在有按键按下时产生高电平。

对啊,标准的DTMF键盘是16键的。
只有解码成功,STD才有高电平输出。
这个我以前用的很多,用在报警器上,一个发,一个收:
HT-9200.pdf (284.66 KB, 下载次数: 2)
回复

使用道具 举报

ID:332444 发表于 2024-5-2 17:53 | 显示全部楼层
按题主思路就是按16进制的组合按键,不用定义直接读取组的值即可获得,很简单的,不用写那么多代码。8421即1=1按键2=2按键3=1+2按键0就是没按键15就是所有按键。
回复

使用道具 举报

ID:883242 发表于 2024-5-2 18:51 | 显示全部楼层
zhuls 发表于 2024-5-2 16:42
你这个是在同一个端口,要取数简直没懈奖懔耍∧悴慰家幌拢�
temp=P1; //读P1口数据值
temp=temp>>2; / ...

return("1234567890.#ABCD"[(P1>>2)&0xf]);

就一句话的事情,写那么多干什么。
回复

使用道具 举报

ID:1109793 发表于 2024-5-2 19:06 | 显示全部楼层
Hephaestus 发表于 2024-5-2 18:51
return("1234567890.#ABCD"[(P1>>2)&0xf]);

就一句话的事情,写那么多干什么。

精辟,总工就是总工
回复

使用道具 举报

ID:69038 发表于 2024-5-2 20:57 | 显示全部楼层
Hephaestus 发表于 2024-5-2 18:51
return("1234567890.#ABCD"[(P1>>2)&0xf]);

就一句话的事情,写那么多干什么。

你看的懂,不代表天下人都看的懂
回复

使用道具 举报

ID:624769 发表于 2024-5-2 23:13 | 显示全部楼层
zhuls 发表于 2024-5-2 20:57
你看的懂,不代表天下人都看的懂

确实,就一句话都还能写错……,还不如人家写复杂一点的…… 至少能保证对。
回复

使用道具 举报

ID:161164 发表于 2024-5-3 10:25 | 显示全部楼层
Hephaestus 发表于 2024-5-2 18:51
return("1234567890.#ABCD"[(P1>>2)&0xf]);

就一句话的事情,写那么多干什么。

虽然精妙,可惜楼主的0到9不是ASCII
回复

使用道具 举报

ID:76027 发表于 2024-5-3 10:25 | 显示全部楼层
请各位大佬再帮忙看看,输入密码时任何键都不会显示,只有按下确认键会显示错误(任意键做确认键都会显示错误),这可以确定按键解码是成功的。#include <STC8.H>//#include <string.h>
//#include <EEPROM.h>
#include <LCD1602.h>
#define     MAIN_Fosc       24000000L   //定义主时钟

sbit ALAM = P3^4;                //报警       
sbit KEY = P3^2;                //开锁
//sbit dtmf_ok = P1^1; //双音频接收
sbit d0 = P1^2;
sbit d1 = P1^3;
sbit d2 = P1^4;
sbit d3 = P1^5;

unsigned char KeyNum,Count=0;
unsigned int Password=0;

unsigned char code initpassword[4]={5,6,7,8};                      //初始密码

/***************************************************************************
函数: unsigned char MatrixKey()
描述: dtmf取值函数
参数: 将DTMF解码数据编码为数值
返回: K
版本: VER1.0
日期: 2024-4-23
备注:
***************************************************************************/

unsigned char MatrixKey()
{
          unsigned char k=0;
        switch((P1>>2)&0x0f)
        {
                case        0x01:        k=1;        break;
                case        0x02:        k=2;        break;
                case        0x03:        k=3;        break;
                case        0x04:        k=4;        break;        
                case        0x05:        k=5;        break;
                case        0x06:        k=6;        break;
                case        0x07:        k=7;        break;
                case        0x08:        k=8;        break;
                case        0x09:        k=9;        break;
                case        0x0A:        k=0;        break;
                case        0x0B:        k='*';        break;
                case        0x0C:        k='#';        break;
                case        0x0D:        k='A';        break;
                case        0x0E:        k='B';        break;
                case        0x0F:        k='C';        break;
                case        0x00:        k='D';        break;
                default:        k=0xff;        break;
        }
        return k;
       
}

void main()
{
        P1M0 &= ~0x3f;
        P1M1 &= ~0x3f;
        P3M0 &= ~0xfc;
        P3M1 &= ~0xfc;
  //P1=0xff;
        LCD_Init();
        LCD_ShowString(1,1,"Password:");
        while(1)
        {
                KeyNum=MatrixKey();
                if(KeyNum)
                {
                        if(KeyNum<=10)        //如果S1~S10按键按下,输入密码
                        {
                                if(Count<4)        //如果输入次数小于4
                                {
                                        Password*=10;                                //密码左移一位
                                        Password+=KeyNum%10;                //获取一位密码
                                        Count++;        //计次加一
                                }
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                        if(KeyNum=='#')        //如果#按键按下,确认   任意键都可以
                        {
                                if(Password==initpassword[4])        //如果密码等于正确密码
                                {
                                        LCD_ShowString(1,11,"PassOK ");        //显示OK
                                         KEY=~KEY;                                                                                //打开继电器
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                                else                                //否则
                                {
                                        LCD_ShowString(1,12,"error");        //显示ERR
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                        }
                        if(KeyNum=='*')        //如果*按键按下,取消
                        {
                                Password=0;                //密码清零
                                Count=0;                //计次清零
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                }
        }
}



回复

使用道具 举报

ID:883242 发表于 2024-5-3 11:32 | 显示全部楼层
188610329 发表于 2024-5-2 23:13
确实,就一句话都还能写错……,还不如人家写复杂一点的…… 至少能保证对。

是你写错了。
回复

使用道具 举报

ID:161164 发表于 2024-5-3 14:48 | 显示全部楼层
bd5fna 发表于 2024-5-3 10:25
请各位大佬再帮忙看看,输入密码时任何键都不会显示,只有按下确认键会显示错误(任意键做确认键都会显示错 ...

STD 信号呢?
回复

使用道具 举报

ID:883242 发表于 2024-5-3 15:13 | 显示全部楼层
lkc8210 发表于 2024-5-3 10:25
虽然精妙,可惜楼主的0到9不是ASCII

我回复15楼,你的问题找15楼说去,别在我的帖子里面插嘴。
回复

使用道具 举报

ID:76027 发表于 2024-5-3 15:22 | 显示全部楼层

if(dtmf_ok==1)再检测按键也一样,不行。
回复

使用道具 举报

ID:161164 发表于 2024-5-3 15:53 | 显示全部楼层
Hephaestus 发表于 2024-5-3 15:13
我回复15楼,你的问题找15楼说去,别在我的帖子里面插嘴。

了解。。。。
回复

使用道具 举报

ID:161164 发表于 2024-5-3 15:53 | 显示全部楼层
bd5fna 发表于 2024-5-3 15:22
if(dtmf_ok==1)再检测按键也一样,不行。

咋加的?
回复

使用道具 举报

ID:69038 发表于 2024-5-3 17:08 | 显示全部楼层
Hephaestus 发表于 2024-5-3 15:13
我回复15楼,你的问题找15楼说去,别在我的帖子里面插嘴。

我是15楼的。
你这是咋啦??
论坛本就是公开的,有事论事,有什么插不插嘴?看到有不同意见的都可以说的。不然要这论坛何用?
回复

使用道具 举报

ID:76027 发表于 2024-5-3 18:56 | 显示全部楼层

while(1)
        {
                KeyNum=MatrixKey();
                if(dtmf_ok==1)
                {
                        if(KeyNum<=10)        //如果S1~S10按键按下,输入密码
                        {
                                if(Count<4)        //如果输入次数小于4
                                {
                                        Password*=10;                                //密码左移一位
                                        Password+=KeyNum%10;                //获取一位密码
                                        Count++;        //计次加一
                                }
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                        if(KeyNum=='#')        //如果#按键按下,确认
                        {
                                if(Password==initpassword[4])        //如果密码等于正确密码
                                {
                                        LCD_ShowString(1,11,"PassOK ");        //显示OK
                                         KEY=~KEY;                                                                                //打开继电器
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                                else                                //否则
                                {
                                        LCD_ShowString(1,12,"error");        //显示ERR
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                        }
                        if(KeyNum=='*')        //如果*按键按下,取消
                        {
                                Password=0;                //密码清零
                                Count=0;                //计次清零
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                }
        }
}

回复

使用道具 举报

ID:624769 发表于 2024-5-3 22:31 | 显示全部楼层

永远自信满满的样子,希望你能保持。自己看看你写的什么东西,返回值是什么再说吧
回复

使用道具 举报

ID:76027 发表于 2024-5-4 09:59 | 显示全部楼层
向各位大佬汇报一下目前的情况:用下面的代码,在不接入任何输入的情况下,开机就显示满屏的“0”,按键按下,显示一大串对应的键值而不是单个键值。注释掉按键代码,显示一大串字符。请教一下各位大佬,这个如何解?
#include <STC8.H>
//#include <string.h>
//#include <EEPROM.h>
#include <LCD1602.h>
#define     MAIN_Fosc       24000000L   //定义主时钟

sbit ALAM = P3^4;                //报警        
sbit KEY = P3^2;                //开锁
sbit dtmf_ok = P1^1; //双音频接收
sbit d0 = P1^2;
sbit d1 = P1^3;
sbit d2 = P1^4;
sbit d3 = P1^5;

unsigned char KeyNum,Count=0;
unsigned int Password=0;

unsigned char code initpassword[4]={5,6,7,8};                      //初始密码
unsigned char dat[]="0123456789*#ABCD";
/***************************************************************************
函数: unsigned char MatrixKey()
描述: dtmf取值函数
参数: 将DTMF解码数据编码为数值
返回: K
版本: VER1.0
日期: 2024-4-23
备注:
***************************************************************************/

unsigned char MatrixKey()
{
        unsigned char k=0;
  unsigned char Temp = (P1>>2) & 0x0F;
if(dtmf_ok==1)
{
   switch(Temp)
         
        {

                case        0x01:        k=1;        break;
                case        0x02:        k=2;        break;
                case        0x03:        k=3;        break;
                case        0x04:        k=4;        break;        
                case        0x05:        k=5;        break;
                case        0x06:        k=6;        break;
                case        0x07:        k=7;        break;
                case        0x08:        k=8;        break;
                case        0x09:        k=9;        break;
                case        0x0A:        k=0;        break;
                case        0x0B:        k='*';        break;
                case        0x0C:        k='#';        break;
                case        0x0D:        k='A';        break;
                case        0x0E:        k='B';        break;
                case        0x0F:        k='C';        break;
                                                                case        0x00:        k='D';        break;
               default:        k=0xff;        break;
        }
       }
                                return k;
                        
}

void main()
{
        P1M0 &= ~0x3f;
        P1M1 &= ~0x3f;
  P3M0 &= ~0xfc;
        P3M1 &= ~0xfc;
  //P1=0xff;
        LCD_Init();
        LCD_ShowString(1,1,"Password:");
        while(1)
        {
                KeyNum=MatrixKey();

                LCD_WriteData(dat[KeyNum]);
               
                /*if(KeyNum)
                {
                        if(KeyNum<=10)        //如果0-9按键按下,输入密码
                        {
                                if(Count<4)        //如果输入次数小于4
                                {
                                        Password*=10;                                //密码左移一位
                                        Password+=KeyNum%10;                //获取一位密码
                                        Count++;        //计次加一
                                }
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                        if(KeyNum=='#')        //如果#按键按下,确认
                        {
                                if(Password==initpassword[4])        //如果密码等于正确密码
                                {
                                        LCD_ShowString(1,11,"PassOK ");        //显示OK
                                         KEY=~KEY;                                                                                //打开继电器
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                                else                                //否则
                                {
                                        LCD_ShowString(1,12,"error");        //显示ERR
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                        }
                        if(KeyNum=='*')        //如果*按键按下,取消
                        {
                                Password=0;                //密码清零
                                Count=0;                //计次清零
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
                }*/
        }
}


回复

使用道具 举报

ID:76027 发表于 2024-5-5 12:35 | 显示全部楼层
已经改用下降沿触发检测按键,但还是开机满屏的‘0’。
回复

使用道具 举报

ID:69038 发表于 2024-5-6 16:26 | 显示全部楼层
没有原理图,我就脑补且认为你这个是DTMF解码、从8870的D0-D3口接P1^2-P1^5,获取数据的吧。如果不是,那我这个回复贴就是废话,无视之!unsigned char MatrixKey()
{
  unsigned char k=0;
  unsigned char Temp = (P1>>2) & 0x0F; //你在这边已赋值给temp了!不管有没有STD来,都是一个值!!!  //改成unsigned char Temp;
if(dtmf_ok==1) //因为前边的问题,这个判断已无意义
{
   //如果8870/9170DTMF解码,OE脚要置高,D0-D3脚才有电平出来,你可以在硬件上把OE与STD直连,并下拉一个几十K。
   //此处插入 读值D0-D3:(P1>>2) & 0x0F
   switch(Temp)
        {
                case        0x01:        k=1;        break;   //此分支返回,就是0x01, 直接ASC改成'1'
                case        0x02:        k=2;        break;  //0x02,
                case        0x03:        k=3;        break;//.
                case        0x04:        k=4;        break;    //    .
                case        0x05:        k=5;        break;//.
                case        0x06:        k=6;        break;//.
                case        0x07:        k=7;        break;//.
                case        0x08:        k=8;        break;//.
                case        0x09:        k=9;        break;//.
                case        0x0A:        k=0;        break;//此分支返回,就是0x00
                case        0x0B:        k='*';        break;//此分支返回,0x2A, 而你接下要用到的dat[]成员数才16个!!
                case        0x0C:        k='#';        break;//此分支返回,0x23!!!
                case        0x0D:        k='A';        break;//此分支返回,0x41!!!
                case        0x0E:        k='B';        break;//此分支返回,0x42!!!
                case        0x0F:        k='C';        break;//此分支返回,0x43!!!
                case        0x00:        k='D';        break;//此分支返回,0x44!!!
               default:        k=0xff;        break;           
        }
       }
  return k;
}


你这段代码switch(Temp)是分支筛选,与接下来的LCD_WriteData(dat[KeyNum]);这行也是分支筛选,功能重复了,为什么要2次?
直接把 case        0x01:        k=1;        break;  改成 case        0x01:        k=‘1’;        break;  一直改到‘0’这行。直接调用显示就OK了:
LCD_WriteData(k);
总之:数值套娃,还是套到错的数值。





回复

使用道具 举报

ID:1073352 发表于 2024-5-6 16:38 | 显示全部楼层

unsigned char MatrixKey()
{
        unsigned char k=0;
        switch((P2>>2)&0x0f)
        {
                case        0x01:        k=1;        break;
                case        0x02:        k=2;        break;
                case        0x03:        k=3;        break;
                case        0x08:        k=4;        break;        //我也不知道为什么你会有两个相同的按键状态
                case        0x05:        k=5;        break;
                case        0x06:        k=6;        break;
                case        0x07:        k=7;        break;
                case        0x08:        k=8;        break;
                case        0x09:        k=9;        break;
                case        0x0A:        k=0;        break;
                case        0x0B:        k='*';        break;
                case        0x0C:        k='#';        break;
                case        0x0D:        k='A';        break;
                case        0x0E:        k='B';        break;
                case        0x0F:        k='C';        break;
                case        0x00:        k='D';        break;
                default:        k=0xff;        break;
        }
        return k;
}
回复

使用道具 举报

ID:69038 发表于 2024-5-6 16:44 | 显示全部楼层
bd5fna 发表于 2024-5-5 12:35
已经改用下降沿触发检测按键,但还是开机满屏的‘0’。

你要确认,DTMF解码是否正常!d0-d3是否有输出!
把STD接个电阻串个LED,再把OE接到STD,看看每按一次键,led是否会闪亮一下。
回复

使用道具 举报

ID:76027 发表于 2024-5-6 19:52 | 显示全部楼层
zhuls 发表于 2024-5-6 16:44
你要确认,DTMF解码是否正常!d0-d3是否有输出!
把STD接个电阻串个LED,再把OE接到STD,看看每按一次键 ...

DTMF解码正常!d0-d3有输出!每按一次键,led会闪,STD输出高电平。用的是这种模块
回复

使用道具 举报

ID:76027 发表于 2024-5-6 21:02 | 显示全部楼层
本帖最后由 bd5fna 于 2024-5-7 09:37 编辑

目前的情况给各位大佬汇报一下:
void main()
{
        P1M0 &= ~0x3f;
        P1M1 &= ~0x3f;
  P3M0 &= ~0xfc;
        P3M1 &= ~0xfc;
  //P1=0xff;
        Timer0_Init();
        LCD_Init();
        UART_InitConfig();
        LCD_ShowString(1,1,"Password:");
        TI = 1;                                                                                                         //使用printf()函数时,TI必须为1
        while(1)
        {
                printf("%d ",k);
                LCD_WriteData(k);   这里可显示解码出来的键值,有一个现象,比如按下“1”键,显示的是一排16个“1”,不是单个。
               
                        if(k<=9)        //如果0-9按键按下,输入密码
                        {
                                if(Count<4)        //如果输入次数小于4
                                {
                                        Password*=10;                                //密码左移一位
                                        Password+=k%10;                //获取一位密码
                                        Count++;        //计次加一
                                }
                                LCD_ShowNum(2,1,Password,4);        //更新显示    注释掉   LCD_WriteData(k); 这里显示不了输入的键值。
                        
                                printf("%d ",Password);
                        }
                        if(k=='#')        //如果#按键按下,确认         按下“#”键后,显示“error”
                        {
                                if(Password==initpassword[4])        //如果密码等于正确密码
                                {
                                        LCD_ShowString(1,11,"PassOK ");        //显示OK
                                         jdq=~jdq;                                                                                //打开继电器
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                                else                                //否则
                                {
                                        LCD_ShowString(1,12,"error");        //显示ERR
                                        Password=0;                //密码清零
                                        Count=0;                //计次清零
                                        LCD_ShowNum(2,1,Password,4);        //更新显示
                                }
                        }
                        if(k=='*')        //如果*按键按下,取消   按“*”返回没有效果
                        {
                                Password=0;                //密码清零
                                Count=0;                //计次清零
                                LCD_ShowNum(2,1,Password,4);        //更新显示
                        }
        }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表