4*4键盘控制4位数码管输出的程序问题

2019-07-18 11:08发布

我想用4*4键盘做输入,控制4位共阳数码管显示,前两位输出字母(dc),后两位输出数字,然后步进值为1,但做出来却是步进值为0.1,只能显示0.0到9.9的数字,下面是我的代码和仿真图,各路大神看看我改怎么改,本人菜鸟一个,最近课程设计要用到,时间不够也来不及学习了,请大家帮帮忙吧
#include <AT89X51.H>
/*定义全局变量*/
unsigned char v,v1,v10;        //定义电压v,个位v1,十位v10
unsigned char state;//定义状态:直流DC,方波SQ
/*
定义4*4矩阵键盘键值
P1.0(e)                7                        8                        9                        直流
P1.1(d)                4                        5                        6                        方波
P1.2(b)                1                         2                        3                        0
P1.3(7)                0                        UP                        DOWN                0
                        P1.4(e)                P1.5(d)                P1.6(b)                P1.7(7)

*/
unsigned char code keyword[16]={
                                                                        0xee,0xed,0xeb,0xe7,
                                                                        0xde,0xdd,0xdb,0xd7,
                                                                        0xbe,0xbd,0xbb,0xb7,
                                                                        0x7e,0x7d,0x7b,0x77
                                                                };

/*定义P1.4-P1.7扫描码*/
unsigned char code ksp[4]={0xef,0xdf,0xbf,0x7f};

/* 键值码值转换表*/
unsigned char code keynum[16]={7,4,1,0,8,5,2,10/*上UP*/,9,6,3,11/*下DOWN*/,12/*直流DC*/,13/*方波SQ*/,0,0};

/*键盘扫描时间延迟函数*/
void delay_key()
{
        unsigned char i,j;                  
                for (i=0;i<5;i++)
                        for(j=0;j<255;j++);
}

/*数码管段选编码表*/
unsigned char code dpcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};        //不带小数点dp的显示编码

unsigned char code dpcodedp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};        //带小数点dp的显示编码

/*数码管扫描时间延迟函数*/
void delay_dp()
{
        unsigned char i,j;                  
                for (i=0;i<2;i++)
                        for(j=0;j<200;j++);
}

/*波形电压频率延迟函数*/
void delay_f1()
{
        unsigned char i,j;                  
                for (i=0;i<100;i++)
                        for(j=0;j<255;j++);
}

/*键盘、数码管、电压扫描函数*/
unsigned char keypad_scan()
{
        unsigned char key,i;
        P1=0xf0;        //P1赋值11110000
    while (P1!=0xf0);        //如果P1不等于11110000,则有键按下
    do
        {
                /*数码管扫描*/
                P3=0x01;
                P0=dpcode[v1];
                delay_dp();
                P3=0x02;
                P0=dpcodedp[v10];
                delay_dp();
                /*电压扫描*/
                if (state==12)        //直流
                {
                        P3=0x04;
                        P0=0xa7;
                        delay_dp();
                        P3=0x08;
                        P0=0xa1;
                        delay_dp();
                        P2=v;
                }
                else if(state==13)        //方波
                {
                        P3=0x04;
                        P0=0x92;
                        delay_dp();
                        P2=v;
                        delay_f1();
                        P3=0x08;
                        P0=0x98;
                        delay_dp();
                        P2=0;
                        delay_f1();
                }
                for(i=0;i<=3;i++)        //循环扫描4次
                        {
                                P1=ksp;        //依次赋值扫描码11101111,11011111,10111111,01111111
                                if(P1!=ksp)        //P1不等于以上4种状态就说明有键按下
                                {
                                        delay_key();        //延时去抖动
                                        key=P1;        //读入P1的状态
                                        if(key!=ksp)        //确定键是否真的按下
                                                return(key);        //返回扫描码

                                }
                        }
        }
        while(1);
}

/*返回键值函数*/
unsigned char gotkey()
{
        unsigned char temp,i;
        temp=keypad_scan();
        for (i=0;i<16;i++)        //与键值码逐一比较,直到相等就返回键的ID号(i),都不相等则说明没有键按下,返回16.
        {
                if(temp==keyword)
                        return(keynum);
        }
        return(16);
}

/*主函数*/
void main()
{       
        unsigned char temp1,temp2;        //键盘输入暂存
        state=12;        //状态默认为直流
        P2=0;        //给P2口置0,即输出电压为0
        v=0;        //电压V置0
        v1=0;v10=0;        //清空v1,v10
        while(1)
        {
                temp1=gotkey();
                if (temp1==12||temp1==13)//当按键为12(直流dc)或13(方波sq)时,标记state状态
                        state=temp1;
                else if (temp1==10)//当按键为10(上UP)时,标记v,v10,v1
                {
                        if (v==99)
                        {
                                v=0;v1=0;v10=0;
                        }
                        else
                        {
                                v=v+1;
                                if (v1==9)
                                {
                                        v1=0;v10=v10+1;
                                }
                                else
                                {
                                        v1=v1+1;
                                }
                        }
                }
                else if (temp1==11)//当按键为11(下DOWN)时,标记v,v10,v1
                {
                        if(v==0)
                        {
                                v=99;v1=9;v10=9;
                        }
                        else
                        {
                                v=v-1;
                                if (v1==0)
                                {
                                        v1=9;v10=v10-1;
                                }
                                else
                                {
                                        v1=v1-1;
                                }
                        }
                }
                else//当按键为其他数字时,标记为相应的v,v10,v1
                {
                        v10=temp1;
                        v1=10;
                        temp2=gotkey();
                        v1=temp2;
                        v=v10*10+v1;
                }
        }               
}

控制显示输出.DSN (136.24 KB, 下载次数: 11)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
淘宝星外人
1楼-- · 2019-07-18 15:13
 精彩回答 2  元偷偷看……
chenwei6991627
2楼-- · 2019-07-18 16:50
那应该就是数码管解码的问题了

一周热门 更多>