单片机学习小组
直播中

elecfans

16年用户 1709经验值
擅长:可编程逻辑
私信 关注

如何去实现基于单片机的答题计数器+数码管滚动显示设计呢

如何去实现基于单片机的答题计数器+数码管滚动显示设计呢?

回帖(1)

梁若莲

2022-2-23 10:52:41
实现效果:

/*
* @Author: Guoquan Wei
* @Date: 2018-01-23 11:03:32
* @Last Modified by: Guoquan Wei
* @Last Modified time: 2018-01-23 11:12:22
*/
#include
#define uchar unsigned char
#define uint unsigned int
uchar datable[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //定义段选
uchar watable[] = {0x3f, 0x1f, 0x2f, 0x37, 0x3b, 0x3d, 0x3e};                                                                                                                //定义位选,位选六位,最高两位初始化定为零
uchar lovetable[] = {5, 2, 0, 1, 3, 1, 4};
uchar *start = lovetable; //只是记录lovetable首地址,它不会改变
uchar *p = lovetable;         // 指针
uchar *q;
***it dula = P2 ^ 6;
***it wela = P2 ^ 7;
#define KEY P3

int truenum, totalnum;
uchar flag;

void delayms(int x)
{
        int i, j;
        for (i = 0; i < x; i++)
                for (j = 0; j < 110; j++)
                        ;
}

void display(uchar numdis) //numdis是要显示的数字
{
        uchar shi, ge;
        shi = numdis / 10;
        ge = numdis % 10;

        dula = 1;
        P0 = datable[shi];
        dula = 0;
        P0 = 0xff;
        wela = 1;
        P0 = watable[2];
        wela = 0;
        delayms(1);

        dula = 1;
        P0 = datable[ge];
        dula = 0;
        P0 = 0xff;
        wela = 1;
        P0 = watable[1];
        wela = 0;
        delayms(1);
}

void display1(uchar numdis) //numdis是要显示的数字
{
        uchar shi, ge;
        shi = numdis / 10;
        ge = numdis % 10;

        dula = 1;
        P0 = datable[shi];
        dula = 0;
        P0 = 0xff;
        wela = 1;
        P0 = watable[6];
        wela = 0;
        delayms(1);

        dula = 1;
        P0 = datable[ge];
        dula = 0;
        P0 = 0xff;
        wela = 1;
        P0 = watable[5];
        wela = 0;
        delayms(1);
}

//-------------------------------------------
unsigned char Keyboard(void)
{
        unsigned char x, y, z = 0, jz;
        KEY = 0xf0;                 //低四位置低,即行接低
        if (KEY != 0xf0) //是否有按键按下
        {
                delayms(100);        //去抖
                if (KEY != 0xf0) //确实有按键按下
                {
                        x = KEY;        //读取按键所在的行
                        KEY = 0x0f; //高四位置低,即列接低
                        y = KEY;        //读取按键所在的列
                        z = x | y;  //按键的坐标为行+列
                        while (KEY != 0x0f)
                                ; //等待按键抬起
                }
        }
        switch (z)
        {
        case 0xee:
        {
                jz = 0;
                break;
        } //按键值显示为0
        case 0xde:
        {
                jz = 1;
                break;
        } //按键值显示为1
        case 0xbe:
        {
                jz = 2;
                break;
        }
        case 0x7e:
        {
                jz = 3;
                break;
        }

        case 0xed:
        {
                jz = 4;
                break;
        }
        case 0xdd:
        {
                jz = 5;
                break;
        }
        case 0xbd:
        {
                jz = 6;
                break;
        }
        case 0x7d:
        {
                jz = 7;
                break;
        }

        case 0xeb:
        {
                jz = 8;
                break;
        }
        case 0xdb:
        {
                jz = 9;
                break;
        }
        case 0xbb:
        {
                jz = 10;
                break;
        }
        case 0x7b:
        {
                jz = 11;
                break;
        }

        case 0xe7:
        {
                jz = 12;
                break;
        }
        case 0xd7:
        {
                jz = 13;
                break;
        }
        case 0xb7:
        {
                jz = 14;
                break;
        }
        case 0x77:
        {
                jz = 15;
                break;
        }
        default:
        {
                jz = 16;
                break;
        } // 没有按键按下,返回16
        }
        return jz;
}

/*if (key == 0) //答题正确
        {
                truenum++;
                totalnum++;
                flag = 1;
        }
        if (key == 1) //答题错误
        {
                totalnum++;
                flag = 2;
        }
        if (key == 2)
        {
                if (flag == 1)
                {
                        if (totalnum > 0)
                        {
                                truenum--;
                                totalnum--;
                        }
                }
                if (flag == 2)
                {
                        if (totalnum > 0)
                        {
                                totalnum--;
                        }
                }
                flag = 0; //表明本次执行的是按键3
        }*/

int main()
{
        uchar key;
        int i, j, k;
        while (totalnum < 3)
        {
                display(truenum);
                display1(totalnum);
                key = Keyboard();
                if (key == 0) //答题正确
                {
                        truenum++;
                        totalnum++;
                        flag = 1;
                }
                if (key == 1) //答题错误
                {
                        totalnum++;
                        flag = 2;
                }
                if (key == 2)
                {
                        if (flag == 1)
                        {
                                if (totalnum > 0)
                                {
                                        truenum--;
                                        totalnum--;
                                }
                        }
                        if (flag == 2)
                        {
                                if (totalnum > 0)
                                {
                                        totalnum--;
                                }
                        }
                        flag = 0; //表明本次执行的是按键3
                }
        }

        /*while (1)
        {
                dula = 1;
                P0 = datable[5];
                dula = 0;
                P0 = 0xff;
                wela = 1;
                P0 = watable[3];
                wela = 0;
                delayms(1);

                dula = 1;
                P0 = datable[2];
                dula = 0;
                P0 = 0xff;
                wela = 1;
                P0 = watable[2];
                wela = 0;
                delayms(1);

                dula = 1;
                P0 = datable[0];
                dula = 0;
                P0 = 0xff;
                wela = 1;
                P0 = watable[1];
                wela = 0;
                delayms(1);
        }*/
        while (1)
        {
        //start存储lovetable的首地址,且一直都不变;q是一直存储着start+k的地址,在内层的for循环里是不变的,q其实表示最左边数码管在一段时间内要显示的数对应的lovetable的地址;只有p一直在变,它用来显示段选
                for (k = 0; k < 7; k++)
                        for (i = 1, j = 0, q = p = start + k; j < 300; i++, j++)
                        {
                                if (i >= 7)
                                {
                                        i = 1;
                                }
                                dula = 1;
                                P0 = datable[*p++];
                                if (p >= start + 7)//p指向lovetable末尾的下一位时,把p移到start
                                {
                                        p = start;
                                }
                                if (p - q == 6 || q - p == 1)//因为数码管是6位,而要显示7位,所以只能选取其中的六位。当p在q的后面时,p-q==6时,就要归位了;当q在p的后面时,则q-p==1时归位。
                                {
                                        p = q;
                                }
                                dula = 0;
                                P0 = 0xff;
                                P0 = 0xff;
                                P0 = 0xff;
                                P0 = 0xff;
                                P0 = 0xff;
                                wela = 1;
                                P0 = watable[7 - i];
                                wela = 0;
                                P0 = 0xff;
                                P0 = 0xff;
                                delayms(5);
                        }
        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分