键盘驱动中rGPFCON |= ((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思?? 5
你这个复杂了一点,有点看不懂。可以帮我解释一下rGPFCON|=((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思?它是把rGOFCON...
你这个复杂了一点,有点看不懂。可以帮我解释一下rGPFCON |= ((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思?
它是把rGOFCON的第2,3,4 位变为1,这个过程不是很明白麻烦解释下。 展开
它是把rGOFCON的第2,3,4 位变为1,这个过程不是很明白麻烦解释下。 展开
展开全部
---------------------------------*/
//* Cexp7.cpp(查询方式全双工串行通信接口实验) */
//* 查询方式全双工串行通信程序 Source File */
//* Copyright (c) 2001 by yezi */
//*------------------------------------------------------*/
#include <conio.h> //kbhit();
#include <stdio.h> //printf();
#include <dos.h> //delay();
#define data51 0x308 //8251A数据口
#define ctrl51 0x309 //8251A命令/状态口
#define ctrl55 0x303 //8255命令口
#define timer2 0x306 //8253的2号计数器端口
#define timctl 0x307 //8253命令口
//#define clk 1193182
#define factor 16 //波特率因子16
unsigned long int clk = 1193182;//8251输入时钟频率(十六进制表示)
//定时常数数组
int tc_table[8]={
110, // 0=110bps
150, // 1=150b/s
300, // 2=300b/s
600, // 3=600b/s
1200, // 4=1200b/s
2400, // 5=2400b/s
4800, // 6=4800b/s
9600 // 1=9600b/s
};
void int51(); //初始化8251a
void set_bps(int bps); //8253-5记数初值计算与装入
void main()
{
int getvalue=0;
int temp=-1;
int sletter,rletter,status;
for(;;)
{
clrscr();
printf("\n 0---110\n 1---150\n 2---300\n 3---600\n 4---1200\n 5---2400\n 6---4800\n 7---9600\n");
getvalue=getch();
if((getvalue<'0') || (getvalue>'7'))
{
printf("\n Input error! try again please! \n"); //error message
getch();
continue;
}
else
{
break;
}
}
temp = getvalue - '0';
set_bps(tc_table[temp]);
int51();
printf("\n now enter the serial communication");
printf("\n end with 'Esc'\n");
outportb(0x303,0x80);//置PC6=1,打开8253-5的GATE2,开始输出方波
outportb(0x303,0x0d);
for(;;)//判断是否Esc键
{
if (kbhit()){//若无键按下,则转接收
if((sletter=getche())==0x1b)//是ESC?是,则退出,并返回DOS
{
outport(ctrl55,0x0c);//关闭8253
return;
}
else{
status=inportb(ctrl51);//获取8253 TXRDY 状态
if((status&0x01)!=0)//已准备好,则将键入的字符发送出去
{
outportb(data51,sletter);
}
}
}
else{
status=inportb(ctrl51);//已准备好,即有数据传送过来,则接收1个字符
if((status&0x02)!=0)
{
rletter=inportb(data51);
printf("\n%c",rletter);
}
}
}
}
void int51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4a);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
void set_bps(int bps)
{
int i,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh = (i>>8)&0x00ff;
sendlow = i & 0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
//* Cexp7.cpp(查询方式全双工串行通信接口实验) */
//* 查询方式全双工串行通信程序 Source File */
//* Copyright (c) 2001 by yezi */
//*------------------------------------------------------*/
#include <conio.h> //kbhit();
#include <stdio.h> //printf();
#include <dos.h> //delay();
#define data51 0x308 //8251A数据口
#define ctrl51 0x309 //8251A命令/状态口
#define ctrl55 0x303 //8255命令口
#define timer2 0x306 //8253的2号计数器端口
#define timctl 0x307 //8253命令口
//#define clk 1193182
#define factor 16 //波特率因子16
unsigned long int clk = 1193182;//8251输入时钟频率(十六进制表示)
//定时常数数组
int tc_table[8]={
110, // 0=110bps
150, // 1=150b/s
300, // 2=300b/s
600, // 3=600b/s
1200, // 4=1200b/s
2400, // 5=2400b/s
4800, // 6=4800b/s
9600 // 1=9600b/s
};
void int51(); //初始化8251a
void set_bps(int bps); //8253-5记数初值计算与装入
void main()
{
int getvalue=0;
int temp=-1;
int sletter,rletter,status;
for(;;)
{
clrscr();
printf("\n 0---110\n 1---150\n 2---300\n 3---600\n 4---1200\n 5---2400\n 6---4800\n 7---9600\n");
getvalue=getch();
if((getvalue<'0') || (getvalue>'7'))
{
printf("\n Input error! try again please! \n"); //error message
getch();
continue;
}
else
{
break;
}
}
temp = getvalue - '0';
set_bps(tc_table[temp]);
int51();
printf("\n now enter the serial communication");
printf("\n end with 'Esc'\n");
outportb(0x303,0x80);//置PC6=1,打开8253-5的GATE2,开始输出方波
outportb(0x303,0x0d);
for(;;)//判断是否Esc键
{
if (kbhit()){//若无键按下,则转接收
if((sletter=getche())==0x1b)//是ESC?是,则退出,并返回DOS
{
outport(ctrl55,0x0c);//关闭8253
return;
}
else{
status=inportb(ctrl51);//获取8253 TXRDY 状态
if((status&0x01)!=0)//已准备好,则将键入的字符发送出去
{
outportb(data51,sletter);
}
}
}
else{
status=inportb(ctrl51);//已准备好,即有数据传送过来,则接收1个字符
if((status&0x02)!=0)
{
rletter=inportb(data51);
printf("\n%c",rletter);
}
}
}
}
void int51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4a);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
void set_bps(int bps)
{
int i,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh = (i>>8)&0x00ff;
sendlow = i & 0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
追问
你这个复杂了一点,有点看不懂。可以帮我解释一下rGPFCON |= ((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思?
它是把rGOFCON的第2,3,4 位变为1,这个过程不是很明白麻烦解释下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询