⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ajfl13.cpp

📁 投票系统 下位机作投票器
💻 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 + -