永发信息网

键盘驱动中rGPFCON |= ((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思??

答案:1  悬赏:60  手机版
解决时间 2021-01-08 22:30
  • 提问者网友:無理詩人
  • 2021-01-08 07:05
键盘驱动中rGPFCON |= ((0x01<<2*2)|(0x01<<3*2)|(0x01<<4*2))是什么意思??
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-01-08 08:23
---------------------------------*/
/
/
/
/
#include //kbhit();
#include //printf();
#include //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,这个过程不是很明白麻烦解释下。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯