一、 实验目的:
1、了解数码管的原理;
2、熟悉数码管的使用;
3、掌握外部中断和数码管动态显示的应用。
二 、 实验仪器:ATmage16实验板 一块
PC机 一台
三、 实验原理:数码管原理图如下:
多个数码管的动态显示是利用人的眼睛在瞬间无法识别的原理来实现在,如电灯也是利用这个原理。
四、实验步骤及内容:这个程序是数码管动态显示,按INT0键加1,一直到数码管显示为9999再重新计数。
实验程序如下:
#include <iom16v.h>
#include <macros.h>
int led[]={0x 3f ,0x06,0x5b,0x 4f ,0x66,0x6d,0x7d,0x07,0x 7f ,0x 6f };
//*******显示符0,1,2,3,4,5,6,7,8,9,
unsigned int i;
int g,s,b,q;
//*******************延时 us
void delay_us(int t)
{
do
t--;
while(t>1);
}
//*******************延时 ms
void delay_ms(unsigned int t)
{
while(t!=0)
{
delay_us(1142);
t--;}
}
#pragma interrupt_handler INT_0:2 //外部中断0执行函数
void INT_0 (void)
{ i++;
delay_ms(15);//******键盘防抖动
}
void main(void)
{
DDRD = 0xff; /* all outputs */
DDRC = 0xff; /* all outputs */
DDRB = 0xff; /*all outputs */
PORTB=0XFF;
PORTC=0X00;
PORTD=0XFF;
MCUCR=0X02; //定义外部中断INT0为下降沿产生中断请求
GICR=0X40; //中断屏蔽寄存器开INT0
SEI(); //******开全局中断
for (;;)//****显示按键次数
{
i f(i>9999)
i=0;
g=i%10; //取个位,取余
PORTC=0X01;
PORTB=led[g];
delay_ms(1);
s=i%100/10; //取十位
PORTC=0X02;
PORTB=led[s];
delay_ms(1);
b=i%1000/100; //取百位
PORTC=0X04;
PORTB=led[b];
delay_ms(1);
q=i%10000/1000; // 取千位
PORTC=0X08;
PORTB=led[q];
delay_ms(1);
/* for (i=0;i<4;i++)
{
g=i%10; //取余
PORTC=|(1<<i);
PORTB=led[g];
g=i/10; //取整
PORTC=0x00;;
)*/
}
}