/**************************************** 掃描數碼管,數據口接PA 段碼接PC7 位碼接PC6 穩定顯示01234567 ****************************************/ #include <iom16v.h> #include <macros.h> unsigned int i; const unsigned char duanma[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; const unsigned char weima[] ={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; /**************************************** display ****************************************/ void display(unsigned int i) { PORTA=0X00; PORTC|=BIT(7); PORTC&=~BIT(7); PORTA=weima[i]; PORTC|=BIT(6); PORTC&=~BIT(6); PORTA=duanma[i]; PORTC|=BIT(7); PORTC&=~BIT(7); } /**************************************** IO端口初始化 ****************************************/ void init_port(void) { PORTA=0XFF; DDRA=0XFF; PORTC=0XFF; DDRC=0XFF; } /**************************************** 定時器初始化 ****************************************/ void init_timer(void) { TCNT0=0X83; //1ms的定時器初值 TCCR0=0X03; //定時器0的計數預分頻取64 TIMSK=0X01; //使能T/C0中斷 SREG =0X80; //使能總中斷 } /*************************************** 主函數 ***************************************/ void main(void) { init_port(); //調用IO端口初始化函數 init_timer(); //定時器初始化 while(1) { //添加自己需要的程序代碼 } } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0=0X83; //重裝1ms定時器初值 if(++i>7) i=0; display(i); } TCNT0=0X83; //1ms的定時器初值 TCCR0=0X03; //定時器0的計數預分頻取64 8位定時器/計數器。 0x83=131。131-255 之間一共數了125. 另外,外部晶振8M,經過64分頻,周期成為1/(8000000/64)=8us 125個8us 就是1ms OK