搜索
bottom↓
回复: 0

四个数码管,四个中断,两组数字显示的程序求助

[复制链接]

出0入0汤圆

发表于 2017-11-25 10:31:06 | 显示全部楼层 |阅读模式
四个数码管,前两位显示两个数字,后两位计数。分别按按键,前两位两个数字会加减,后两位两个数字也会加减。我用两个外中断和两个计数器做。编译无错误无警告。实物输入程序后无显示,请问各位前辈,我该怎么修改程序,谢谢大家,辛苦!劳驾了!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                 //段码
uchar code weima[4]={0xef,0xdf,0xbf,0x7f};                                                                                 //位码
uchar disp[4]={0,0,0,0};                                                                                                                 //显示数字
static uchar second=44;                                                                                                                                 //时间显示
static uchar count=53;                                                                                                                                         //计数显示
uchar f=0;
sbit duan=P2^6;                                                                                                                                         //段锁
sbit wei=P2^7;                                                                                                                                         //位锁
void int0_init(void)                                  //外中断P3.2初始化
{
        EA =1;                                                           //全局中断允许
        IT0 =1;
        EX0 =1;
}
void int1_init(void)                                   //外中断P3.3初始化
{
    EA=1;                                                           //全局中断允许
        IT1=1;
        EX1=1;
}

void duan_lock(void)                                  //段锁
{
        duan=1;
        _nop_();
        _nop_();
        duan=0;
}
void wei_lock(void)                                           //位锁
{
        wei=1;
        _nop_();
        _nop_();
        wei=0;
}
void time_init(void)                           //定时器初始化
{
        TMOD=0x01;                                                //16位定时器1
        TH0=(65536-2500)/256;                        //定时器高八位
        TL0=(65536-2500)%256;                        //定时器低八位
        TF0=0;                                                        //定时器没启动前清零
        TR0=1;                                                        //定时器启动
}
void timer0_init()                                   //计数器0    P3.4脚初始化
{
    TMOD = 0x05;                                         //采用计数器
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;                                                         //全局中断允许
    ET0 = 1;                                                 //定时器0中断允许
    TR0 = 1;                                                 //开启定时器0
}
void timer1_init()                                   //计数器0    P3.5脚初始化
{
    TMOD = 0x07;                                         //采用计数器
    TH0 = 0x00;
    TL0 = 0x00;
    EA = 1;                                                         //全局中断允许
    ET0 = 1;                                                 //定时器0中断允许
    TR0 = 1;                                                 //开启定时器0
}
void suzi(void)                                                 //数字取码
{               
        disp[0]=second/10;
        disp[1]=second%10;
        disp[2]=count/10;
        disp[3]=count%10;
}
void main()
{                                                                          
        time_init();                                                   //定时器初始化
        int0_init();                                                  //外中断0   P3.2脚初始化
    int1_init();                                            //外中断1   P3.3脚初始化
        timer0_init();
        timer1_init();                                                //计数器0   P3.4脚初始化
        while(1)
        {       
            suzi();                                                        //数字取码初始化
               
            if(TF0==1)                                            //如果定时器0溢出
            {
                    TF0=0;                                                //定时器0未溢出
                        TH0=(65536-2500)/256;
                TL0=(65536-2500)%256;
                //        for(f=0;f<4;f++)                 这里如果用条件语句for的话,就会出现8位数码管前面几个暗,最后一位亮的情况
                //        {
                                P0=duanma[disp[f]];
                                duan_lock();
                                P0=weima[f];
                                wei_lock();
                                f=f+1;
                                if(f>3)
                                {
                                        f=0;
                                }
                //        }
                }
        }
}
void ISR_int0 (void) interrupt 0 using 3                  //外中断P3.2
{
        second =second+1;
        if(second==100)
        {
           second=0;
        }
}
void ISR_int1 (void) interrupt 2 using 2                        //外中断P3.3
{
    second =second-1;
        if(second==0)
        {
           second=99;
        }
}
void Timer0(void) interrupt 1                                                 //计数器0中断P3.4
{
         count=count+1;
         if(count==100)
         {
         count=0 ;
         }
}
void Timer1(void) interrupt 3                                                 //计数器0中断P3.5
{
         count=count+1;
         if(count==100)
         {
         count=0 ;
         }
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-1 07:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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