打印

帮我分析一下如何关掉数码管

[复制链接]
1739|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
interrupt_2013|  楼主 | 2013-4-12 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 interrupt_2013 于 2013-4-16 13:14 编辑


这是一个开关装置:上电后,三个小灯都不亮,按第一次按钮时,三个灯同时点亮,按第二次按钮时a灯灭,15秒后b灯灭,再隔18秒后c灯灭,用数码管显示秒计数。P0,P1接数码管段选,P2.0--P2.2接三个小灯,P2.3接小按钮。各位大侠帮我分析一下,如何关闭数码管。谢谢!
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit s1=P2^3;
uint8 num,num1,s1num;        
uint16 count;

const uint8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,
                                         0x92,0x82,0xf8,0x80,0x90};

void delay(uint8 z);
void init();
void keyscan();
void main()
{
        init();
        while(1)
        {
                keyscan();
        }        
}

void init()
{
               
        D1=1;
        D2=1;
        D3=1;
        num=0;
        num1=0;
        s1num=0;        
        count=0;
        TMOD=0x11;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        ET1=1;
}


void keyscan()
{
        if(s1==0)
        {
                delay(10);
                if(s1==0)
                {
                        s1num++;
                        while(!s1);
                        if(s1num==1)
                        {
                                D1=0;
                                D2=0;
                                D3=0;
                        }
                        if(s1num==2)
                        {
                                D1=1;
                                D2=0;
                                D3=0;
                                TR0=1;
                        }
                }
        
        }
}


void t0_timer() interrupt 1   
{        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                num++;
                if(num==15)
                {
                        D2=1;
                        num=0;
                        TR0=0;
                        TR1=1;
                }
                P1=table[num/10];
                P0=table[num%10];
        }                        
}

void t1_timer() interrupt 3  
{        
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        count++;
        if(count==20)
        {
                count=0;
                num1++;
                if(num1==18)
                {
                        num1=0;
                        D3=1;
                        TR1=0;        
                }
                P1=table[num1/10];
                P0=table[num1%10];        
        }        
}

void delay(uint8 z)   
{        
        uint16 i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}

相关帖子

沙发
dirtwillfly| | 2013-4-12 22:13 | 只看该作者
这是复制来的代码吧?

使用特权

评论回复
板凳
江枫渔火| | 2013-4-13 14:05 | 只看该作者
断电就行了

使用特权

评论回复
地板
ZYXUCBA| | 2013-4-13 14:17 | 只看该作者
这咋看啊

使用特权

评论回复
5
zsuqing| | 2013-4-13 22:05 | 只看该作者
这没个图 要看明白 滤清思路 还的浪费点时间

使用特权

评论回复
6
interrupt_2013|  楼主 | 2013-4-14 20:01 | 只看该作者
本帖最后由 interrupt_2013 于 2013-4-16 13:14 编辑

代码是自己看书后学者写出来的

使用特权

评论回复
7
interrupt_2013|  楼主 | 2013-4-14 20:03 | 只看该作者
本帖最后由 interrupt_2013 于 2013-4-16 13:15 编辑

谢谢各位

使用特权

评论回复
8
zero-minmin| | 2013-4-18 15:53 | 只看该作者
你是想在显示完毕后关掉数码管吗?如果是的话就只要在显示的最后给P0和P1口赋值就可以了。

使用特权

评论回复
9
hsqjg| | 2013-4-18 18:50 | 只看该作者
程序问题,真正不懂。帮你鼎!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

21

帖子

1

粉丝