|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2013-7-22 09:01:30
|
显示全部楼层
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
//INT0 计数输入
//PB0 方向
//PD7 脉冲
unsigned char SEG[]={249,129,218,203,163,107,123,193,251,235,
253,133,222,207,167,111,127,197,255,239,0};
unsigned int counterplus;
#define SETSEG PORTC|=(1<<PC5)
#define CLRSEG PORTC&=~(1<<PC5)
#define SETRCK PORTC|=(1<<PC0)
#define CLRRCK PORTC&=~(1<<PC0)
#define SETSCK PORTC|=(1<<PC1)
#define CLRSCK PORTC&=~(1<<PC1)
unsigned char disp[4]={0,0,0,0};
void watchdog_init(void)
{
WDR();
WDTCR = 0x1F;
WDTCR = 0x0F;
}
void counttoled(unsigned int value)
{
disp[1] = (value%1000)/100;
disp[2] = (value%100)/10;
disp[3] = value%10;
}
void Send595(unsigned char location)
{
unsigned char seg, i;
PORTC |= 0X1C;
seg = SEG[disp[location]];
CLRRCK; CLRSCK;
for(i=0; i<8; i++)
{
if(((seg>>i)&0x01) == 1) SETSEG;
else CLRSEG;
SETSCK; CLRSCK;
}
SETRCK; CLRRCK;
switch(location)
{
case 1: PORTC &= 0XF7; break;
case 2: PORTC &= 0XEF; break;
case 3: PORTC &= 0XFB; break;
}
}
void display(void)
{
static unsigned char i;
i++; i%=4;
Send595(i);
}
void port_init(void)
{
DDRD=0x80; PORTD=0X77;
DDRC=0XFF; PORTC=0X08;
DDRB=0XFD; PORTB=0x83;
}
void init_devices(void)
{
port_init();
TIMSK = 0x61;//定时器0,2中断,输入捕获
TCNT1=0;
MCUCR=0x0F;//INT1、INT0上升沿触发
GICR=0xc0;//INT1、INT0中断允许
TCCR0 = 4;//f/8
TCCR2 = 4;
}
unsigned char TICKETS;
#pragma interrupt_handler INT1_isr:3
void INT1_isr(void)
{
}
#pragma interrupt_handler INT0_isr:2
void INT0_isr(void)
{
}
#pragma interrupt_handler T2_isr:5
void T2_isr(void)
{
TCNT2=0xb2; //5ms
display();
}
unsigned int counter2=0;
#pragma interrupt_handler T0_isr:10
void T0_isr(void)
{
counterplus++;
}
void scankey(void)
{
unsigned char key, i;
unsigned int value;
unsigned int s1, s2;
key=PINB&0x02;
if(key!=0x02)
{
for(i=100; i>0; i--);
if(key==(PINB&0x02))
{
while(key==(PINB&0x02)) WDR();
if((key&0x02)==0)
{
for(value=0; value<2000; value++)
{
PORTD&=0x7f;
for(s1=0; s1<1000; s1++) {WDR(); NOP();}
PORTD|=0x80;
for(s1=0; s1<1000; s1++) {WDR(); NOP();}
}
}
}
}
}
void main(void)
{
CLI();
watchdog_init();
port_init();
init_devices();
SEI();
counterplus=0;
counttoled(0);
PORTB|=0x01;
counter2=0;
PORTD|=0x80;
TICKETS=39;
TCCR0=4;
while(1)
{
counttoled(counterplus);
scankey();
WDR();
}
}
在scankey函数里用循环发送1000个脉冲,但用A5的显示功能显示接收的脉冲,会收到1002至1010个脉冲不等,不知是怎么回事。
|
|