秃头战神 2021-09-17 17:03 采纳率: 0%
浏览 161

51如何进行矩阵键盘与多位数码管的连续输入通过数码管显示

最近在做一些小东西,一个通过矩阵键盘实现直接输入数据进行调整时间的电子时钟,要求用51完成,现在卡在的地方是矩阵键盘可以输入但是只可以修改第一位,后面的数字都不能修改。下面附上代码以及仿真图。

#include<reg52.h>
#include<stdlib.h>
#include<stdio.h>
#include<intrins.h>
#define  KEY_PORT P1
#define  time_str P0
#define  weixuansmg P2
sbit stop=P3^0;
sbit exit=P3^3;
sbit move_bit=P3^4;
typedef unsigned char uchar;
typedef unsigned int uint;

// uchar code num[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};  // 0~9
uchar chars[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar code weixuan[8]={0x80,0x40,~0x20,~0x10,~0x08,~0x04,~0x02,~0x01};
uchar  time[8]={1,2,10,5,9,10,5,0};

uchar model_choice=0,mdl=0;
uchar time_key=0,time_key1=0;
uchar change_time=0;
uchar input_bit0=0,input_bit1=0,input_bit2=0,input_bit3=0,input_bit4=0,input_bit5=0,input_bit6=0,input_bit7=0;
uchar last_input_bit=0;
uchar kp=0;

uint counter = 0;
sbit change = P3^0;
sbit naozhong = P3^1;

void delay(uint x){
    uchar i=0;
    while(--x!=0)
    {
         for(i=0;i<125;i++);
    }
}



uchar KeyScan(void)
{
    uchar val = 0;
    KEY_PORT = 0x0f;    
    if(KEY_PORT!=0x0f){    
        delay(10);        
        if(KEY_PORT != 0x0f)
        {  
            switch(KEY_PORT)
            {    
                 case 0x07:val = 1;break; 
                 case 0x0b:val = 2;break; 
                 case 0x0d:val = 3;break; 
                 case 0x0e:val = 4;break;
                 default: break;
            }
             KEY_PORT = 0xf0;
             switch(KEY_PORT)
             { 
                 case 0x70:val = val+0;break;
                 case 0xb0:val = val+4 ;break;
                 case 0xd0:val = val+8;break;
                 case 0xe0:val = val+12;break;
                 default:break;
            }
            return val;
        }
    }
}


void display()
{
    uchar tick=0x01;
    uchar index;
    for(index=0;index<=7;index++)
    {
        weixuansmg = ~tick;
        time_str = chars[time[index]];
        tick = tick<<1;
        delay(2);

    }
    

}



void ALL_zero()
{
    time[0]=0;
    delay(50);
    time[1]=0;
    delay(50);
    time[3]=0;
    delay(50);
    time[4]=0;
    delay(50);
    time[6]=0;
    delay(50);
    time[7]=0;
    delay(50);
}

void S_zero()
{
    time[6]=0;
    time[7]=0;
}

void M_zero()
{
    time[3]=0;
    time[4]=0;
}

void H_zero()
{
    time[0]=0;
    time[1]=0;
}

void change_all()
{

    uchar tick=0x01;
    uint times=0;
    uchar c_key=0,c_key1=0;
    c_key=KeyScan();
    
        if (c_key!=0)
        {
             c_key1=c_key;
             while (c_key!=0)
            {
                time[times]=c_key1;
                times++;
            }
        }
}



void stop_time()
{
    if(stop==0)
    {
        delay(10);
        if(stop==0)
        {
            TR0=0;
        }
    }
}    



void out(){
    TMOD = 0x01;
    TH0 = 15536/256;
    TL0 = 15536%256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}


void main()
{
    out();

while (1)
{
    display();

    stop_time();
    model_choice=KeyScan();
    if (model_choice!=0)
    {
        switch (model_choice)
        {
        case 13:ALL_zero();
        mdl=1;
        break;
        case 14:S_zero();
        mdl=2;
        break;
        case 15:M_zero();
        mdl=3;
        break;
        case 16:H_zero();
        mdl=4;
        break;
        default:
            break;
        }
    }
        switch (mdl)
        {
        case 1:
            input_bit0=KeyScan();
            if (input_bit0!=0&kp==0)
            {
                time[change_time]=input_bit0; 
                change_time++;
                input_bit0=0;
                kp==1;
                if (change_time==2)
                {
                    time[change_time]=10;
                    change_time++;
                }
                if (change_time==5)
                {
                    time[change_time]=10;
                    change_time++;
                }
                if (change_time==8)
                {
                    change_time=0;
                }
                
                
            }
            break;
        
        default:
            break;
        }
    }   
}   



void timer0_Init() interrupt 1
{

    counter++;

    if(counter == 20)
    {
        time[7]++;
        if (time[7]>9)
        {
            time[7]=0;
            time[6]++;
            if (time[6]>5)
            {
                time[7]=0;
                time[6]=0;
                time[4]++;
                if (time[4]>9)
                {
                    time[7]=0;
                    time[6]=0;
                    time[4]=0;
                    time[3]++;
                    if (time[3]>5)
                    {
                        time[7]=0;
                        time[6]=0;
                        time[4]=0;
                        time[3]=0;
                        time[1]++;
                        if (time[1]>9)
                        {
                            time[7]=0;
                            time[6]=0;
                            time[4]=0;
                            time[3]=0;
                            time[1]=0;
                            time[0]++;

                        }
                        if (time[0]>1)
                        {
                            if (time[1]>3)
                            {
                                time[7]=0;
                                time[6]=0;
                                time[4]=0;
                                time[3]=0;
                                time[1]=0;
                                time[0]=0;
                            }
                            
                        }
                        
                        
                    }
                    
                }
                
            }
            
        }
        counter=0;

    }
}



img

  • 写回答

1条回答 默认 最新

  • 不咕鸟会咕咕 2023-02-19 19:25
    关注

    你的问题在于change_all()函数只能将连续输入的数字存储在数组中,而没有实现允许修改任意数字的功能。为了实现这一点,您需要先选择要修改的数字,然后允许用户键入一个新数字并将其存储在所选位置。下面是一种可能的解决方案:

    
    void change_time_num()
    {
        uchar selected_num = 0;
        uchar new_num = 0;
        uchar key = 0;
        delay(10);
        key = KeyScan();
        if (key != 0) {
            switch (key) {
                case 1: selected_num = 0; break;
                case 2: selected_num = 1; break;
                case 4: selected_num = 2; break;
                case 8: selected_num = 3; break;
                case 16: selected_num = 4; break;
                case 32: selected_num = 5; break;
                case 64: selected_num = 6; break;
                case 128: selected_num = 7; break;
                default: break;
            }
            delay(10);
            key = KeyScan();
            if (key != 0) {
                new_num = key % 10;
                time[selected_num] = new_num;
            }
        }
    }
    
    

    这个函数首先扫描按键,选择要修改的数字,然后再次扫描按键,选择要替换的数字。然后将新数字存储在数组中。请注意,如果用户按下了第一个数字键,它会被视为选择要修改的第一个数字,而不是输入新数字。

    你需要将change_all()函数改为调用change_time_num()函数,并使用if (mdl == 3) 来调用该函数。使用一个类似于mdl变量的状态变量来跟踪当前的模式会使代码更加清晰和易于维护。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月17日

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧