找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 3279 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-7-16 11:27

正文摘要:

程序要求按 A 键再按 B 键后,显示两键按下之间的时间 t(t <60s),单位为 ms。由于程序框图的规定要求,我在一位大佬的程序基础上修改了display()显示函数,可是修改后能正常显示,但再一次按下A键后没有反应, ...

回复

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;
ID:804115 发表于 2020-7-16 12:29
刚写错了是
    if(init==1&&flag==0)
ID:804115 发表于 2020-7-16 12:25
本帖最后由 1692483014 于 2020-7-16 12:31 编辑

    display函数一行改为
if(init==1&&flag==0)
就好了
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;
            }
}

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

Powered by 单片机教程网

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