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

📄 2052.c

📁 打分器程序
💻 C
字号:
#include <absacc.h>
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
//#include <STC12C5410AD.h>

#define ulong	unsigned long
#define uint	unsigned int
#define uchar	unsigned char


#define shumu 14
#define max 53
#define bool bit
#define TRUE	1
#define FALSE	0
#define tongbu		17

sbit eyea = P1^0;
sbit eyeb = P1^1;
sbit eyec = P1^2;
sbit eyed = P1^3;
sbit eyee = P1^4;
sbit fasf1=P2^2;//=1发送
sbit fasj0=P2^3;//=0接受

sbit dpk0=P2^6;
sbit dpk1=P2^7;
sbit dpk2=P2^0;
sbit dpk3=P2^1;

sbit keyp1=P2^4;
sbit keyp2=P2^5;

uchar dpjs=0,ssjs=0,inp=0,inbuf[max+8],rens,kkey=0xff,mmx=0xff;

bit ms=0,dings20,shans,xiao,yxi,piao;
bit sd=0,sckey=0,end,yn;

uchar idata outbuf[shumu];
uchar idata sele[max];
uint idata adr=0x2a67,addr;
uchar showbuf[4],time=0;
const uchar code zi[] ={0xfc,0X60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xF6,0xee,0x3e,0x9c,0x7a,0x9E,0x8e};	
//{0xfc,0X60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xF6,0xee,0x3e,0x9c,0x7a,0x9E,0x8e};	 //正常显示小数点加1//
//{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71};

//{1,2,4,8,0x10,0x20,0x40,0x80};

//sfr16 DPTR = 0x82;

/*新增特殊功能寄存器定义*/
sfr ISP_DATA=   0xe2;
sfr ISP_ADDRH=   0xe3;  
sfr ISP_ADDRL=   0xe4;
sfr ISP_CMD=   0xe5; 
sfr ISP_TRIG=   0xe6;   
sfr ISP_CONTR=   0xe7; 


/* 定义命令 */
#define READ_AP_and_Data_Memory_Command 0x01
/*  字节读-数据存储区   */
#define PROGRAM_AP_and_Data_Memory_Command 0x02
/*  字节编程-数据存储区 */
#define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03
/*  扇区擦除-数据存储区 */

typedef unsigned char INT8U; /* 8 bit 无符号整型  */
typedef unsigned int INT16U; /* 16 bit 无符号整型 */
#define DELAY_CONST 60000

/* 定义常量 */
#define ERROR   0
#define OK      1


/* 定义Flash 操作等待时间 */

#define WAIT_TIME 0x03


/* 打开 ISP,IAP 功能 */
void ISP_IAP_enable(void)
{
EA=0;/* 关中断 */
ISP_CONTR=ISP_CONTR&0x18;       /* 0001,1000 */
ISP_CONTR=ISP_CONTR | WAIT_TIME;
ISP_CONTR=ISP_CONTR | 0x80;       /* 1000,0000 */
}

/* 关闭 ISP,IAP 功能 */
void ISP_IAP_disable(void)
{
ISP_CONTR=ISP_CONTR & 0x7f;/* 0111,1111 */
ISP_TRIG=0x00;
EA=1;/* 开中断 */
}

/* 字节读 */
INT8U byte_read(INT16U byte_addr)
{
ISP_ADDRH=(INT8U)(byte_addr >> 8);
ISP_ADDRL=(INT8U)(byte_addr & 0x00ff);

ISP_CMD=ISP_CMD&0xf8;/* 1111,1000 */
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;
/* 0000,0001 */

ISP_IAP_enable();

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();

ISP_IAP_disable();
return (ISP_DATA);
}

/* 扇区擦除 */
INT8U sector_erase(INT16U sector_addr)
{
INT16U get_sector_addr=0;
get_sector_addr=(sector_addr & 0x2e00);  
/*1111,1110,0000,0000; 取扇区地址 */
ISP_ADDRH=(INT8U)(get_sector_addr >> 8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/* 1111,1000 */
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;

/* 0000,0011 */

ISP_IAP_enable();
ISP_TRIG=0x46;/* 触发ISP_IAP命令 */
ISP_TRIG=0xb9;/* 触发ISP_IAP命令 */
 _nop_();

ISP_IAP_disable();
return OK;
}

/* 字节编程 */
INT8U byte_program(INT16U byte_addr, INT8U original_data)
{
ISP_ADDRH=(INT8U)(byte_addr >> 8);
ISP_ADDRL=(INT8U)(byte_addr & 0x00ff);

ISP_CMD=ISP_CMD&0xf8;/* 1111,1000 */
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;
/* 0000,0010 */
ISP_DATA=original_data;

ISP_IAP_enable();
ISP_TRIG=0x46;/* 触发ISP_IAP命令 */
ISP_TRIG=0xb9;/* 触发ISP_IAP命令 */
_nop_();

ISP_IAP_disable();
return OK;
}

/* 字节编程并校验 */
INT8U byte_program_and_verify(INT16U byte_addr, INT8U original_data)
{
ISP_ADDRH=(INT8U)(byte_addr >> 8);
ISP_ADDRL=(INT8U)(byte_addr & 0x00ff);

ISP_CMD=ISP_CMD&0xf8;/* 1111,1000 */
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command; 
/*0000,0010 */
ISP_DATA=original_data;

ISP_IAP_enable();

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();

ISP_DATA=0x00;

ISP_CMD=ISP_CMD&0xf8;/* 1111,1000 */
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command; 
/*0000,0001 */

ISP_TRIG=0x46;/* 触发ISP_IAP命令 */
ISP_TRIG=0xb9;/* 触发ISP_IAP命令 */
_nop_();

ISP_IAP_disable();

if(ISP_DATA==original_data)
return OK;
else
return ERROR;
}


/*
void delay(INT16U counter)
{
INT16U temp=0;
for(temp = counter; temp>0; temp--)
{
_nop_();
_nop_();
_nop_();
}
}*/

void xuans(uchar k)
{
uchar i;
yn=0;
for(i=0;i<rens;i++)
{if(sele[i]==k)
{i=rens;
yn=1;}
}
}

void quda(void)
{
uchar i,j;
j=sele[0];
for(i=1;i<rens;i++)
{if(sele[i]>j)
j=sele[i];
}
mmx=j/10;
}

void keydisp(uint chr)
{
uint cl1;
uchar cl0;
cl1=chr%10000;
cl0=cl1/1000;
chr=cl1;
showbuf[0]=cl0;
cl1=chr%1000;
cl0=cl1/100;
showbuf[1]=cl0;
cl0=cl1%100;
cl1=cl0/10;
showbuf[2]=cl1;
cl0=cl0%10;
showbuf[3]=cl0;
}


void Delay(uint Wait_time)    //Wait_time 延时ms时间
{
 uint i,j;
   for (j=0;j<Wait_time;j++)
   for (i=0; i<227; i++)   // =113时,?1ms
       _nop_();
}


//			  按键扫描程序
unsigned char ScanKey(void)
{unsigned char sccode;
P1=0xff;    //发全0行扫描码,列线输入
keyp2=0;
keyp1=0;
_nop_();
sccode=P1;
if(sckey)
{ 	//若有键按下//延时20ms 去抖动	 	 
if(sccode!=0xff)
	{
	keyp2=1;
	_nop_();
	sccode=P1;
	if(sccode==0xff)
	{keyp2=0;keyp1=1;_nop_();
	sccode=P1;}
	else
	sccode=sccode-1;
	sckey=0;
	}
}
else
{if(sccode!=0xff)
sckey=1;
sccode=0xff;
}
keyp2=1;
keyp1=1;
return sccode;
}

uchar readkey(void)
{
uchar rekey;

//关显示
dpk0=1;
dpk1=1;
dpk2=1;
dpk3=1;
rekey=ScanKey();
return rekey;
}


void Scanplay(void) //using 1
{
dpjs++;
if(dpjs>3)
dpjs=0;

dpk0=1;
dpk1=1;
dpk2=1;
dpk3=1;
if(shans)
{
ssjs++;
P1=zi[showbuf[dpjs]];
if(dpjs==inp)
	{if(ssjs>72)
	P1=zi[showbuf[dpjs]];
	else
	P1=0;
	}
if(dpjs==1)
	if((ssjs>72)&&(xiao))
	P1=zi[showbuf[dpjs]]|1;
if(ssjs>145)
ssjs=0;
}
else
{P1=zi[showbuf[dpjs]];
if((xiao)&&(dpjs==1))
P1=P1|1;
}

switch(dpjs)
{case 0:
dpk0=0;
break;
case 1:
dpk1=0;
break;
case 2:
dpk2=0;
break;
case 3:
dpk3=0;
break;
}

}



//		定时器0中断子程序
void Timer0 () interrupt 1  using 1
{//static uchar time=0;0x2400=10ms
TR0=0;//定时器0 中断使能10ms 0xb800 20ms
//TH0=0xDC;
//TL0=0x0;
TH0=0xf7;
TL0=0x7f;
time++;
if(time>55)
time=0;
ms=1;
TR0=1;
}



//		串口接收中断子程
void Serial () interrupt 4   using 2
{
static uchar js=0,tou=0,ld=0,fal=0;
static bit zi=0;
uint tt;
if(RI)
 {	//EA=0;
	RI=0;
	if(zi)
	{
		if(ld>0)
		{
		inbuf[js]=SBUF;
		js++;
		ld--;
			if(ld==0)
			{sd=1;zi=0;}//收到信息
		}
		if(js==3)
		{inbuf[js]=SBUF;
		js++;tt=inbuf[0]*256+inbuf[1];
			if(tt==addr)
			{
			if(SBUF<max)
			ld=SBUF+4;	//showbuf[2]=1;

			}
			else
			zi=0;
			if(tt==0xffff)
			{
			if(SBUF<max)
			ld=SBUF+4;	//showbuf[2]=1;
			zi=1;
			}
			if(tt==0)
			{
			if(SBUF<max)
			ld=SBUF+4;	//showbuf[2]=1;
			zi=1;
			}
		}
		if(js<3)
		{
		inbuf[js]=SBUF;	
		js++;
		}
	}	
	else
	{
	if((tou==0x68)&&(SBUF==0x16))
		{zi=1;js=0;}//	showbuf[3]=0;}
	else
		tou=SBUF;
	}
}
if (TI ) 
{ 	TI = 0;fal++;
	if (fal<shumu) 
	SBUF=outbuf[fal]; //未发送完继续发送
	else
	{fal=0;fasf1=0;fasj0=0;}
}
	//EA=1;
}

/*
//          发送一个字节到主机
void Sent_Byte(uchar Sdata)
{TI=0;
SBUF=Sdata;
 while(TI==0) ;
 TI=0;
return;
}

void Sent_CMD(uchar *pt_send)
{EA=0;//发送时禁止接收
 TI=0;
  INT1=0;    //通知"GPRS模块"接收数据
  Delay(1);  //delay 1ms
  while(*pt_send!='\0')
       {
        Sent_Byte(*pt_send++);
       }
  INT1=1;  //发送完毕
  EA=1;
 return;
}
*/
void fasong(void)
{
uchar i,*p;
uchar tem=0;
outbuf[0]=0x68;
outbuf[1]=0x16;
outbuf[2]=addr/256;
outbuf[3]=addr%256;
outbuf[5]=04;
outbuf[10]=0x68;
outbuf[11]=0x68;
outbuf[12]=0x68;
p=&outbuf[0];
for(i=0;i<shumu-1;i++)
{tem+=*p;
p++;
}
*p=tem;
fasf1=1;
fasj0=1;

_nop_();
_nop_();
_nop_();
SBUF=outbuf[0];
}


bit jiaoyan(void)
{
uchar i,te=0x7e,j;
j=inbuf[3]+7;
for(i=0;i<j;i++)
te+=inbuf[i];
	//showbuf[0]=te>>4;
	//showbuf[1]=te&0x0f;
if(te==inbuf[j])
return 1;
else
return 0;
}




void anjian(uchar jian)
{
uchar i,j;
uint kk;
i=111;
if(end==0)
{

if(jian==0xfb)
{
if(kkey==0x7f)
{keydisp(addr);
jian=0xff;
}
}
kkey=jian;

switch(jian)
{case 0xdf: //Key_0:
i=0;
break;
case 0xf6: //Key_1:
i=1;
break;
case 0xee: //Key_2:
i=2;
break;
case 0xbe: //Key_3:
i=3;
break;
case 0xf7: //Key_4:
i=4;
break;
case 0xef: //Key_5:
i=5;
break;
case 0xbf: //Key_6:
i=6;
break;
case 0xfa: //Key_7:
i=7;
break;
case 0xde: //Key_8:
i=8;
break;
case 0x7e: //Key_9:
i=9;
break;
case 0xfb: //Key_OK:
if(yxi)
{shans=0;end=1;}
if(piao)
	{if(showbuf[0]==0)
		{kk=showbuf[1]*100+showbuf[2]*10+showbuf[3];
		if(kk<100)
			{j=kk;xuans(j);}
		else yn=0;
	}
	else
	yn=0;
	if(yn)
		{shans=0;end=1;}
	}
if(xiao)
	{j=showbuf[0]*10+showbuf[1];xuans(j);
	if(yn)
		{shans=0;end=1;}
	}

break;
case 0x7f: //Key_CANCEL:
{inp=0;showbuf[0]=0;showbuf[1]=0;showbuf[2]=0;showbuf[3]=0;}
break;

}
if(i<10)
{
if(piao&&(inp<=1))
{showbuf[0]=0x0;inp=2;showbuf[1]=0x0;}
if(piao&&(mmx<1))
{showbuf[2]=0x0;inp=3;}
if(xiao&&(inp==0))
{
if(mmx<1)
{showbuf[inp]=0x0;inp=1;}
}

showbuf[inp]=i;
if(xiao&&(inp==0))
{
if(mmx<i)
{showbuf[inp]=0x0;inp--;}
}
if(xiao&&(inp==1))
	{j=showbuf[0]*10+i;xuans(j);
	if(~yn)
		{showbuf[inp]=0x00;inp--;}
	}
if(piao&&(inp==2))
{
if(mmx<i)
{showbuf[inp]=0x0;inp--;}
}
if(piao&&(inp==3))
	{
		kk=showbuf[1]*100+showbuf[2]*10+i;
		if(kk<100)
			{j=kk;xuans(j);}
		else yn=0;
		
	if(~yn)
		{showbuf[inp]=0x0;inp--;}
	}
inp++;
}

if(inp>3)
inp=0;


if(piao&&(inp<=1))
{showbuf[0]=0x0;inp=2;showbuf[1]=0x0;}
if(piao&&(mmx<1))
{showbuf[2]=0x0;inp=3;}
}
if(xiao&&(inp==0))
{
if(mmx<1)
{showbuf[inp]=0x0;inp=1;}
}

}



//命令处理
void xinxi(void)
{
uchar i,te;
bit cc;
cc=jiaoyan();
if(cc)
{
te=inbuf[2];

switch(te)
	{case 4://设定地址
	if((inbuf[0]==0xff)&&(inbuf[1]==0xff))
		{//addr=inbuf[4]<<8+inbuf[5];
		sector_erase(adr);
		te=byte_program(adr,inbuf[4]);
		te=byte_program(adr+1,inbuf[5]);
		te=byte_read(adr);
		//showbuf[0]=te>>4;
		//showbuf[1]=te&0xf;
		i=byte_read(adr+1);
		outbuf[4]=inbuf[2];
		outbuf[6]=te;
		outbuf[7]=i;
		outbuf[8]=te;
		outbuf[9]=i;
		addr=te*256+i;
		fasong();
		keydisp(addr);
		}

	break;
	case 1://开始投票
	shans=1;end=0;
	break;
	case 2://结束
	end=1;shans=0;
	break;
	case 3://复位
	te=0;end=0;shans=0;
	for(i=0;i<max;i++)
	sele[i]=te;
	for(i=0;i<4;i++)
	showbuf[i]=te;
	break;
	case 5://投票模式
	piao=1;xiao=0;yxi=0;te=inbuf[3];
	for(i=0;i<te;i++)
	sele[i]=inbuf[i+4];
	rens=te;quda();inp=2;showbuf[0]=0;showbuf[1]=0;
	break;
	case 6://打分模式
	xiao=1;piao=0;yxi=0;te=inbuf[3];
	for(i=0;i<te;i++)
	sele[i]=inbuf[i+4];
	rens=te;quda();inp=0;
	break;
	case 7://游戏1投票
	yxi=1;piao=0;xiao=0;inp=0;
	break;
	case 8://读取数据
	outbuf[4]=8;
	for(i=6;i<10;i++)
	outbuf[i]=showbuf[i-6];
	fasong();
	break;
	case 9://测试在线
	outbuf[4]=9;
	for(i=6;i<10;i++)
	outbuf[i]=0xff;
	fasong();
	break;
	}
}

}



main()
{
uchar chr=0;
start:
	TMOD=0x21;  //置定时器1为方式2,定时器0为方式1
	SCON=0x50;  //MODE 1  ,ALLOW RECEIVE
	TH1=TL1=0x0Fd;//9600 TH1=TL1=0X0FA;//4800
        TH0=0xdc;   //0.01S once
        TL0=0;
	TR1=1;	/* timer 1 run */
      	TR0=1;
	ES=1;	/*serial enable*/
        ET0=1;	//ET1=0; 定时器1不中断
	PS=1;	//串行通信中断优先级
	TI=0;
        EA=1;  //IE= 0x80;中断使能
	REN=1; /*允许接收*/
	//TB8=1;//在模式2 和模式3 中将被发送数据的第9 位

end=0;
piao=0;
xiao=0;
fasf1=0;
fasj0=0;


rens=6;
sele[0]=28;
sele[1]=0x3;
sele[2]=0x5;
sele[3]=4;
sele[4]=0x9;
sele[5]=0x6;
quda();
//inp=2;

//xiao=1;
//piao=1;
yxi=1;
//shans=1;
addr=2000;
Delay(addr);

chr=byte_read(adr+1);
//keydisp(chr);
addr=chr;


chr=byte_read(adr);

//showbuf[0]=chr>>4;
//showbuf[1]=chr&0xf;
addr=chr*256+addr;
keydisp(addr);
//fasong();

while(1)
{
if(ms)
	{

	ms=0;Scanplay();
	if(time==0)
	chr=readkey();
	else
	chr=0xff;
	
	if(chr!=0xff)
	anjian(chr);//anjian(chr);keydisp(chr);
	//outbuf[4]++;
	//fasong();
	}
if(sd)
	{
	sd=0;xinxi();
	}
}
goto start;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -