📄 ajfl13.cpp
字号:
#include <conio.h> //kbhit();
#include <stdio.h> //printf();
#include <dos.h> //delay();
#include <stdlib.h>
#define data51 0x308 //8251A数据口
#define ctrl51 0x309 //8251A命令/状态口
#define ctrl55 0x303 //8255命令口
#define timer2 0x306 //8253的2号计数器端口
#define timctl 0x307 //8253命令口
#define factor 16 //波特率因子16
#define total 50//总人数
unsigned long int clk = 1193182;//8251输入时钟频率(十六进制表示)
//定时常数数组
int i;
void int51(); //初始化8251a
void set_bps(); //8253-5记数初值计算与装入
void send (int);
void main()
{
int n=0,data,status,rletter;
unsigned char recv;
set_bps();
int51();
for(;;){
delay(400);
clrscr();
printf("\n \t\t\t@@@@@@@@@@@@@@@@@@@@@\n");
printf("\t\t\t@ @\n");
printf(" \t\t\t@ NOW VOTING START! @\n");
printf("\t\t\t@ @");
printf("\n \t\t\t@@@@@@@@@@@@@@@@@@@@@\n");
printf("\npush SW1 to agree; ");
printf("\npush SW2 to disagree; ");
printf("\npush SW3 to drop; ");
printf("\npush SW4 to quit.\n\n");
printf("%d voters involved.\n\n",total);
outportb(0x303,0x81);//置PC6=1,打开8253-5的GATE2,开始输出方波
outportb(0x303,0x0d);
for(i=0;i<total;)
{recv = inportb(0x302);
if((0x08&recv)==0)
break;
if((0x01&recv)==0)
{data =0x01;
send(data); }
if((0x02&recv)==0)
{data =0x02;
send(data); }
if((0x04&recv)==0)
{data =0x03;
send(data); }
delay(200);
}
do
status=inportb(ctrl51);
while((status&0x02)==0);
rletter=inportb(data51);
if(rletter==1) {textcolor(10);cprintf("\n\npass!\n");}
else if(rletter==2) {textcolor(4); cprintf("\n\nveto!\n");}
else {textcolor(6);cprintf("\n\ninvalid!\n");}
delay(400);
printf("\nvote over!\npush SW4 to quit!\npush SW1 to vote again!\n");
for(;;)
{recv = inportb(0x302);
if((0x08&recv)==0)
{n=1;break;}
if((0x01&recv)==0)
{n=0;break;}}
if(n) break;
}
outport(ctrl55,0x0c);//关闭8253
}
void int51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4e);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
void set_bps()
{
int i,sendhigh,sendlow,bps=1200;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh = (i>>8)&0x00ff;
sendlow = i & 0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
void send(int data)
{int j,status;
do
status=inportb(ctrl51); //获取8251 TXRDY 状态
while((status&0x01)==0); //已准备好,则将数据发送出去
outportb(data51,data);
// do
// {do
// {status=inportb(ctrl51);
// if((0x08&inportb(0x302))==0) return ;
// }
// while((status&0x02)==0);
// rletter=inportb(data51);
// }
// while(rletter!=9);
i++;
printf("\r");
for(j=0;j<i;j++) printf(">");
printf(" %d voters last",total-i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -