سلام به همه دوستان
اگه ممکنه یه کمک کنید این مشکل حل شه
یه کد نوشتم که سطح منطقی پایه دیتای کیبرد (data+) رو وقتی پایه کلاک کیبرد (data-) در لبه ی پایین رونده هست میخونه
و در یه ارایه قرار میده از 1 شروع میکنه تا 230 و بعدش به وسیله دوتا کلید که وصله به pb.0 , pb.1 میشه رو lcd 16*2 مقادیر رو نمایش داد
اما باید بگم که وقتی پایه های دیتا و کلاک کیبرد usb رو وصل میکنم به میکرو قاتی میکنه و اعداد بهم ریخته نشون میده (این کار قبل از روشن شدن میکرو انجام میشه )
باید با زمین کردن pb.1 از 1 شروع کنه به شمارش و با هر بار زمین کردن یک واحد به شمارش اضافه شه اما یه دفعه 96 رو نشون میده بعدش 103 و اصلا معلوم نیست رو چه حساب کتابی این اعداد رو نشون میده :eek: :eek:
برنامه اینه
[code=c]#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
unsigned char data[231],buff[16],i=1;
bit a;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCCR0=0x00;
data[i] = TCNT0;
TCNT0=0x00;
TCCR0=0x03;
if ( PIND.3 )
data[i] = data[i] | 0b10000000;
i++;
if (i>229)
{
TCCR0=0x00;
TIMSK=0x00;
}
}
void main(void)
{
TIMSK=0x00;
TCCR0=0x00;
TCNT0=0x00;
PORTB=0x03;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
#asm("sei"
lcd_putsf (" press a key "
;
while ( PINB.0 && PINB.1 );
delay_ms (500);
lcd_clear();
TIMSK=0x01;
TCCR0=0x03;
TCNT0=0x00;
while (1)
{
i=1;
while(1)
{
if ( !PINB.0 )
{
delay_ms(200);
i--;
if (i<1)
i=1;
if ( data[i] | 0b10000000 )
a=1;
else
a=0;
if ( data[i] >127 )
data[i] = data[i]-128;
lcd_clear();
sprintf ( buff,"%u %u %u ",i,a,data[i] );
lcd_puts ( buff );
}
if ( !PINB.1 )
{
delay_ms(200);
i++;
if (i>700)
i=700;
if ( data[i] | 0b10000000 )
a=1;
else
a=0;
if ( data[i] >127 )
data[i] = data[i]-128;
lcd_clear();
sprintf ( buff,"%u %u %u ",i,a,data[i] );
lcd_puts ( buff );
}
}
}
}
[/code]
اگه ممکنه یه کمک کنید این مشکل حل شه
یه کد نوشتم که سطح منطقی پایه دیتای کیبرد (data+) رو وقتی پایه کلاک کیبرد (data-) در لبه ی پایین رونده هست میخونه
و در یه ارایه قرار میده از 1 شروع میکنه تا 230 و بعدش به وسیله دوتا کلید که وصله به pb.0 , pb.1 میشه رو lcd 16*2 مقادیر رو نمایش داد
اما باید بگم که وقتی پایه های دیتا و کلاک کیبرد usb رو وصل میکنم به میکرو قاتی میکنه و اعداد بهم ریخته نشون میده (این کار قبل از روشن شدن میکرو انجام میشه )
باید با زمین کردن pb.1 از 1 شروع کنه به شمارش و با هر بار زمین کردن یک واحد به شمارش اضافه شه اما یه دفعه 96 رو نشون میده بعدش 103 و اصلا معلوم نیست رو چه حساب کتابی این اعداد رو نشون میده :eek: :eek:
برنامه اینه
[code=c]#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
unsigned char data[231],buff[16],i=1;
bit a;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCCR0=0x00;
data[i] = TCNT0;
TCNT0=0x00;
TCCR0=0x03;
if ( PIND.3 )
data[i] = data[i] | 0b10000000;
i++;
if (i>229)
{
TCCR0=0x00;
TIMSK=0x00;
}
}
void main(void)
{
TIMSK=0x00;
TCCR0=0x00;
TCNT0=0x00;
PORTB=0x03;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;
UCSRB=0x00;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
#asm("sei"

lcd_putsf (" press a key "

while ( PINB.0 && PINB.1 );
delay_ms (500);
lcd_clear();
TIMSK=0x01;
TCCR0=0x03;
TCNT0=0x00;
while (1)
{
i=1;
while(1)
{
if ( !PINB.0 )
{
delay_ms(200);
i--;
if (i<1)
i=1;
if ( data[i] | 0b10000000 )
a=1;
else
a=0;
if ( data[i] >127 )
data[i] = data[i]-128;
lcd_clear();
sprintf ( buff,"%u %u %u ",i,a,data[i] );
lcd_puts ( buff );
}
if ( !PINB.1 )
{
delay_ms(200);
i++;
if (i>700)
i=700;
if ( data[i] | 0b10000000 )
a=1;
else
a=0;
if ( data[i] >127 )
data[i] = data[i]-128;
lcd_clear();
sprintf ( buff,"%u %u %u ",i,a,data[i] );
lcd_puts ( buff );
}
}
}
}
[/code]
دیدگاه