cjb114b 发表于 2007-5-5 15:04:33

做一个键盘怎么电脑就是没显示出来呢?这是我的程序,大家帮帮忙!

#include <avr/io.h>

#include <avr/delay.h>

#include <avr/signal.h>

#include <stdio.h>

//#define 时钟线PB0

//#define 数据线PB7

unsigned char del_1,key_data,key_down,got,se_data,key;

void send_0(void)    //发送启事位

{

                       DDRB=0x81;

        PORTB&=~_BV(PB7);

        _delay_us(20);

        PORTB&=~_BV(PB0);

        _delay_us(40);

        PORTB|=_BV(PB0);

        _delay_us(20);

       DDRB=0x00;

       if((PINB&0x80)==0x00) //发完一个位后判断数据线是否为底,否--继续发送

          got=1;

}

void send_1(void)    //发送结束位

{

                       DDRB=0x81;

        PORTB|=_BV(PB7);

        _delay_us(20);

        PORTB&=~_BV(PB0);

        _delay_us(40);

        PORTB|=_BV(PB0);

        _delay_us(20);

       DDRB=0x00;

       if((PINB&0x80)==0x00) //发完一个位后判断数据线是否为底,否--继续发送

          got=1;

}

void send(unsigned char dat_sent)

{

char fg_i;

for(fg_i=0;fg_i<8;fg_i++)

   {

                       DDRB=0x81;

    if(dat_sent&0x80)

        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;

       DDRB=0x00;

       if((PINB&0x80)==0x00) //发完一个位后判断数据线是否为底,否--继续发送

          {

          got=1;//发完一个位后判断数据线是否为低标志位

      fg_i=9;

          }

        }

}

void on_of(unsigned char jiou)    //发送奇偶位

{

                       DDRB=0x81;

    unsigned char fh,fg;

        for(fh=0;fh<8;fh++)

          {

          if(jiou&0x80)

                  fg=1;

                  else fh=0;

          }

          if(fh==1)send_0();

          else send_1();

}

void send_yda(unsigned char dat_fa)   //应答电脑回复0xfa数

{

char fg_i;

for(fg_i=0;fg_i<8;fg_i++)

   {

   DDRB=0x81;

    if(dat_fa&0x80)

        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;

       DDRB=0x00;

       if((PINB&0x80)==0x00)   //发完一个位后判断数据线是否为低,否--继续发送

          {

          got=1;   //发完一个位后判断数据线是否为低标志位

      fg_i=9;

          }

        }

}

void read_data(void)   //接收电脑发过来的数据,数据忽略

   {

      DDRB=0XFF;

   unsigned char ten;

          for(ten=0;ten<10;ten++)

          {

                  _delay_us(20);

                  PORTB&=~_BV(PB0);

                  _delay_us(40);

             PORTB|=_BV(PB0);

                  _delay_us(20);

                }

   }

//本程序想在电脑上显示a字符,发送流程是先发送a的通码,再发0xff,接着发a的断码,请问我这样做对吗?PB0接clkPB7接data

int main(void)

{

    DDRB=0x00;

        PORTB=0XFF;

        DDRC=0x00;   //pcin

        PORTC=0xff;

        while(1)

       {

       while(1)

         {

         recheck:

             DDRB=0x00;

             while((PINB&0x01)!=0x00);   //判断clk是否为low

                   _delay_us(50);

                   while((PINB&0x01)!=0x01);//判断clk是否为high否--等待

                  if((PINB&0x80)!=0x80) goto read; //判断data是否为high

                     _delay_us(20);      //0

                       send_0();    //启示位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                          se_data=0x1c;

                       send(se_data);//发a字符

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       on_of(se_data);//奇偶位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send_1();//结束位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       se_data=0xf0;

                   _delay_ms(30);

             DDRB=0x00;

             while((PINB&0x01)!=0x00);   //判断clk是否为low

                   _delay_us(50);

                   while((PINB&0x01)!=0x01);//判断clk是否为high   否--等待

                  if((PINB&0x80)!=0x80)

                          gotoread;

                     _delay_us(20);      //0

                       send_0();    //启示位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send(se_data);//发a字符

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       on_of(se_data);//奇偶位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send_1();//结束位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       se_data=0x1c;   //发送A的断码

                   _delay_ms(30);

             DDRB=0x00;

             while((PINB&0x01)!=0x00);   //判断clk是否为low

                   _delay_us(50);

                   while((PINB&0x01)!=0x01);//判断clk是否为high否--等待

                  if((PINB&0x80)!=0x80)

                          gotoread;

                     _delay_us(20);      //0

                       send_0();    //启示位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send(se_data);//发a字符

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       on_of(se_data);//奇偶位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send_1();//结束位

                       if(got==1)

                           {

                             got=0;

                             gotorecheck;

                                }

                   _delay_ms(30);

                read:               //键盘读数据

                       read_data();   //读十位数据

                       DDRB=0X00;

                       while((PINB&0x80)!=0x80)//判断数据线是否还为低,保持时钟信号

                           {

                           DDRB=0XFF;

                  _delay_us(20);

                  PORTB&=~_BV(PB0);

                  _delay_us(40);

             PORTB|=_BV(PB0);

                  _delay_us(20);

                           }

             DDRB=0x00;

             while((PINB&0x01)!=0x00);   //判断clk是否为low

                   _delay_us(50);

                   while((PINB&0x01)!=0x01);//判断clk是否为high   否--等待

                  if((PINB&0x80)!=0x80)

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                      se_data=0xfa;

                     _delay_us(20);      //0

                       send_0();    //启示位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send(se_data);//发a字符

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       on_of(se_data);//奇偶位

                       if(got==1)

                          {

                          got=0;

                          gotoread;

                          }

                       send_1();//结束位

                       if(got==1)

                           {

                             key=0;

                             gotorecheck;

                           }

         }

   }

}

cjb114b 发表于 2007-5-6 21:56:06

急啊,怎么没有人给点建议吗!

MATRIX_023 发表于 2007-5-7 19:08:14

好像发送每位数据位后要检测CLK信号是否被主机拉低吧,否继续发送,是则停止发送

cjb114b 发表于 2007-5-8 09:24:53

是啊,我也是这样写的啊?但是还是不行!急啊!
页: [1]
查看完整版本: 做一个键盘怎么电脑就是没显示出来呢?这是我的程序,大家帮帮忙!