欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3500|回復: 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 單片機教程網

快速回復 返回頂部 返回列表