/*版 本: 1.0 */
#include <STC12C54.H>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#define unchar unsigned char
#define unint unsigned int
/*****************关键值*********************/
//COM通信修改项
#define COM_ADDRES_G 0x00 //广播通信地址16进制
#define com_in_data0 0xBE // 接收开始位
#define com_in_close 0x0D // 接收结束位
//新旧屏修改项
//#define EN_on 1 //扫描开 //0 新旧屏相关
//电信旧屏为0
//熊屏为1
#define EN_off !EN_on //扫描 //1
//改屏字数时修改项
#define PIN_ZI 5 //屏总字数 //4
#define RAM_SHU 32*(PIN_ZI/2) //缓冲数组大小int //32*(PIN_ZI/2)
#define H2_ZI 4 //第二行字中数字加入到第几个字中间
#define ZHI_HH 17 //数据行数 //4
#define COM_MAX 77 //com最大接收数
#define XIAN_id 13 //窗口号放在第几行
/****************函数申明区************************************/
//sfr AUXR = 0x8e;
void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL);
unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL);
void IAP_CACHU (unsigned char ADDH,unsigned char ADDL);
void INSZ8(void);
void com_out(void);
unsigned char hextoasc(unsigned char ascc); //输入hex码值,输出 ascii码
unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL); //输出hex码值,输入 ascii码
void CHU_SHI(void);
/* ISP_IAP_寄存器 */
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
//IO端口定义
sbit AA = P1^0;
sbit BB = P1^1;
sbit CC = P1^2;
sbit EN = P1^4; //34
sbit DD = P1^3;
sbit R1_DAT = P1^5; //33
sbit ST_RCK = P1^6; //1.6 C5
sbit CK_CLK = P1^7; //1.7
sbit LED = P3^5; // P3^5;
sbit K2_A = P3^2;
sbit K3_B = P3^4; //----------------------------
sbit IN_1 = P3^7;
//sbit RE = P3^5; //485发送控制
//sbit LED = P3^7;
//全局变量定义
unchar da_H; //显示扫描行数
unsigned int xdata ZHUO_DA;
unchar zi; //左移字数累加
unsigned int xdata DAT_RAM2[RAM_SHU]; //显示扫描缓冲区
unsigned char com_i; //5/26
bit com_q;
unsigned char data COM_R[COM_MAX]; //接收数据缓存 //77
bit COM_OK; //写入数据完成标志位
bit Zhi_b; //写入数据完成标志位
unsigned char idata H_ZHI[16]; //每行字数
unsigned char Zhi_h,chisu; //当前显示字区
unsigned char YI_F; //移动方向选取
unsigned char idata COM_DATA[6],COM_ADDRES; // 4
unsigned int PAI; //排队等候时间
unsigned char QIE; //切换时间
bit Zhi_ZHI; //字移完成标志位
unsigned char Z_H ; //字数最大行数
unsigned char Z_LMAX ; // Z_LMAX=PIN_ZI*2 //扫描字数移位确认
unsigned char SHU_1_14; //上移绶冲开始位
unsigned int time_s;
bit EN_on; // 输出EN驱动反向控制位
bit PIN_ADD_b; //屏地址更改标志位
bit S1_b,S2_b,S3_b,in_b,hl_b; //按键状态标志位
unsigned char IN_HL; //输入数据高电平/低电平有效
unsigned char IN_time;
//bit ddd; //叫号闪烁时间清零标志
unsigned char xdata YI_DONG_SD[15] ; //移动速度
unsigned char xdata YI_DONG_FX[15] ; //移动方向选取
unsigned char xdata XIAN_SI_YS[15] ; //显示延时
unsigned char xdata JIAO_HAO_1[15] ; //叫号1
unsigned char xdata JIAO_HAO_X[15] ; //叫号显示与否标志位
unsigned char xdata XIAN_SI_CS[15] ; //显示次数
unsigned char xdata TING_LUI_SJ[15] ; //停留时间
unsigned char xdata JIAO_HAO_CS[15] ; //叫号闪动次数
//unsigned int H1_wwww ; //第一行字中数字加入到第几个字中间 //
unsigned char COM_EN;
//unsigned char time_d ;
//unsigned int xdata DAT_XIAN_ID[17]; //窗口号显示扫描缓冲区
unsigned char code Dat_pin[]=
{//横向取模左高位,数据排列:从左到右从上到下
0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0-
0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1-
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2-
0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3-
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4-
0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5-
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7-
0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8-
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9-
0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE, // -A-
0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66, // -B-
0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0, // -C-
0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00,
0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66, // -D-
0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -E-
0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68, // -F-
0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ---
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/****************中断处理程序区**************************************/
void extern0_ISR() interrupt 0 {}
void timer0_ISR () interrupt 1
{
unchar i,j,k; //12M 1.5MS中断一次
unint da_k;
TL0 = 0x78;
TH0 = 0xfa;
TR0 = 0;
// EA = 0;
TF0 = 0; //time0中断请求标志位
if(da_H>15)
da_H=0;
j=da_H*PIN_ZI;
for (k=0;k<PIN_ZI;k++) //12
{
da_k=DAT_RAM2[j+k];
for (i=0;i<16;i++)
{
if(da_k&0x8000)
R1_DAT = 0;
else
R1_DAT = 1;
_nop_();
CK_CLK = 1;
_nop_();
CK_CLK = 0;
da_k<<=1;
}
}
EN =EN_off; //0
if(da_H>7)
{
DD=1;
}
else
{
DD=0;
}
if(da_H&0x01)
AA=1;
else
AA=0;
if(da_H&0x02)
BB=1;
else
BB=0;
if(da_H&0x04)
CC=1;
else
CC=0;
ST_RCK = 1;
EN =EN_on;
ST_RCK = 0;
R1_DAT = 0;
da_H++; //行加
TR0 = 1;
// EA = 1;
time_s++;
}
//通信中断
void serial_ISR () interrupt 4
{
unsigned char i,SBUF_lcd;
if(RI==1)
{
SBUF_lcd = SBUF;
if(SBUF_lcd==com_in_close) //接收结束位
{
i=ASC_TO_HEX(COM_R[0],COM_R[1]);
if((i==COM_ADDRES_G)||(i==COM_ADDRES))
com_out(); //写屏
for(i=0;i<com_i;i++)
COM_R[i]=0;
SBUF_lcd=0;
com_i=0;
com_q=0;
}
if(com_q)
{
COM_R[com_i]=SBUF_lcd;
if(com_i<COM_MAX)
com_i++;
}
if(SBUF_lcd==com_in_data0) //接收开始位
{
com_q=1;
com_i=0;
}
}
RI=0;
}
void timer2_ISR () interrupt 5{} /* not used */
unsigned char hextoasc(unsigned char ascc) //输入hex码值,输出 ascii码
{
if(ascc>47&&ascc<58)
return (ascc-48);
// if(ascc>64&&ascc<71)
if(ascc>64&&ascc<92)
return (ascc-55);
}
unsigned char ASC_TO_HEX(unsigned char ascH,unsigned char ascL) //输出hex码值,输入 ascii码
{
unsigned char da;
da=hextoasc(ascH);
da<<=4;
da|=hextoasc(ascL);
return da;
}
void shuzhu (unchar z,unchar h)
{
unsigned char i;
unsigned int b;
b=z*32;
if(z>H_ZHI[h])
H_ZHI[h]=z;
h++;
if(h>13)
h=13;
if(COM_EN)
{
for(i=0;i<32;i++)
{
if(b<256)
IAP_XIE (COM_R[i],h,b) ;
b++;
}
}
}
void chan_shu(unchar pp,unchar ma,unchar da)
{
unchar i;
if(COM_EN)
{
if(pp<6)
{
i=pp*20;
i+=ma;
IAP_XIE (da,0x0e,i) ;
}
else
{
pp-=6;
i=pp*20;
i+=ma;
IAP_XIE (da,0x0f,i) ;
}
}
}
//数据接收处理
void com_out(void )
{
unsigned char i,h,z,an,chao_zi,pp;
unsigned int com_k;
unsigned char com_x;
z=ASC_TO_HEX(COM_R[6],COM_R[7]);
h=ASC_TO_HEX(COM_R[4],COM_R[5]);
chao_zi=ASC_TO_HEX(COM_R[2],COM_R[3]);
if(chao_zi==0x04||chao_zi==0x05)
{
com_x=ASC_TO_HEX(COM_R[com_i-2],COM_R[com_i-1]);
com_k=0;
for(i=0;i<com_i-2;i++)
{
com_k+=ASC_TO_HEX(COM_R[i],COM_R[i+1]);
i++;
}
com_k%=0xff;
if(com_x!=com_k)
return ;
}
if(chao_zi==0x04) //操作码清EEP //操作码1写屏
{
//if(h==0)
if(!h&&(com_i==10||com_i==12)) //=0
{
COM_EN=1;
EN =EN_off;
TR0 = 0;
ET0=0; //time0中断允许控制位
for(i=0;i<13;i++) //5608eep为0x00--0x0F 共4K
{
IAP_CACHU (i,0); //清空EEP
i++;
}
for(i=0;i<ZHI_HH;i++)
H_ZHI[i]=0;
}
else // if(h==1) //
if(h==1&&(com_i==8||com_i==12))
{
for(i=0;i<ZHI_HH;i++)
{
IAP_XIE (H_ZHI[i],0x0d,210+i) ;
}
}
}
else if(chao_zi==0x01) //操作码清EEP //操作码1写屏
{
if(com_i<60)
{
for(i=8;i<72;i++)
COM_R[i]= 0x00;
}
an=0 ;
for(i=8;i<72;i++)
{
COM_R[an]= ASC_TO_HEX(COM_R[i],COM_R[i+1]);
i++;
an++;
}
if(h>Z_H)
Z_H = h ; //字数最大行数
shuzhu (z,h) ; //写入数据
}
else if(chao_zi==0x05) //操作码清EEP //操作码1写屏
{
if(!h&&com_i==12) //=0
{
EN =EN_off;
COM_EN=1;
TR0 = 0;
ET0=0; //time0中断允许控制位
IAP_CACHU (0x0f,0); //清空EEP
PIN_ADD_b=1; //屏地址更改标志位
}
else if(h==1&&com_i==12)
{
COM_OK=1; //写入数据完成标志位
COM_EN=0;
}
}
else if(chao_zi==0x03) //操作码参数设置
{
// H1_wwww=0;
if(h==4&&PIN_ADD_b) //写入屏地址 PIN_ADD_b=0; //屏地址更改标志位
{
z=ASC_TO_HEX(COM_R[6],COM_R[7]);
IAP_XIE (z,0x0F,250) ;
COM_ADDRES= IAP_DU (0x0f,250);
PIN_ADD_b=0; //屏地址更改标志位
}
else
if(COM_EN) //写入屏地址
{
if(h==0x0d) //写入屏地址
{
z=ASC_TO_HEX(COM_R[6],COM_R[7]);
IAP_XIE (z,0x0F,251) ;
}
else
{
pp=ASC_TO_HEX(COM_R[8],COM_R[9]);
chan_shu(pp,h,z) ;
}
}
}
INSZ8();
}
void IAP_FUWEI (void)
{
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
ISP_ADDRH=0xff;
ISP_ADDRL=0xff;
//ISP_DATA=0xff;
}
/*读*/
unsigned char IAP_DU (unsigned char ADDH,unsigned char ADDL)
{
ISP_ADDRH=ADDH;
ISP_ADDRL=ADDL;
ISP_CMD=0x01;
ISP_CONTR=0x84;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
IAP_FUWEI();
return ISP_DATA;
}
/*写*/
void IAP_XIE (unsigned char IAP_DATA,unsigned char ADDH,unsigned char ADDL)
{
ISP_ADDRH=ADDH;
ISP_ADDRL=ADDL;
ISP_DATA=IAP_DATA;
ISP_CMD=0x02;
ISP_CONTR=0x84;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
IAP_FUWEI();
}
/*擦除*/
void IAP_CACHU (unsigned char ADDH,unsigned char ADDL)
{
ISP_ADDRH=ADDH;
ISP_ADDRL=ADDL;
ISP_CMD=0x03;
ISP_CONTR=0x84;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
IAP_FUWEI();
}
/*****************延迟DELAY******************** **/
void delay(unsigned int a) //1-50ms /24M
{
unsigned int i;
for(;a>0;a--)
for(i=0;i<9988;i++)
WDT_CONTR = 0x3C; //狗;;
}
void XIE_RAM2 (unchar zhi_ju,unchar DAT_R,unchar di,bit a)
{
unsigned char shuzhu,dat_i,i,ADDH,w;
unsigned int k,da_k;
di=0;
if(zi>=DAT_R)
{
Zhi_ZHI=1;
return ;
}
i=0;
ADDH = zhi_ju; //取扇区地址
for(dat_i=0;dat_i<16;dat_i++)
{
for(shuzhu=0;shuzhu<PIN_ZI;shuzhu++) // PIN_ZI
{
if(a)
{
if(shuzhu==di)
{
k=(COM_DATA[0]*16)+dat_i;
DAT_RAM2[i]=Dat_pin[k];
DAT_RAM2[i]<<=8;
k=(COM_DATA[1]*16)+dat_i;
DAT_RAM2[i]|=Dat_pin[k];
i++;
}
else if(shuzhu==di+1)
{
k=(COM_DATA[2]*16)+dat_i;
DAT_RAM2[i]=Dat_pin[k];
DAT_RAM2[i]<<=8;
k=(COM_DATA[3]*16)+dat_i;
DAT_RAM2[i]|=Dat_pin[k];
i++;
}
else if(shuzhu==di+2)
{
k=(COM_DATA[4]*16)+dat_i;
DAT_RAM2[i]=Dat_pin[k];
DAT_RAM2[i]<<=8;
k=(COM_DATA[5]*16)+dat_i;
DAT_RAM2[i]|=Dat_pin[k];
i++;
}
/*
else if(shuzhu==4)
{
DAT_RAM2[i]=0;
i++;
}
*/
else
goto xei_2;
}
else
{
xei_2:
da_k=shuzhu*32;
k= dat_i+dat_i+da_k; //
if(k<256)
{
DAT_RAM2[i]=IAP_DU (ADDH,k);
}
else
{
w=k-256;
DAT_RAM2[i]=IAP_DU (ADDH+1,w);
}
DAT_RAM2[i]<<=8;
k++;
if(k<256)
{
DAT_RAM2[i]|=IAP_DU (ADDH,k);
}
else
{
w=k-256;
DAT_RAM2[i]|=IAP_DU (ADDH+1,w);
}
i++; //字总数0-3 总计4个字
}
}
}
// zi+=4;
}
QING_RAM2()
{
unsigned char dat_i;
for(dat_i=0;dat_i<RAM_SHU;dat_i++)
DAT_RAM2[dat_i]=0;
// for(dat_i=0;dat_i<16;dat_i++)
// DAT_XIAN_ID[dat_i]=0;
}
//开启显示定时扫描
void dingsi(void)
{
TMOD |= 0x01;
TH0 = 0xF8;
TL0 = 0x2f;
ET0=1;
TR0=1;
EA=1;
PT0=1; //优先级
}
//程序初始化
void CHU_SHI(void)
{
unsigned char i,z,an;
EN =EN_off; //关显示屏
dingsi(); //开启显示扫描定时
QING_RAM2(); //清显示缓冲区RAM2内存
delay(10); //开机延迟
COM_OK=0; //写入数据完成标志位清零
Zhi_h=0; //当前显示字区默认为0
Zhi_b=0; //调用显示标志位清零
COM_ADDRES=IAP_DU (0x0f,250); //本机地址
z= IAP_DU (0x0f,251);
// if(z)
EN_on=1; //显示屏亮度--1-----------------------------------------------------------
// else
// EN_on=0;
for(i=0;i<14;i++)
{
if(i<6)
{
z=i*20;
an=0x0e;
}
else
{
z=(i-6)*20;
an=0x0f;
}
}
Z_LMAX=PIN_ZI*2;
SHU_1_14=RAM_SHU-PIN_ZI;
}
void chunchu_A( sw,sb,sg,add1)
{
IAP_CACHU (add1,0); //清空EEP 3扇区
IAP_XIE (sw,add1,200) ;
IAP_XIE (sb,add1,201) ;
IAP_XIE (sg,add1,202) ;
}
unsigned char jp(unsigned char an)
{
unsigned char i;
switch(an)
{
case 2: //K2_A组
WDT_CONTR = 0x3C; //狗;;
if(S2_b==0) //K2_A
{
EXIT1 :
if(K2_A==0)
{
for(i=0;i<100;i++) ;
if(K2_A!=0)
goto EXIT1;
S2_b=1;
return 1;
}
}
else
{
if(K2_A==1)
{
S2_b=0;
return 0;
}
}
break;
case 3: //K3_B组
if(S3_b==0)
{
EXIT2 :
if(K3_B==0)
{
for(i=0;i<100;i++) ;
if(K3_B!=0)
goto EXIT2;
S3_b=1;
return 1;
}
}
else
{
if(K3_B==1)
{
S3_b=0;
return 0;
}
}
break;
}
}
unsigned char jp5S(unsigned char an)
{
unsigned char n;
unsigned int i;
switch(an)
{
case 2: //K2_A组 按纽2清除A/B组数据
WDT_CONTR = 0x3C; //狗;;
if(S2_b==0) //K2_A 按纽2清除A/B组数据
{
EXIT21 :
if(K2_A==0)
{
for(n=0;n<5;n++)
{
for(i=0;i<6000;i++) ;
delay(36); //延迟
// WDT_CONTR = 0x3C; //狗;;
if(K2_A!=0)
goto EXIT21;
for(i=0;i<6000;i++) ;
delay(36); //延迟
if(K2_A!=0)
goto EXIT21;
for(i=0;i<6000;i++) ;
delay(36); //延迟
if(K2_A!=0)
goto EXIT21;
}
for(i=0;i<100;i++) ;
if(K2_A!=0)
goto EXIT21;
S2_b=1;
return 1;
}
}
else
{
if(K2_A==1)
{
S2_b=0;
return 0;
}
}
break;
case 3: //K3_B组
if(S3_b==0)
{
EXIT32 :
if(K3_B==0)
{
for(n=0;n<5;n++)
{
for(i=0;i<6000;i++) ;
delay(36); //延迟
if(K3_B!=0)
goto EXIT32;
for(i=0;i<6000;i++) ;
delay(36); //延迟
if(K3_B!=0)
goto EXIT32;
for(i=0;i<6000;i++) ;
delay(36); //延迟
if(K3_B!=0)
goto EXIT32;
}
S3_b=1;
return 1;
}
}
else
{
if(K3_B==1)
{
S3_b=0;
return 0;
}
}
break;
}
}
void set_IN_HL(void)
{
unsigned char i,w,bei;
w= IAP_DU (0x0A,204);
bei=w;
if(w>0)
w=1;
COM_DATA[0] =12;
COM_DATA[1] =0;
COM_DATA[2] =0;
COM_DATA[3] =0;
COM_DATA[5] =0;
COM_DATA[4] =w; //最后一位
XIE_RAM2(1,16,0,1); //显示当前A值
for(i=0;i<50;i++)
{
if(jp(3)==1)
{
w=!w;
COM_DATA[0] =12;
COM_DATA[1] =0;
COM_DATA[2] =0;
COM_DATA[3] =0;
COM_DATA[5] =0;
COM_DATA[4] =w; //最后一位
XIE_RAM2(1,16,0,1); //显示当前A值
}
delay(20) ;
}
delay(200) ;
if(bei!=w)
{
QING_RAM2(); //清显示缓冲区RAM2内存
delay(10) ;
IAP_CACHU (0x0A,0); //清空EEP 3扇区
IAP_XIE (w,0x0A,204) ;
}
}
void set_IN_time(void)
{
unsigned char i,w,bei;
w= IAP_DU (0x0c,204);
bei=w;
// if(w>0)
// w=1;
COM_DATA[0] =13;
COM_DATA[1] =0;
COM_DATA[2] =0;
COM_DATA[3] =0;
COM_DATA[5] =0;
COM_DATA[4] =w; //最后一位
XIE_RAM2(1,16,0,1); //显示当前A值
for(i=0;i<100;i++)
{
if(jp(3)==1)
{
w++;
COM_DATA[0] =13;
COM_DATA[1] =0;
COM_DATA[2] =0;
COM_DATA[3] =0;
COM_DATA[5] =0;
COM_DATA[4] =w; //最后一位
XIE_RAM2(1,16,0,1); //显示当前A值
}
else if(jp(2)==1)
{
w--;
COM_DATA[0] =13;
COM_DATA[1] =0;
COM_DATA[2] =0;
COM_DATA[3] =0;
COM_DATA[5] =0;
COM_DATA[4] =w; //最后一位
XIE_RAM2(1,16,0,1); //显示当前A值
}
delay(20) ;
}
delay(200) ;
QING_RAM2(); //清显示缓冲区RAM2内存
delay(10) ;
IAP_CACHU (0x0c,0); //清空EEP 3扇区
IAP_XIE (w,0x0c,204) ;
}
unsigned char IN_j(void)
{
unsigned int i;
if(in_b==0)
{
EXIT3 :
WDT_CONTR = 0x3C; //狗;;
if(IN_1==hl_b)
{
for(i=0;i<6000;i++) ;
delay(IN_time); //延迟
if(IN_1!=hl_b)
goto EXIT3;
if(IN_1==hl_b)
for(i=0;i<6000;i++) ;
delay(IN_time); //开机延迟
if(IN_1!=hl_b)
goto EXIT3;
in_b=1;
return 1;
}
}
else
{
if(IN_1!=hl_b)
{
in_b=0;
return 0;
}
}
}
void xianshi(unchar a0,unchar a1,unchar a2,unchar a3,unchar a4 )
{
COM_DATA[1]=a0 ;
COM_DATA[2]=a1 ;
COM_DATA[3]=a2 ;
COM_DATA[4]=a3;
COM_DATA[5]=a4 ;
COM_DATA[0]=16 ;
XIE_RAM2(Zhi_h+1,H_ZHI[Zhi_h],JIAO_HAO_1[Zhi_h],JIAO_HAO_1[Zhi_h]);
// XIE_RAM2(1,16,0,1); //显示当前A值
}
/********************8位接收设置**********************/
void INSZ8(void)
{
SCON = 0x50; // 晶振18.432M
PCON |=0x80;
TMOD |= 0X20;
TMOD &= 0XEF;
TH1 = 0XF6; //9600 晶振18.432M
TL1 = 0xf6;
TR1=1;
IE |= 0x90;
// RE = 0;
}
//
/*****************主程序区****************************/
void main(void)
{
unsigned char idata i,ab_ch;
unsigned int idata time_f;
unsigned char idata ucdata_B[3];
bit A_B,time_bit,ab_b;
delay(1); //开机延迟
dingsi(); //开启显示扫描定时
zi=0;
Zhi_ZHI=0;
time_s=0;
da_H=0;//行扫开始值
CHU_SHI(); //初始化
INSZ8(); //开启串口接收 18.432M-19200---------------
if(jp5S(3)==1)
set_IN_HL() ; // 输入端高低电平有效位设置
if(jp5S(2)==1)
set_IN_time() ;
time_bit=0 ; //是否有数据需要保存标志位
A_B=0; //显示A/B组标志位
IN_HL= IAP_DU (0x0A,204); //读出输入端高低电平为有效位
IN_time= IAP_DU (0x0c,204);
if(IN_time>200)
{
IN_time=5;
IAP_CACHU (0x0c,0); //清空EEP 3扇区
IAP_XIE (IN_time,0x0c,204) ;
}
if(IN_HL>0)
hl_b=0;
else
hl_b=1;
in_b=1; //防止误动作
xianshi(10,11,16,16,16 ) ; //B
delay(100) ;
i=IAP_DU (0x04,200);
if(i>99)
ucdata_B[0]=0;
else
ucdata_B[0]= i ;
i=IAP_DU (0x04,201);
if(i>99)
ucdata_B[1]=0;
else
ucdata_B[1]= i ;
i=IAP_DU (0x04,202);
if(i>99)
ucdata_B[2]=0;
else
ucdata_B[2]= i ;
xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B
/*
delay(200) ;
xianshi(10,16,16,16,16 ) ; //A
delay(200) ;
i=IAP_DU (0x03,200);
if(i>99)
ucdata[0]=0;
else
ucdata[0]= i ;
i=IAP_DU (0x03,201);
if(i>99)
ucdata[1]=0;
else
ucdata[1]= i ;
i=IAP_DU (0x03,202);
if(i>99)
ucdata[2]=0;
else
ucdata[2]= i ;
*/
// xianshi(ucdata[2]%10,ucdata[1]/10,ucdata[1]%10,ucdata[0]/10,ucdata[0]%10 ) ; //显示当前A值
while(1)
{
open:
WDT_CONTR = 0x3C; //狗;
delay(1) ;
i=1;
for(i=0;i<3;i++);
if(IN_j()==1) //有数据输入
{
if(ucdata_B[0]>=99)
{
ucdata_B[0]=0;
if(ucdata_B[1]>=99)
{
ucdata_B[1]=0;
if(ucdata_B[2]>=99)
ucdata_B[2]=0;
else
ucdata_B[2]++;
}
else
ucdata_B[1]++;
}
else
ucdata_B[0]++;
xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B
time_f=0;
time_s=0;
time_bit=1;
ab_b=0;
}
if(time_s>60000&&time_bit)
{
time_f++;
time_s=0;
if(time_f>5) //
{
time_bit=0;
time_f=0;
chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04);
}
}
if(jp5S(3)==1)//按纽3显示B组数据
{
xianshi(11,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B
ab_b=1;
ab_ch=0;
}
else
{
if(ab_b)
{
ab_ch++;
if(ab_ch>100)
{
chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04);
xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B
ab_b=0;
}
}
}
if(jp5S(2)==1)//按纽2清除A/B组数据
{
ucdata_B[0]=0;
ucdata_B[1]=0;
ucdata_B[2]=0;
QING_RAM2(); //清显示缓冲区RAM2内存
delay(10) ;
chunchu_A(ucdata_B[0],ucdata_B[1],ucdata_B[2],0x04);
xianshi(ucdata_B[2]%10,ucdata_B[1]/10,ucdata_B[1]%10,ucdata_B[0]/10,ucdata_B[0]%10 ) ; ////显示当前值B
}
goto open;
}
}
/*
程序完成时间:
*/
|