OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4824|回复: 0

我写的密码锁只能按一次不能连按,这是为什么·啊,用的是原子的T9键盘

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2022-4-18
在线时间
7 小时
发表于 2022-9-12 21:14:11 | 显示全部楼层 |阅读模式
6金钱
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "touch.h"
#include "Lock.h"
    //数字表
u32 kbd_tbl[9]={1,2,3,4,5,6,7,8,9,};
//
u8 i=0,j=0,k;
u8 static code[6]={1,2,3,4,5,6};
u8 In_code[6]={0,0,0,0,0,0};
//
/***************************************************************   
if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根据LCD分辨率设置按键大小
        else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
        else {kbdxsize=60;kbdysize=40;}
****************************************************************************/

u16 kbdxsize=76;        //虚拟键盘按键宽度
u16 kbdysize=60;        //虚拟键盘按键高度
   char c[]={'X','0','k'};
///////////////////////////////////加载键盘界面//////////////////////////////
//x,y:界面起始坐标
void Display_lock(u16 x,u16 y)
{
    int i,h=0;
        int j=0,k=0,g=0;
        POINT_COLOR=RED;
    LCD_DrawRectangle(x,y,x+kbdxsize*3,y-30);       
        LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*4);                                                  
        LCD_DrawRectangle(x+kbdxsize,y,x+kbdxsize*2,y+kbdysize*4);                                                  
        LCD_DrawRectangle(x,y+kbdysize*2,x+kbdxsize*3,y+kbdysize*3);
    LCD_DrawRectangle(x,y+kbdysize,x+kbdxsize*3,y+kbdysize);
        POINT_COLOR=BLUE;
    LCD_ShowNum(x+40,y-25,In_code[0],1,24);
    LCD_ShowNum(x+60,y-25,In_code[1],1,24);
    LCD_ShowNum(x+80,y-25,In_code[2],1,24);
    LCD_ShowNum(x+100,y-25,In_code[3],1,24);
    LCD_ShowNum(x+120,y-25,In_code[4],1,24);
    LCD_ShowNum(x+140,y-25,In_code[5],1,24);   

         //显示数字,高位为0,则不显示
    //x,y :起点坐标         
    //len :数字的位数
    //size:字体大小  12-16-24
    //color:颜色
    //num:数值(0~4294967295);         
    LCD_ShowNum(x+26,y+18,1,1,24);
     for(j=0;j<3;j++)
    {
        if(j==0)
            {
                for(k=0;k<3;k++)
                {
                LCD_ShowNum(x+kbdxsize*h+26,y+18,kbd_tbl[i],1,24);
                i++; h++;
                }
                h=0;
            }
        if(j==1)
            {
                for(k=0;k<3;k++)
                {
                LCD_ShowNum(x+kbdxsize*h+26,y+18+kbdysize*1,kbd_tbl[i],1,24);
                i++; h++;
                }
                h=0;
            }
        if(j==2)
            {
                for(k=0;k<3;k++)
                {
                LCD_ShowNum(x+kbdxsize*h+26,y+18+kbdysize*2,kbd_tbl[i],1,24);
                i++; h++;
                }
                h=0;
            }            

    }
for(k=0;k<3;k++)
     {
         LCD_ShowChar(x+kbdxsize*h+26,y+18+kbdysize*3,c[g],24,1);
            g++;h++;
       }
}

/////////////////////////////////////触摸部分////////////////////////////////

//在指定宽度的中间显示字符串
//如果字符长度超过了len,则用Show_Str显示
//len:指定要显示的宽度                          

//按键状态设置
//x,y:键盘坐标
//key:键值(0~8)
//sta:状态,0,松开;1,按下;
void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{                  
        u16 i=keyx/3,j=keyx%3;
        if(keyx>12)return;
        if(sta)LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
        else LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
        //Show_Str_Mid(x+j*kbdxsize,y+4+kbdysize*i,(u8*)kbd_tbl[keyx],16,kbdxsize);               
        //Show_Str_Mid(x+j*kbdxsize,y+kbdysize/2+kbdysize*i,(u8*)kbs_tbl[keyx],16,kbdxsize);                 
}



//获得键盘输入
//X,Y键盘坐标
//返回键盘值
u8 Touch_lock(u16 x,u16 y)
{
    u16 i,j;
    static u8 key_x=0;
    u8 key=0; //键值
    tp_dev.scan(0);          //扫描触摸屏.0,屏幕扫描;1,物理坐标;
    if(tp_dev.sta&&TP_PRES_DOWN)     //触摸屏被按下
    {
         for(i=0;i<4;i++)
        {
                for(j=0;j<3;j++)
                {
                   if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)&&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize))
                   {
                       key=j+i*3+1;   
                       break;
                   }                       
                }
                if(key)
                {
                    if(key_x==key)key=0;
                    else
                    {

                                        py_key_staset(x,y,key_x-1,0);
                                        key_x=key;
                                        py_key_staset(x,y,key_x-1,1);

                    }
                    break;
                }   
        }
    }
    else if(key_x)
        {
py_key_staset(x,y,key_x-1,0);
                key_x=0;
        LED1=0;
        delay_ms(50);
        LED1=1;
        }
           
    return key;
}

//判断键值输入

void inport_keynum(u16 x,u16 y,u8 key)
{
    switch(key)
    {
        case 1:
           LCD_ShowNum(x+10,y-30,1,1,24);
        break;
        case 2:
           LCD_ShowNum(x+10,y-30,2,1,24);
        break;
        case 3:
           LCD_ShowNum(x+10,y-30,3,1,24);
        break;
        case 4:
           LCD_ShowNum(x+10,y-30,4,1,24);
        break;
        case 5:
           LCD_ShowNum(x+10,y-30,5,1,24);
        break;
        case 6:
           LCD_ShowNum(x+10,y-30,6,1,24);
        break;
        case 7:
           LCD_ShowNum(x+10,y-30,7,1,24);
        break;      
        case 8:
           LCD_ShowNum(x+10,y-30,8,1,24);
        break;
        case 9:
           LCD_ShowNum(x+10,y-30,9,1,24);
        break;
        case 10:
           LCD_ShowNum(x+10,y-30,10,2,24);
        break;
        case 11:
           LCD_ShowNum(x+10,y-30,11,2,24);
        break;
        case 12:
           LCD_ShowNum(x+10,y-30,12,2,24);
        break;      
        default :
            key = 0;
        break;
    }
}



u8  identify_code(u8 key)
{
   u8 state=0;
    if(key!=0)
    {
        if((key<10||key==11)&&i<6)
        {   
            LED1=0;
        delay_ms(10);
        LED1=1;
            if(key==11){key=0;}
            switch(key)
            {
                case 0:
                    In_code[i]=key;i++;
                    break;
                case 1:
                    In_code[i]=key;i++;
                    break;
                case 2:
                    In_code[i]=key;i++;
                    break;
                case 3:
                    In_code[i]=key;i++;
                    break;
                case 4:
                    In_code[i]=key;i++;
                    break;

                case 5:
                    In_code[i]=key;i++;
                    break;
                case 6:
                    In_code[i]=key;i++;
                    break;
                case 7:
                    In_code[i]=key;i++;
                    break;
                case 8:
                    In_code[i]=key;i++;
                    break;
                case 9:
                    In_code[i]=key;i++;
                    break;
            }

        }
        else
            {
                i=0;key=0;
                for(k=0;k<6;k++)
                {
                    if(In_code[k] == code[k]){j++;}
                }
                if(j==6)
                {
                    j=0; state=1;
                }
                else{j=0;state=0;}
            }
        if(key==10)
        {
          In_code[i]=0;
                if(i>0)
                {i--;LED1=0;delay_ms(10);LED1=1;}
                key=0;
        }
    }
    return state;
}


void lock(u16 x,u16 y)
{
    u8 key,state;
     Display_lock(x,y);
        key=Touch_lock(x,y);
        inport_keynum(x+4,y,key);
     state= identify_code(key);

    if(state==1)
    {
        LCD_Fill(x+160,y-20,x+360,y+20,WHITE);
       LCD_ShowString(x+160,y-20,200,40,24,"OPEN");  LED1=0;
    }

}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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