📄 demo_11_3__.c
字号:
/*********************************************
File name : demo_11_4.c
Chip type : ATmega16
Program type : Application
Clock frequency : 1.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*********************************************/
#include <mega16.h>
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
sfrw ICR1=0x26;
flash char led_7[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
flash char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char dis_buff[6]; // 显示缓冲区,存放要显示的6个字符的段码值
unsigned int icp_v1,icp_v2;
char icp_state;
char int_n;
bit m;
void display(void) // 6位LED数管动态扫描函数
{
static char posit=0;
PORTC = 0xff;
PORTA = led_7[dis_buff[posit]];
PORTC = position[posit];
if (++posit >=6 ) posit = 0;
}
// Timer 2 比较匹配中断服务,2ms定时
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
#asm("sei") // 开放全局中断
display();
}
// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if (int_n)
{
icp_v2 = ICR1;
if (m == 1)
{
if (int_n == 101) icp_v1=icp_v2;
}
else
{
if (int_n == 2) icp_v1=icp_v2;
}
--int_n;
}
}
void time_to_disbuffer(long v) // 时钟时间送显示缓冲区函数
{
char i;
for (i=0;i<=4;i++)
{
dis_buff[i] = v%10;
v /= 10;
}
dis_buff[5] = v;
for (i=5;i>0;i--)
{
if (dis_buff[i] == 0)
dis_buff[i] = 10;
else
break;
}
}
void main(void)
{
unsigned int icp_1,icp_2,icp_tmp;
long vv;
DDRA=0xFF; // LED段码输出
PORTC=0xFF;
DDRC=0x3F; // LED位控输出
DDRB = 0x08;
PORTB = 0x01;
PORTD=0x40; // PD6音乐播放输出
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz
// Mode: CTC top=OCR2
// OC2 output: Disconnected
TCCR2=0x0C; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
OCR2=0xf9;//7c; // OCR0 = 0x7c(124),(124+1)/62.5=2ms
// T/C1初始化
TCCR1B = 0x41;
TIMSK = 0xA0; // 允许T/C1比较匹配A中断,允许T/C0比较匹配中断
m = 0;
int_n = 2;
#asm("sei") // 开放全局中断
while (1)
{
if (int_n == 0)
{
if (icp_v2 >= icp_v1)
icp_2 = icp_v2 - icp_v1;
else
icp_2 = 65536 - icp_v1 + icp_v2;
if (icp_2 < icp_1)
icp_tmp = icp_1 - icp_2;
else
icp_tmp = icp_2 - icp_1;
if (icp_tmp <= 2)
{
vv = 4000000/icp_2;
time_to_disbuffer(vv);
}
#asm("cli")
if (icp_2 < 599)
{
int_n = 101;
m = 1;
}
else
{
int_n = 2;
m = 0;
}
TIFR = 0xff;
#asm("sei")
icp_1 = icp_2;
icp_state = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -