/***************/
//功能: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;
}
}
//功能: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;
}
}