找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2072|回复: 4
收起左侧

单片机一位数码管秒表显示程序有问题

[复制链接]
ID:797796 发表于 2020-7-16 11:27 | 显示全部楼层 |阅读模式
300黑币
程序要求按 A 键再按 B 键后,显示两键按下之间的时间 t(t <60s),单位为 ms。由于程序框图的规定要求,我在一位大佬的程序基础上修改了display()显示函数,可是修改后能正常显示,但再一次按下A键后没有反应,仍然循环显示时间,请问这个函数应该怎样修改才能实现按键后重新计时呢?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit A1=P3^4;
sbit A2=P3^5;
uint m=0;
uint count,t,d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar cnt[6]={0};//小数缓存
bit flag=0;
bit init=0;

void delay(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=67;c>0;c--)
        for(b=124;b>0;b--)
            for(a=167;a>0;a--);
}

void start()
{
        TMOD=0x01; //T0 使用工作方式 1
        TH0=(65536-1000)/256; //1ms 定时
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
            TR0=1;
}

void display()  //显示子程序,从第一位开始逐位显示't 00秒 000毫秒'
{
        static uint j;
        if(flag)
                P0=0xbf;//等待计数时显示'-'
        else
        {        
                                if(init==1)
                                for(j=6;j>0;j--)
                                {P0=cnt[j];
                                delay();
                                }
        }
}
void main(void)
{
        start();
        P0=0xb7;//上电提示符
        while(1)
        {
                if(A1==0 && flag==0) //按键扫描
                {
                        flag=1;
                        count=0;                                
                        t=0;
                        init=1;                                                
                }
                if(A2==0 && flag==1)
                {
                                                while(!A2);
                        flag=0;
                        cnt[6]=0xbf;
                        cnt[5]=table[t/10];
                        cnt[4]=table[t%10];//加秒点
                        cnt[3]=table[count/100];
                        cnt[2]=table[count/10%10];
                        cnt[1]=table[count%10];
                        m=0;
                }
                                display();
        }
}

void time0(void) interrupt 1 //T0 中断服务子程序
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        if(flag)
        {
                count++;
                if(count>=1000)
                {
                        count=0;
                        t++;
                        if(t>=60)
                        {
                                t=0;
                        }
                }
        }
}

捕获.PNG
截图.jpg

最佳答案

查看完整内容

//----------------试试以下代码 #include #define uchar unsigned char #define uint unsigned int sbit A1=P3^4; sbit A2=P3^5; uint m=0; //uint t,d,e,f; uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12}; uchar cnt[6]={0};//小数缓存 bit flag=0; bit init=0; unsigned long SysTick,count,t; //new add void delay(void) //误差 0us { unsigned char a,b,c; fo ...
回复

使用道具 举报

ID:451718 发表于 2020-7-16 11:27 | 显示全部楼层
//----------------试试以下代码
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit A1=P3^4;
sbit A2=P3^5;
uint m=0;
//uint t,d,e,f;
uchar code table[]={0x14,0xde,0x38,0x1a,0xd2,0x13,0x11,0x9e,0x10,0x12};
uchar cnt[6]={0};//小数缓存
bit flag=0;
bit init=0;

unsigned long SysTick,count,t;     //new add

void delay(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=67;c>0;c--)
        for(b=124;b>0;b--)
            for(a=167;a>0;a--);
}

void start()
{
        TMOD=0x01; //T0 使用工作方式 1
        TH0=(65536-1000)/256; //1ms 定时
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
            TR0=1;
}

void display()  //显示子程序,从第一位开始逐位显示't 00秒 000毫秒'
{
        static uint j;
        if(flag)
                P0=0xbf;//等待计数时显示'-'
        else
        {        
                                if(init==1)
                                for(j=6;j>0;j--)
                                {P0=cnt[j];
                                delay();
                                }
        }
}

void main(void)
{
        start();
        P0=0xb7;//上电提示符
        while(1)
        {
                if(A1==0) //按键扫描
                {
                        flag=1;
                        //count=0;                                
                        //t=0;
                        //init=1;                                                
                }
                if(A2==0 && flag==1)
                {
                     while(!A2);
                        flag=0;
                        cnt[6]=0xbf;
                        cnt[5]=table[t/10000];
                        cnt[4]=table[t/1000%10];//加秒点
                        cnt[3]=table[t/100%10];
                        cnt[2]=table[t/10%10];
                        cnt[1]=table[t%10];
                        //m=0;
                }
                 display();
        }
}

void time0(void) interrupt 1 //T0 中断服务子程序
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
                SysTick++;
        if(A1==0)
        {
            count = SysTick;               
        }
                if(A2==0 && flag==1)
        {
                    t = SysTick - count;
                        flag = 0;
            }
}
回复

使用道具 举报

ID:804115 发表于 2020-7-16 12:25 | 显示全部楼层
本帖最后由 1692483014 于 2020-7-16 12:31 编辑

    display函数一行改为
if(init==1&&flag==0)
就好了
回复

使用道具 举报

ID:804115 发表于 2020-7-16 12:29 | 显示全部楼层
刚写错了是
    if(init==1&&flag==0)
回复

使用道具 举报

ID:739545 发表于 2020-7-16 13:57 | 显示全部楼层
把t=0放到cnt[1]=table[count%10];
                        m=0;
后面,并使EA=0,在if(A1==0 && flag==0) //按键扫描里面添加EA=1;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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