📄 5045.c
字号:
#include<REGTELE.H>
#include<MATH.H>
/*#define WREN 0x06; * 写允许 *
#define WRSR 0x01; * 写状态寄存器 *
#define RSDR 0x05;
#define READ 0x03; * 读数 *
#define WRITE 0x03; * 写数 *
#define ztai 0x3F; */
#define _O P1_1 /*输出*/
#define _I P1_3 /*数据输入*/
#define _SCLK P1_2 /*时钟信号*/
#define _CS P1_0 /*使能**/
#define L 0x1D /*显示下降*/
#define H 0x24 /*显示上升*/
/******** 0x00 表示半旗 *******/
unsigned int shuzhi[]={0x01,0x67,0x12,0x42,0x64,0x48,0x08,0x63,0x00,0x40};
unsigned char idata gaodu,zhuangtai=H,guocheng;
/********** guocheng = 0x00 表示占停上,guocheng = 0x22 表示占停下,
************guocheng = 0x10 表示上升, guocheng = 0x01 表示下降********/
unsigned char ge,shi,bai,tiaozheng=1200,bushu=0; /*****高度的各个位*****/
/*****************写一字节**************/
/*
void WRB(unsigned char idata din)
{
unsigned int i,j;
unsigned char idata temp,temp1;
_SCLK=0;
temp = din;
for(i=8; i>0; i--)
{
temp1=temp & 0x01;
if(temp1==1) _O =1;
else _O =0;
_SCLK = 1;
for(j=20; j>0;j--);
_SCLK = 0;
temp = temp >> 1;
}
}
/*****************读一字节**************/ /*
unsigned RBT()
{
unsigned int i,j;
unsigned int idata temp,idataOut=0;
idataOut = _I;
idataOut =idataOut<<7;
for(i=8; i>1; i--)
{
_SCLK = 1;
for(j=20; j>0; j--);
_SCLK = 0;
idataOut = idataOut >>1;
temp = _I;
temp=temp<<7;
idataOut=idataOut+temp;
//idataOut=ACC;
}
return(idataOut);
}
/*********************到顶检测**********************/
void jishu()interrupt 3
{
int i;
for(;;)
{ge=0;shi=8;bai=1;
P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
P1=0xF0;P0=0x11;for(i=0;i<10;i++); /*停*/
}
}
/**************关机保存***********************/ /*
void save()interrupt 0
{
unsigned int i;
WRB(0x06);
_CS = 1; for(i=20; i>0; i--); _CS = 0;
WRB(0x01);
WRB(0x3F);
_CS = 1; for(i=20; i>0; i--); _CS = 0;
WRB(0x06);
WRB(0x00);
WRB(gaodu);
WRB(guocheng);
WRB(zhuangtai);
} */
/******************开机读状态*******************************/ /*
read()
{
unsigned int i;
WRB(0x06);
_CS = 1; for(i=20; i>0; i--); _CS = 0;
WRB(0x00);
gaodu = RBT();
guocheng = RBT();
zhuangtai = RBT();
if(gaodu!=0){ge=gaodu%10;shi=((int)(gaodu/10))%10;bai=((int)((int)(gaodu/10))/10)%10;}
return;
}
/************************** 启动 ********************************/
void qidong(unsigned int a)
{unsigned int i;
if(a==1){if(tiaozheng==1200&&zhuangtai==H){P1_7=0;for(i=0;i<20;i++)P1_7=1;}
ge=0;shi=0;bai=0;P3_7=1;P3_6=1;TR0=1;return;}
if(a==0){zhuangtai=L;P3_7=1;P3_6=0;TR0=1;return;}
return;
}
/************************* 占停 *******************************/
void Zantin(unsigned int q)
{
unsigned int i;
/******关闭定时器************/
if(q==0){if(tiaozheng==1200&&zhuangtai==H){P1_7=0;for(i=0;i<20;i++);P1_7=1;}
if(zhuangtai==H)guocheng=0x00;else if(zhuangtai==L)guocheng=0x22;
P3_7=0;return;}
if(q==1){if(guocheng==0x00)qidong(1);else qidong(0);} /*打开定时器*/
return;
}
/************************* 换算 ****************************/
void huansuan()
{
unsigned int shijian;
shijian=ge+shi*10+bai*100;
tiaozheng=((int)(shijian/15))*400;
ge=0;shi=0;bai=0;
return;
}
/************************* 调整 *****************************/
void tiaozhen(void)
{int i=1;
for(;i;)
{
P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
if(P2_2==0){for(i=0;i<20;i++);if(P2_2==0)ge++;if(ge==10)ge=0;}
if(P2_1==0){for(i=0;i<20;i++);if(P2_1==0)shi++;if(shi==10)shi=0;}
if(P2_0==0){for(i=0;i<20;i++);if(P2_0==0)bai++;if(bai==2)bai=0;}
if(P1_7==0){for(i=0;i<20;i++);if(P1_7==0)i=0;}
}
huansuan;
return;}
/*********************半旗*********************/
void banqi()
{unsigned int i,a=1;
for(;a!=0;)
{if(P2_2==0){for(i=0;i<20;i++);if(P2_2==0&&gaodu==0x00){guocheng=0x01;qidong(1);
P1_7=0;for(i=0;i<20;i++);P1_7=1;a=1;}}
if(P2_1==0){for(i=0;i<20;i++);if(P2_1==0&&a==1&&gaodu==0x78){guocheng=0x01;a=0;qidong(1);}}
if(zhuangtai==H&&ge==10){ge=0;shi++;}
if(zhuangtai==H&&shi==10){shi=0;bai++;}
if(zhuangtai==L&&ge==0){ge=9;shi--;}
if(zhuangtai==L&&shi==0){shi=9;bai--;}
P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
if(a==1&&gaodu==0xB4){P1_7=0;for(i=0;i<20;i++);P1_7=1;qidong(0);}
if(a==1&&gaodu==0x78)Zantin(0);
if(a==0&&gaodu==0xB4){qidong(0);}
if(a==0&&gaodu==0x00)Zantin(0);
}
return;
}
/************************* 定时器*****************************/
void clk(void)interrupt 1 /*T/c0中断入口*/
{
P3_5=!P3_5; /*P3-5取反*/
if(zhuangtai==H)bushu++;
if(bushu==80&&guocheng==0x10&&P3_7==1){bushu=0;ge++;gaodu++;}
else if(bushu==80&&guocheng==0x01&&P3_7==1){bushu=0;ge--;gaodu--;}
TH0=(65536-tiaozheng)/256; /*预置计数初值*/
TL0=(65536-tiaozheng)%256;
}
/************************* 主函数 *****************************/
main()
{ unsigned int i,j;
P3_5=0;
P3_7=0;
/*************计数***************/
TMOD=0x01; /*T/C0工作于定时方式*/
TH0=(65536-tiaozheng)/256; /*预置计数初值*/
TL0=(65536-tiaozheng)%256;
EA=1; /*CPU开中断*/
ET0=1;
TR0=1;/*T/C0开中断*/
/**************开P3_3外部中断***************************/
IT0=1;
IE0=1;
EX0=1;
IT1=1;
IE1=1;
EX1=1;
/* read();
/*************************显示********************************/
for(;;)
{if(zhuangtai==H&&ge==10){ge=0;shi++;}
if(zhuangtai==H&&shi==10){shi=0;bai++;}
if(zhuangtai==L&&ge==0){ge=9;shi--;}
if(zhuangtai==L&&shi==0){shi=9;bai--;}
if(gaodu==180||(gaodu==0&&guocheng==0x01)){P3_7=0;}
if(gaodu==180&&tiaozheng==1200){P1_7=0;for(i=0;i<20;i++);P1_7=1;}
P1=0x80;P0=shuzhi[ge];for(i=0;i<10;i++);
P1=0x90;P0=shuzhi[shi];for(i=0;i<10;i++);
P1=0xA0;P0=shuzhi[bai];for(i=0;i<10;i++);
P1=0xF0;P0=zhuangtai;for(i=0;i<10;i++);
if(P2!=0xFF)for(i=0;i<20;i++);
if(P2!=0xFF)
{ j=P2;
switch(j)
{case 0xFE:
{ if(guocheng!=0x00||guocheng!=0x22)Zantin(0);
else if(guocheng==0x00||guocheng==0x22)Zantin(1);} break;
case 0xFD:
if(gaodu==0x00){guocheng=0x10;qidong(1);} break;
case 0xFC:
if(gaodu==0xB4){guocheng=0x01;qidong(0);} break;
case 0xFB:
if(gaodu==0){zhuangtai=0x00;banqi;} break;
case 0xFA:
if(gaodu==0)tiaozhen(); break;
default: {}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -