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