📄 2052.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 + -