|
程序可以正常运行,但就是感觉写的不好,希望高手指点一下
我用了两个定时器,一个是用来扫描按键,一个用来数码管计数用的.
下载以后程序可以运行(下载线还在下载端口上,没BA出来)然后关了电源,重启一下,那个PINC4接的按键就不行了,还有如果把下载线BA了,数码管就会自动计数,不知什么原因,还请马老师指点一下哦,还有就是我的数码管是1秒自动计数的,感觉要小于一秒,不知是怎么回事呀
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.7a Evaluation
Automatic Program Generator
?Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 2008-3-30
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:
PC4为按键计数键,按键时数码管自动加1,PC6为开始作减法自动计数键(按一下,开始减法计数,在按一下暂停,在按一下复位)
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
flash unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义字符表
flash unsigned char position[4]={0x01,0x02,0x4,0x08};
unsigned char time[2];//显示时,分
unsigned char led[4]; //
unsigned char keycnt; //按键计数变量
unsigned int time_counter; // 中断次数计数单元
unsigned char posit,n;
bit point_on, time_1s_ok;
void time_to_disbuffer(void)//显示缓冲区
{ led[0]=time[0]%10;
led[1]=time[0]/10;
led[2]=time[1]%10;
led[3]=time[1]/10;
}
void display(void)//数码管显示程序
{ PORTC =0X70;
PORTD = table[led[posit]];
PORTC= position[posit];
if (++posit >=4 ) posit = 0;
}
void delay(unsigned int a)
{
while(a--)
{
}
}
void key_in(void)//按键扫描程序
{
if((PINC&(1<<4))==0)//按键是否按下,
{
delay(35000);//延时消抖?
if((PINC&(1<<4))==0)//确认按键按下
{ time[0]++;
if(time[0]==100)
{time[0]=0;}
time_to_disbuffer();
}
}
}
interrupt [TIM2_COMP] void timer2_comp_isr(void) //Timer 2比较匹配中断服务
{ // 调用LED扫描显示
if (++time_counter>=500) //1秒
{ time_1s_ok=1;
time_counter = 0;
if(time_1s_ok)
{time_1s_ok=0;
time[0]--;
n=time[0];
if(time[0]==0)
{time[0]=0;
TIMSK=0X02;}
time_to_disbuffer();
}
}
}
// Timer 0 比较匹配中断服务
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
display();
// 调用LED扫描显示
}
void main(void)
{
PORTD=0XFF;
DDRD=0XFF;
PORTC=0X70;
DDRC=0X8F;
// T/C0 初始化
TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TCNT0=0x00;
TIMSK=0x02; // 允许T/C0比较匹配中断
time[1] = 00; time[0] = 00; // 设初值
posit = 0;
time_to_disbuffer();
#asm("sei");
while(1){
if((PINC&(1<<6))==0)
{delay(30000);
if((PINC&(1<<6))==0)
{ keycnt++;
switch(keycnt)
{
case 1:
if(time[0]==0)
{keycnt=0;
break;}
TCCR2=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
OCR2=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TCNT2=0x00;
TIMSK=0x82; // 允许T/C2比较匹配中断
break;
case 2:
TIMSK=0X02;//不允许T/C2比较匹配中断
time_to_disbuffer();
break;
case 3:
keycnt=0;
time[0] = 0;
time_to_disbuffer();
break;
}
while((PINC&(1<<6))==0);
}
} key_in();
}
}
|
|