📄 jiaotong2.c
字号:
#include <reg52.h>
#include <math.h>
typedef unsigned char byte;
typedef unsigned int word;
#define XTALL 11.0592
#define DLY_1MS (word) ( 1300*XTALL/12)
#define REC_BUF ((byte idata*) 0x80)
#define DISP_BUF ((byte idata*) 0xc0)
#define CON_BUF ((byte idata*) 0xd0)
#define disp_buffer ((byte idata (0xc8))
#define QIANG ((byte idata*)(0xe0))
#define line_addr ((byte xdata*)0xC000)
#define step_time (*(byte idata*) (0xdf))
#define addr_num1 (*(byte idata*) (0xf0))
#define addr_num2 (*(byte idata*) (0xf1))
#define CLK_ADR ((byte xdata*)0x8000)
#define CLK_SEC (*(byte xdata*)(CLK_ADR+0x00))
#define CLK_MIN (*(byte xdata *)(CLK_ADR+0x02))
#define CLK_HR (*(byte xdata *)(CLK_ADR+0x04))
#define CLK_WK (*(byte xdata *)(CLK_ADR+0x06))
#define CLK_DD (*(byte xdata *)(CLK_ADR+0x07))
#define CLK_MON (*(byte xdata *)(CLK_ADR+0x08))
#define CLK_YY (*(byte xdata *)(CLK_ADR+0x09))
#define CLK_REGA (*(byte xdata *)(CLK_ADR+0x0a))
#define CLK_REGB (*(byte xdata *)(CLK_ADR+0x0b))
#define CLK_REGC (*(byte xdata *)(CLK_ADR+0x0c))
#define CLK_REGD (*(byte xdata *)(CLK_ADR+0x0d))
#define key_0 0 /* remoter key code */
#define key_1 1
#define key_2 2
#define key_3 3
#define key_4 4
#define key_5 5
#define key_6 6
#define key_7 7
#define key_8 8
#define key_9 9
#define key_rc 0x0a
#define key_rs 0x0b
#define key_tc 0x0c
#define key_ps 0x0d
#define key_hand_outo 0x0e
#define key_light_off 0x0f
#define key_step 0x13
#define key_sch 0x12
#define key_hour 0x11
#define key_min 0x10
struct special_date {
byte mon;
byte date;
byte week;
byte project;
};
struct project_d {
byte start_hour;
byte start_min;
byte scheme;
byte step_num;
};
struct scheme_d {
byte out1,out2,out3,out4,out5,out6,out7,out8;
byte out9,out10,out11,out12,out13,out14,out15;
byte stop_time;
};
#define sp_date (xdata struct special_date *)(0x0000)
#define sp_project (xdata struct project_d *)(0x0100)
#define sp_scheme (xdata struct scheme_d *)(0x1000)
#define sp_address ((xdata byte*)0x0000)
idata byte num_plan,num_control,num_step,cur_step,num_1s,num1,y,mon,d,w,h,m,s;
idata byte sp_state,sp_time,scan_num,numa,numb,numc,num_100,num_80,num2;
idata byte cur_year=0x00,cur_mon=0x00,cur_date=0x00,cur_min=0x00,cur_hour=0x00,cur_week=0x00;
byte key_set, key_system_set;
byte return_state,flag_writ;
byte cur_project,key_check;
byte code tab_num[12]={0x81,0xf5,0x49,0x61,0x35,0x23,0x02,0xf1,0x01,0x21,0xff,0x7f};
byte code tab_key[4][5] = {
0x0A,0x07,0x08,0x09,0x10, /*RA,7,8,9,set_min */
0x0B,0x04,0x05,0x06,0x11, //RS,4,5,6,set_hour
0x0C,0x01,0x02,0x03,0x12, //TC,1,2,3,set_sch
0x0D,0x00,0x0E,0x0F,0x13, //PS,0,hand,light
};
word address,sum,gao,di,time_10ms;
bit rec_flag,half_flag=0,flag_10ms,flag_3s,light_on,flag_write,first_flag;
bit hand_on,flag_20ms,err_flag,gao_err,control_flag,force_flag,selet_hand,change_date_flag;
bit key_pass, run_state,no1,key_state,hand,scan_flag,str_flag;
sbit TXD1 =0x94;
sbit RXD1 =0x97;
sbit LAT1 =0x96;
sbit KEY1 =0x90;
sbit KEY2 =0x91;
sbit KEY3 =0x92;
sbit KEY4 =0x93;
sbit LAT2 =0x95;
sbit G=0xb5;
////////////////////////////
void int_ex0() interrupt 0 using 1{
key_state=1;
time_10ms=0x0000;
flag_10ms=0;
EX0=0;
}
void timer0_isr() interrupt 1 using 1{
TR0=0;
TH0=-(DLY_1MS/256);
TL0=-(DLY_1MS%256);
TR0=1;
G=1;
num1++;
num2++;
if(num2==80)
{num_80++;num2=0;}
if(num_80==10)
{half_flag=~half_flag;num_80=0;}
if (num1%10==0)
flag_10ms=1;
if(num1%20==0)
{G=0;
flag_20ms=(~flag_20ms);}
if(num1==100)
{num_100++;num1=0;}
/*if(num_100%5==0)half_flag=~half_flag;*/
if (num_100==10) {num_1s++;num_100=0;/* half_flag=~half_flag;*/ }
if (num_1s==3) flag_3s=1;
if(hand&&(return_state==4))
num_1s=0;
}
void serial() interrupt 4 using 1{
static idata byte sp_offset;
byte receive_num;
RI=0;
receive_num=SBUF;
switch (sp_state){
case 0x00: if (receive_num==0x55) sp_state=0x01; break; /*check first checkout number*/
case 0x01: if (receive_num==0xaa) sp_state=0x02;
else sp_state=0x00; break;
case 0x02: if (receive_num==0xfc) sp_state=0x03;
else sp_state=0x00; break;
case 0x03: if (receive_num==0x01) /*0x04 is rework the date,0x05 is rework eeprom*/
{
sp_state=0x04;sum=0;break;
}
if (receive_num==0x02)
{
sp_state=0x09;break;
}
if (receive_num==0x03)
{
sp_offset=0;sp_state=0x05;sum=0;break;
}
else sp_state=0x00; break;
break;
case 0x04: switch(sp_time){
case 0x00: sum+=(word)receive_num; y=receive_num; sp_time=0x01; break;
case 0x01: sum+=(word)receive_num; mon=receive_num;sp_time=0x02;
if ((receive_num>0x12)||(receive_num==0)) err_flag=1;break;
case 0x02: sum+=(word)receive_num; d=receive_num;sp_time=0x03;
if (((((((mon==1)||(mon==3))||(mon==5))||(mon==7))||(mon==8))||(mon==10))||(mon==12)){
if ((receive_num>0x31)||(receive_num==0)) err_flag=1;
break;}
if((((mon==4)||(mon==6))||(mon==9))||(mon==11)){
if ((receive_num>0x30)||(receive_num==0)) err_flag=1;break;}
if(mon==2){
if((receive_num>0x29)||(receive_num==0))err_flag=1;break;
}
break;
case 0x03: sum+=(word)receive_num; w=receive_num; sp_time=0x04;
if (receive_num>6) err_flag=1; break;
case 0x04: sum+=(word)receive_num; h=receive_num; sp_time=0x05;
if (receive_num>0x23) err_flag=1; break;
case 0x05: sum+=(word)receive_num; m=receive_num; sp_time=0x06;
if (receive_num>0x59) err_flag=1; break;
case 0x06: sum+=(word)receive_num; s=receive_num; sp_time=0x07;
if (receive_num>0x59) err_flag=1; break;
case 0x07: gao=(sum>>8);
if(((word)receive_num^gao)!=0) err_flag=1;
sp_time=0x08;
break;
case 0x08: di=(sum&0x00ff);
if(((word)receive_num^di)!=0) err_flag=1;
sum=0;/*gao=0;di=0;*/
sp_state=0x00;sp_time=0x00;
if (err_flag){SBUF=0xff;while(TI==0);TI=0;}
if (!err_flag){while((CLK_REGA&0x80)&&(flag_write));change_date_flag=1;
CLK_YY=y;CLK_MON=mon;CLK_DD=d;CLK_WK=w;
CLK_HR=h;CLK_MIN=m;CLK_SEC=s;
SBUF=0x00;while(TI==0);TI=0;}
err_flag=0;
break;
default: sp_time=0x00;sp_state=0x00; break;
}
break;
case 0x05: addr_num1=receive_num;sp_state=0x06; break;
case 0x06: addr_num2=receive_num;sp_state=0x07; sp_offset=0;break;
case 0x07: if(sp_offset<64){
sum+=(word)receive_num;
*(REC_BUF+sp_offset)=receive_num;sp_state=0x07; SBUF=receive_num; while(TI==0); TI=0;
sp_offset++;break; }
if(sp_offset==64){
sp_state=0x08; sp_offset=0; gao=(sum>>8);
if(((word)receive_num^gao)!=0) err_flag=1;
break; }
break;
case 0x08: di=(sum&0x00ff);
if((((word)receive_num^di)!=0)||(err_flag)) {err_flag=1;SBUF=0xff;while(TI==0);TI=0;}
if(!err_flag) {rec_flag=1; SBUF=0x00;while(TI==0);TI=0;}
err_flag=0;
sp_state=0x00;
sum=0;/* gao=0;di=0;*/
break;
case 0x09: if (receive_num==0x01) {sp_offset=0;sum=0;sp_state=0x0a;break;}
if (receive_num==0x02) {
if (cur_step<num_step) {cur_step++; num_1s=0;}
if (cur_step==num_step)cur_step=0;
hand_on=1;sp_state=0x00;break;}
if(receive_num==0x03) sp_state=0x0c;
break;
case 0x0a: if(sp_offset<16){
sum+=(word)receive_num;
if ((sp_offset==15)&&(receive_num>99)) err_flag=1;
*(QIANG+sp_offset)=receive_num; sp_state=0x0a; sp_offset++;
SBUF=receive_num; while(TI==0); TI=0;
break; }
if(sp_offset==16){
sp_state=0x0b;sp_offset=0;gao=(sum>>8);
if(((word)receive_num^gao)!=0) err_flag=1;
break; }
break;
case 0x0b: di=(sum&0x00ff);
if((((word)receive_num^di)!=0)||(err_flag)) {SBUF=0xff;while(TI==0);TI=0;}
else {control_flag=1;SBUF=0x00;while(TI==0);TI=0;}
err_flag=0; sum=0; /*gao=0;di=0;*/
sp_state=0x00;
break;
case 0x0c: numa=receive_num;sp_state=0x0d;break;
case 0x0d: numb=receive_num;sp_state=0x0e;break;
case 0x0e: numc=receive_num;sp_state=0x00;first_flag=1;break;
default: break;
}
}
void qiang(){
byte i;
for(i=0;i<16;i++) *(CON_BUF+i)=*(QIANG+i);
}
void err_judge(){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -