INT0和INT1中断 数码管显示

/***************/
//功能:INT0和INT1中断 数码管显示
//时间:2014年5月26
//作者:fengjianxin
/***************/
#include<avr/io.h>
#include<avr/interrupt.h>//中断头文件
#include<util/delay.h>


#define DDR_A   DDRA//供数码管用的端口
#define DDR_B   DDRB//供数码管用的端口


#define INT_0_L   DDRD &= ~_BV(PD2)//端口设为输入直接给低电平
#define INT_1_L   DDRD &= ~_BV(PD3)//端口设为输入直接给低电平
#define QiLi_0_L  DDRD &= ~_BV(PD4)//端口设为输入直接给低电平
#define QiLi_1_L  DDRD &= ~_BV(PD5)//端口设为输入直接给低电平
#define PORT_D()  (PORTD = 0x3c)   //打开输入端口上拉电阻2,3,4,5置1   
#define PIN_D1()  (PIND & _BV(PD4))//清零检测端口
#define PIN_D2()  (PIND & _BV(PD5))//清零检测端口


#define uint  unsigned int
#define uchar unsigned int 
uchar const Shuju[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//显示数据的端口
uchar const WeiMa[] ={0x20,0x10,0x08,0x04,0x02,0x01};//哪一位显示
uint HuanChong   [] = {0,0,0,0,0,0};//缓冲数组
uint Count_1 = 0;//计数标记
uint Count_2 = 0;//计数标记


void Init()//所有用到的端口初始化
{
    DDR_A = 0xff;
    DDR_B = 0xff;
    PORTA = 0xff;
    PORTB = 0xff;
    INT_0_L;
    INT_1_L;
    QiLi_0_L;
    QiLi_1_L;
    PORT_D();
}


void ZhongDuan()//设置中断方式INT0和INT1下降沿触发中断
{
    MCUCR = 0x0a;
    GICR  = 0xc0;
    sei();//打开全局中断 
}


void Show()//显示函数 向LED 送数据
{
    HuanChong[2] = Count_1/100;//把位置搞反试试  看看情况
    HuanChong[1] = Count_1%100/10;
    HuanChong[0] = Count_1%10;


    HuanChong[5] = Count_2/100;
    HuanChong[4] = Count_2%100/10;
    HuanChong[3] = Count_2%10;


   
    if(HuanChong[2] == 0)//当最高位为0时这位数码管不显示
    {
        HuanChong[2] = 10;
        if(HuanChong[1] == 0)//当最高位为0且第二位为0这两位数码管不显示
        {
            HuanChong[1] = 10;
        }
    }
    if(HuanChong[5] == 0)
    {
        HuanChong[5] = 10;
        if(HuanChong[4] == 0)
        {
            HuanChong[4] = 10;
        }
    }
    
    for(int i = 0;i < 6;i ++)
    {
        PORTA = WeiMa[i];//送位码  考虑位码  为什是这个数组总的值
        PORTB = Shuju[HuanChong[i]];//送段码
        _delay_ms(1);//这里延时很重要 直接决定视觉效果
    }
}
int main()
{
    Init();
    ZhongDuan();
    while(1)
    {
        if(PIN_D1() == 0) Count_1 = 0;//低电平清零
        if(PIN_D2() == 0) Count_2 = 0;//低电平清零
        Show();
    }
}
ISR(INT0_vect)//INT0中断
{
    Count_1 += 1;
    if(Count_1 == 100)
   {
        Count_1 = 0;
   } 
}
ISR(INT1_vect)//INT1中断
{
    Count_2 += 1;
    if(Count_2 == 100)
    {
        Count_2 = 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值