我设计一个键盘,打算把键盘上的键值发到电脑上显示,可以插上键盘后,按下键就听到嘟了一声,放开键就嘟两声,如果长按下键就会嘟嘟不停,放开后又嘟两声,但是电脑什么都不显示! 问题:1:请问在电脑和另外一个键盘启动后,拔掉插进自己设计的键盘,这样可行吗? 2:我怀疑我对键盘的初始化不对,才使电脑显示不出来. 下面是我的程序:请大家给给意见 #include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/wdt.h> #include <stdio.h> #include <avr/eeprom.h> //#define 时钟线 PB0 //#define 数据线 PB7 unsigned char del_1,key_data,key_down,got,se_data,key,key_,can_sead,fig_check_data,check_data,song_black; void send_0(void) //发送启事位 { PORTB|=_BV(PB7)|_BV(PB0); DDRB|=_BV(PB7)|_BV(PB0); _delay_us(20); PORTB&=~_BV(PB7); _delay_us(20); PORTB&=~_BV(PB0); _delay_us(40); PORTB|=_BV(PB0); _delay_us(20); } void send_1(void) //发送结束位 { PORTB|=_BV(PB7)|_BV(PB0); DDRB|=_BV(PB7)|_BV(PB0); _delay_us(20); PORTB|=_BV(PB7); _delay_us(20); PORTB&=~_BV(PB0); _delay_us(40); PORTB|=_BV(PB0); _delay_us(20); } void send(unsigned char dat_sent) { PORTB|=_BV(PB7)|_BV(PB0); DDRB|=_BV(PB7)|_BV(PB0); char fg_i; for(fg_i=0;fg_i<8;fg_i++) { _delay_us(20); if(dat_sent&0x01) PORTB|=_BV(PB7); else PORTB&=~_BV(PB7); _delay_us(20); PORTB&=~_BV(PB0); _delay_us(40); PORTB|=_BV(PB0); _delay_us(20); dat_sent>>=1; // if(check_data==1) // { DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if(((PINB&0x80)!=0x00)) fg_i=11; // check_data=0; // fig_check_data=1; // } } } void on_of(unsigned char jiou) //发送奇偶位 { unsigned char fh,fg; for(fh=0;fh<8;fh++) { if(jiou&0x80) fg++; jiou<<=1; } if(fg%2==1) send_0(); else send_1(); } void send_yda(unsigned char dat_fa) //应答电脑回复0xfa数 { PORTB|=_BV(PB7)|_BV(PB0); DDRB|=_BV(PB7)|_BV(PB0); char fg_i; for(fg_i=0;fg_i<8;fg_i++) { _delay_us(20); if(dat_fa&0x01) PORTB|=_BV(PB7); else PORTB&=~_BV(PB7); _delay_us(20); PORTB&=~_BV(PB0); _delay_us(40); PORTB|=_BV(PB0); _delay_us(20); dat_fa>>=1; // if(check_data==1) // { DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if(((PINB&0x80)!=0x00)) fg_i=11; // check_data=0; // fig_check_data=1; // } } } void read_data(void) //接收电脑发过来的数据,数据忽略 { unsigned char ten; DDRB|=_BV(PB0); DDRB&=~_BV(PB7); PORTB|=_BV(PB7); for(ten=0;ten<12;ten++) { _delay_us(30); PORTB&=~_BV(PB0); _delay_us(50); PORTB|=_BV(PB0); _delay_us(20); //check_data=0; // fig_check_data=1; // } } song_black=0xfa; DDRB&=~_BV(PB7); PORTB|=_BV(PB7); while(((PINB&0x80)!=0x80)) { _delay_us(30); PORTB&=~_BV(PB0); _delay_us(50); PORTB|=_BV(PB0); _delay_us(20); song_black=0xfc; } } SIGNAL(SIG_OVERFLOW0) {TCNT0=0X00; cli(); if(fig_check_data==1) { unsigned int timeme; if(timeme++>=40) { fig_check_data=0; check_data=1; } } if(((PINB&0x08)==0x00)&&(key_==0)) { key_=1; key_down=0x1c; can_sead=1; } if(((PINB&0x08)==0x08)&&(key_==1)) { key_=0; can_sead=2; } if(((PINB&0x04)==0x00&&(key_==0))) { key_=2; key_down=0x32; can_sead=1; } if(((PINB&0x04)==0x04)&&(key_==2)) { key_=0; can_sead=2; } if(((PINB&0x02)==0x00)&&(key_==0)) { key_=3; key_down=0x21; can_sead=1; } if(((PINB&0x02)==0x02)&&(key_==3)) { key_=0; can_sead=2; } sei(); } //本程序想在电脑上显示a字符,发送流程是先发送a的通码,再发0xff,接着发a的断码,请问我这样做对吗?PB0接clk PB7接data int main(void) { DDRB&=~_BV(PB0); DDRB&=~_BV(PB7); PORTB|=_BV(PB7); PORTB|=_BV(PB0); TIMSK=2;//允许溢出中断 TCNT0=0X00;//初值为0 TCCR0=2;//使用8分频 SREG=0x80;//开全中断 bei_cal0: DDRB&=~_BV(PB0); PORTB|=_BV(PB0); while((PINB&0x01)!=0x01); //判断clk是否为low _delay_us(50); if((PINB&0x01)!=0x01) //判断clk是否为high 否--等待 goto bei_cal0; DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if((PINB&0x80)!=0x80) //判断clk是否为high 否--等待 { _delay_us(20); //0 read_data(); bei_call2: DDRB&=~_BV(PB0); PORTB|=_BV(PB0); while((PINB&0x01)!=0x01); //判断clk是否为low _delay_us(50); if((PINB&0x01)!=0x01) //判断clk是否为high 否--等待 goto bei_call2; DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if((PINB&0x80)!=0x80) //判断clk是否为high 否--等待 goto read; _delay_us(40); //0 send_0(); //启示位 send_yda(song_black); //发a字符 on_of(song_black); //奇偶位 send_1(); //结束位 _delay_ms(80); goto bei_cal0; } _delay_ms(20); //0 send_0(); //启示位 send(0xaa); //发a字符 on_of(0xaa); //奇偶位 send_1(); //结束位 _delay_ms(80); while(1) { bei_call: DDRB&=~_BV(PB0); PORTB|=_BV(PB0); while((PINB&0x01)!=0x01); //判断clk是否为low _delay_us(50); if((PINB&0x01)!=0x01) //判断clk是否为high 否--等待 goto bei_call; DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if((PINB&0x80)!=0x80) //判断clk是否为high 否--等待 goto bei_call; if(can_sead==1) { _delay_us(20); //0 send_0(); //启示位 send(key_down); //发a字符 _delay_us(40); //0 on_of(key_down); //奇偶位 send_1(); //结束位 _delay_ms(80); can_sead=0; } else if(can_sead==2) { _delay_us(40); //0 send_0(); //启示位 send(0xf0); //发a字符 on_of(0xf0); //奇偶位 send_1(); //结束位 //se_data=0x1c; //发送A的断码 _delay_us(30); _delay_ms(80); can_sead=3; } else if(can_sead==3) { send_0(); //启示位 send(key_down); //发a字符 on_of(key_down); //奇偶位 send_1(); //结束位 _delay_ms(80); can_sead=0; } goto bei_call; read: _delay_us(20); //0 read_data(); bei_call1: DDRB&=~_BV(PB0); PORTB|=_BV(PB0); while((PINB&0x01)!=0x01); //判断clk是否为low _delay_us(50); if((PINB&0x01)!=0x01) //判断clk是否为high 否--等待 goto bei_call1; DDRB&=~_BV(PB7); PORTB|=_BV(PB7); if((PINB&0x80)!=0x80) //判断clk是否为high 否--等待 goto read; _delay_us(40); //0 send_0(); //启示位 send_yda(song_black); //发a字符 on_of(song_black); //奇偶位 send_1(); //结束位 _delay_ms(80); } }
|