📄 4-15.c
字号:
/*
*********************************************************************************************************
*
* 倒计时牌源代码
*
* CPU :AT89C2051
*
* FILE : 18.C
* By : CC
* DATE : 2008-04-05
* VERSION : 1.0
* 修改记录 :
*********************************************************************************************************
*/
#include<REG2051.H>
#define uchr unsigned char
#define uint unsigned int
#define T100MS 180//100ms
#define T500MS 500//500ms
#define T1S 1000//1000ms
#define TMAX 20000//20s
#define DISP_0 0xFC
#define DISP_1 0x0C
#define DISP_2 0xDA
#define DISP_3 0xF2
#define DISP_4 0x66
#define DISP_5 0xB6
#define DISP_6 0xBE
#define DISP_7 0xE0
#define DISP_8 0xFE
#define DISP_9 0xF6
#define DISP_10 0x01
#define WIP 0x01 //X5045 写操作忙标志位掩码
#define WEL 0x02 //X5045 写保护标志位掩码
#define WDT 0x00 //X5045 看门狗时间:1.4s
//#define WDT 0x10 //X5045 看门狗时间:600ms
//#define WDT 0x20 //X5045 看门狗时间:200ms
//#define WDT 0x30 //X5045 关闭看门狗
#define BLA 0x00 //X5045 ROM块锁定范围:无
//#define BLA 0x04 //X5045 ROM块锁定范围:180H-1FFH
//#define BLA 0x08 //X5045 ROM块锁定范围:100H-1FFH
//#define BLA 0x0C //X5045 ROM块锁定范围:000H-1FFH
#define WREN 0x06 //允许X5045写操作
//#define WRDS 0x04 //禁止X5045写操作
#define RDSR 0x05 //读X5045状态寄存器
#define WRSR 0x01 //写X5045状态寄存器
sbit LE = P3^7;
sbit p17 = P1^7;
//X5045 PINS
sbit cs = P3^4;
sbit sck = P3^0;
sbit si = P3^1;
sbit so = P3^5;
extern bit freset = 0;
extern bit frcntdstart = 0;
extern bit fgcntdstart = 0;
extern bit frpulsechk = 0;
extern bit fgpulsechk = 0;
extern bit frcntdend = 0;
extern bit fgcntdend = 0;
extern bit frcomp = 0;
extern bit fgcomp = 0;
extern bit frdisp = 0;
extern bit fgdisp = 0;
extern bit frdispstr = 0; //////////////
extern uchr gcountdn = 0;
extern uint rcntdtim = 0; /////////////////
extern uchr gcntdtim = 0;
extern uint rchktim = 0;
extern uint gchktim = 0;
extern uint r1stim = 0;
extern uint g1stim = 0;
extern uchr rcountdn = 0;
void rint(void);
void t0int(void);
void disp(uchr num);
void delay(void);
void delay1(void);
void send(uchr tx);
void x5045ini(void);
void main(void)
{
uchr rdisptim=0;
uchr gdisptim=0;
uchr tmp=0,i=0;
P1=0xFF;
LE=0;
EA=1;
//外部中断允许,下降沿触发
EX0=1;
PX0=1;
IT0=1;
ET0=1;
PT0=0;
TMOD=0X11;
TL0=0x66;
TH0=0xFC;
TR0=1;
x5045ini();
while(1)
{
cs=0;
cs=1;
if(frdispstr==1)
{
if(frdisp==1)
{
frdisp=0;
if(rdisptim>2)
{
rdisptim--;
disp(rdisptim);
}
else
{
P1=0;
LE=1;
delay();
LE=0;
}
}
}
else
{
P1=0;
LE=1;
delay();
LE=0;
}
if(frcomp)
{
frcomp=0;
tmp=(rcntdtim-T1S)/1000;
if(((rcntdtim-T1S)%1000)/100 >= 5)
{
tmp++;
}
if(rcountdn!=tmp)
{
rcountdn=tmp;
}
rdisptim=rcountdn-1;
}
}
}
void rint(void) interrupt 0
{
if (frcntdstart==0)
{
//if((rchktim>T100MS) && (rchktim<T500MS))//如果时间大于100ms并且小于500ms,准备开始计数
if((rchktim>T100MS) & (rchktim<T500MS)) /////////////
{ //p17=!p17;
rcntdtim=rchktim;//延时计数器
r1stim=rchktim;//
frcntdstart=1;//延时开始标志
frdispstr=1;//显示开始标志
}
}
frpulsechk=1;
rchktim=0;//清0脉宽计数器
}
//T0:16位,1ms
void t0int(void) interrupt 1
{
TL0=0x66;
TH0=0xFC;
// tt0++;
if(frpulsechk==1)
{
rchktim++;
if(rchktim>=T1S)
{
frpulsechk=0;
rchktim=0;
if(frcntdstart==1)
{
frcntdend=1;
}
}
}
if(frcntdstart==1)
{
if(frcntdend==0)
{
r1stim++;
rcntdtim++;
if(r1stim>=T1S)
{
r1stim=0;
frdisp=1;
}
if(rcntdtim>=TMAX)
{
frcntdend=1; /////////////////
}
}
else
{
frcomp=1;
frcntdstart=0;
frcntdend=0;
frdisp=0;
frdispstr=0;
}
}
}
void disp(uchr num)
{
P1=0xFF;
LE=0;
switch(num%10)
{
case 0:P1 = P1 & DISP_0; break;
case 1:P1 = P1 & DISP_1; break;
case 2:P1 = P1 & DISP_2; break;
case 3:P1 = P1 & DISP_3; break;
case 4:P1 = P1 & DISP_4; break;
case 5:P1 = P1 & DISP_5; break;
case 6:P1 = P1 & DISP_6; break;
case 7:P1 = P1 & DISP_7; break;
case 8:P1 = P1 & DISP_8; break;
case 9:P1 = P1 & DISP_9; break;
default: break;
}
if(num>=10) P1|=DISP_10;
LE=1;
delay();
LE=0;
}
void delay()
{
uchr i;
for(i=0;i<10;i++)
{;}
}
void delay1()
{
uint i;
for(i=0;i<1000;i++)
{;}
}
void send(uchr tx)
{
uchr i;
uchr tmp=0x80;
for(i=0;i<8;i++)
{
sck = 0 ;
if(tx & tmp)
{
si = 1;
}
else
{
si = 0;
}
tmp = tmp >> 1;
delay();
sck = 1;
delay();
}
}
void x5045ini(void)
{
cs = 1;
delay();
cs = 0;
delay();
send(WREN);
cs = 1;
delay();
cs = 0;
delay();
send(WRSR);
send(WDT);//设置X5045
cs = 1;
delay1();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -