📄 keymax7219__.c
字号:
}
//delay_ms(25);
led_write(0x05,data_temp2%10);
led_write(0x06,data_temp2/10);
}
if(flag_option==1 && flag_freq==1)
{
if(++data_temp3>=20)
{
data_temp3=20;
}
//delay_ms(25);
led_write(0x03,data_temp3%10);
led_write(0x04,data_temp3/10);
}
}
void key_4(void)
{
flag_time_sub=flag_option && flag_time && flag_sub;
flag_N_sub=flag_option & flag_N & flag_sub;
flag_freq_sub=flag_option & flag_freq & flag_sub;
if(flag_option==1 && flag_time==1)
{
if((data_temp1--)<=0)
{
data_temp1=0;
}
//delay_ms(25);
led_write(0x07,data_temp1%10);
led_write(0x08,data_temp1/10);
}
if(flag_option==1 && flag_N==1)
{
if((data_temp2--)<=0)
{
data_temp2=0;
}
//delay_ms(25);
led_write(0x05,data_temp2%10);
led_write(0x06,data_temp2/10);
}
if(flag_option==1 && flag_freq==1)
{
if((data_temp3--)<=0)
{
data_temp3=0;
}
//delay_ms(25);
led_write(0x03,data_temp3%10);
led_write(0x04,data_temp3/10);
}
}
//系统初始化函数
void sys_initial(void)
{
PORTA=0xC3; //PA7,PA6口为输入,PA0,PA1为输入,内部上拉使能
DDRA=0xC0;
PORTB=0x1F; //PB0~PB7 为输出
DDRB=0xFF;
PORTC=0xFF; //PC0~PC7为输入
DDRC=0x00;
PORTD=0x30; //PD4,PD5为输出
DDRD=0x30;
TCCR0=0x07; //外部计数方式,上升沿计数
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0xB3; //两路PWM,OCR1A,OCR1B
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xfb;
OCR1AL=0x83;
OCR1BH=0xbf;
OCR1BL=0x38;
ASSR=0x00;
TCCR2=0x0B;
TCNT2=0x00;
OCR2=0x7C;
TIMSK=0x00;
PORTD.6=1; //禁止TIMER中断
#pragma optsize-
WDTCR=0x1E;
WDTCR=0x0E;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
}
//max7219初始化函数
void led_initial(void)
{
led_write(0x09,0xff); //译码模式
led_write(0x0a,0x0a); //强度设置
led_write(0x0b,0x07); //全扫描模式
led_write(0x0c,0x01); //非关断模式
led_write(0x0f,0x01); //测试模式
delay_ms(1000);
led_write(0x0f,0x00); //正常模式
}
//N值计算显示函数
void N_display(void)
{
int adc_dis;
adc_dis=5*pn_temp;
led_write(0x01,adc_dis%10);
led_write(0x02,adc_dis/10);
}
// rimer0 CTC中断函数
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
//#asm("sei"); //开全局中断允许中断嵌套
freq_new=TCNT0;
time_1ms_ok=1;
if(++time_1ms>=10)
{
time_20ms_ok=1; //10ms到
}
}
// Timer 1 OCR1A
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
pwm_temp1=OCR1AH;
pwm_temp2=OCR1AL;
OCR1AL=pwm_new1;
OCR1AH=pwm_new2;
}
// Timer 1 OCR1B
interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
pwm_temp3=OCR1BH;
pwm_temp4=OCR1BL;
OCR1BL=pwm_new3;
OCR1BH=pwm_new4;
}
// ADC转换完成中断函数
interrupt [ADC_INT] void adc_isr(void)
{
int adc_templ,adc_temph;
adc_templ=ADCL;
adc_temph=ADCH;
pn_temp=(adc_temph<<8)+adc_templ;
}
//主函数
void main(void)
{
sys_initial();
led_initial();
led_write(0x01,0x80); //led扫描显示检测
led_write(0x02,0x80);
led_write(0x03,0x80);
led_write(0x04,0x80);
led_write(0x05,0x80);
led_write(0x06,0x80);
led_write(0x07,0x80);
led_write(0x08,0x80);
TIMSK=0x80; //开TIMER2 CTC中断,进行按键扫描和频率检测
#asm("sei");
while (1)
{
if(time_20ms_ok)
{
switch(key_read())
{
case 1: key_1();
break;
case 2: key_2();
break;
case 3: key_3();
break;
case 4: key_4();
break;
case 5: key_5();
break;
case 6: key_6();
break;
case 7: key_7();
break;
case 8: key_8();
break;
}
time_20ms_ok=0;
}
if(time_1ms_ok)
{
if(freq_new>=freq_old) freq=freq+freq_new-freq_old;
else freq=freq+(255-freq_old+freq_new);
freq_old=freq_new;
if(++time_100ms>=100)
{
time_100ms=0;
led_write(0x01,freq%10);
led_write(0x02,freq/10);
freq=0;
}
time_1ms_ok=0;
}
N_display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -