|
#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周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|