搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 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接clk  PB7接data

int main(void)

  {

    DDRB=0x00;

        PORTB=0XFF;

        DDRC=0x00;   //pc  in

        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;

                            goto  read;

                          }

                          se_data=0x1c;

                         send(se_data);  //发a字符

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         on_of(se_data);  //奇偶位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send_1();  //结束位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         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)

                            goto  read;

                     _delay_us(20);      //0

                         send_0();    //启示位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send(se_data);  //发a字符

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         on_of(se_data);  //奇偶位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send_1();  //结束位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         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)

                            goto  read;

                     _delay_us(20);      //0

                         send_0();    //启示位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send(se_data);  //发a字符

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         on_of(se_data);  //奇偶位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send_1();  //结束位

                         if(got==1)  

                           {

                             got=0;

                             goto  recheck;

                                }

                   _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;

                            goto  read;

                          }

                      se_data=0xfa;

                     _delay_us(20);      //0

                         send_0();    //启示位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send(se_data);  //发a字符

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         on_of(se_data);  //奇偶位

                         if(got==1)  

                          {

                            got=0;

                            goto  read;

                          }

                         send_1();  //结束位

                         if(got==1)  

                           {

                             key=0;

                             goto  recheck;

                           }

         }

     }

  }

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2007-5-6 21:56:06 | 显示全部楼层
急啊,怎么没有人给点建议吗!

出0入0汤圆

发表于 2007-5-7 19:08:14 | 显示全部楼层
好像发送每位数据位后要检测CLK信号是否被主机拉低吧,否继续发送,是则停止发送

出0入0汤圆

 楼主| 发表于 2007-5-8 09:24:53 | 显示全部楼层
是啊,我也是这样写的啊?但是还是不行!急啊!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 05:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表