📄 display.c
字号:
#include <reg52.h>
#include <intrins.h>
unsigned char data STATUS;
#define Idle 0
#define Receiving 1
#define Sending 2
#define Data 3
unsigned char data Rx_Count;
unsigned char data Tx_Count;
unsigned char data Tx_Length;
unsigned char data Timeout;
unsigned int Count_1ms;
code char string[15] ="Welcome you!\r\n";
code char Time[16] = "Time set OK!\r\n";
code char Date[16] = "Date set OK!\r\n";
code char Eorr[16] = "Input data OK!\r\n";
code char Init_Date[7] = "0080320";
code char Init_Time[7] = "1161215";
//0 1 2 3 4 5 6 7 8 9
code char LED_NUM[11] = {0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90,0x00};
unsigned char data Rx_Buffer[16];
unsigned char data Tx_Buffer[16];
unsigned char data LED_Date[7];
unsigned char data LED_Time[7];
unsigned char data LED_Disp[7];
sbit Buzzer = P1^0; //0:响 1:不响
sbit IIC_CLK = P0^0;
sbit IIC_DI = P0^1;
sbit LED = P0^2; //0:亮
bit Flag;
bdata Key;
#define OSC_CLK (11059200UL)
#define OSC_INST (12) //每条指令的时钟周期
#define Time_1ms (65536-(unsigned int)(OSC_CLK/(OSC_INST * 1085)))
#define TH_1ms (Time_1ms / 256)
#define TL_1ms (Time_1ms % 256)
/****************************************************/
/*硬件初始化*/
/****************************************************/
void Init()
{
TMOD=0x11; //t0为16位定时器,t1为16位定时器,模式1 GATE C/T M1 M0
SCON=0x50; //串行口工作在模式1,波特率可变 SM0 SM1 SM2 REN TB8 RB8 TI RI
PCON=0; //SMOD=0 定时器溢出率/32
TH0=0xfc;
TL0=0x17;
TR0=1;
TH1=TH_1ms;
TL1=TL_1ms;
TR1=1;
TI=0;
RI=0;
//TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL
TR2=0;
RCAP2H=0xff; //T2做波特率发生器
RCAP2L=0xdc;
RCLK=1; //接收时钟标志,1->为定时/计算器2为串口接收时钟
TCLK=1; //发送时钟标志
TR2=1;
/*开中断*/
IP=0x00; //PS=T0=T1
ET0=1;
ET1=1; //1ms定时
//ET2=1;
ES=1;
EA=1;
}
/****************************************************/
/*定时器0中断*/
/****************************************************/
void T0_int(void) interrupt 1 using 2
{
TL0=0;
TH0=0;
switch(STATUS)
{
case Receiving: //正在接收数据,进行数据包接收完成超时判定
{
if(Timeout<10)
Timeout++;
else
{
Timeout=0;
STATUS=Data; //数据包接收完成,等待处理数据
}
break;
}
case Sending: //正在发送数据,超时判断,如果超发送不成功释放RS232
{
if(Timeout<100)
Timeout++;
else
{
Timeout=0;
STATUS=Idle; //超时释放RS232
}
break;
}
case Idle:
{
Timeout=0;
}
default: break;
}
}
/****************************************************/
/*中断服务程序*/
/****************************************************/
void RS_int(void) interrupt 4 using 3
{
if(RI==1)
{
RI=0;
switch(STATUS)
{
case Idle:
{
Timeout=0;
Rx_Count=0;
STATUS=Receiving;
break;
}
case Receiving:
{
Timeout=0;
break;
}
}
Rx_Buffer[Rx_Count]=SBUF;
Rx_Count++;
Rx_Count %=16;
}
if(TI==1)
{
TI=0;
if((Tx_Count+1)>=Tx_Length) /*数据发送完毕*/
{
Tx_Count=0;
//Tx_Length=0;
STATUS=Idle;
return;
}
else
{ Timeout=0; //清除定时器
Tx_Count++;
SBUF=Tx_Buffer[Tx_Count];
}
}
}
/****************************************************/
/*T1 1ms子程序*/
/****************************************************/
void T1_int(void) interrupt 3 using 1
{
TR1 = 0;
TL1=TL_1ms;
TH1=TH_1ms;
TR1 = 1;
Count_1ms ++;
}
/****************************************************/
/*软件延时子程序*/
/****************************************************/
void deplay()
{
unsigned int i;
for(i=0;i<=3000;i++)
{
_nop_();
}
}
/****************************************************/
/*LED显示处理子程序*/
/****************************************************/
void LED_Display_Init(void)
{
unsigned char i;
for(i=0;i<7;i++)
{
LED_Date[i]=Init_Date[i];
LED_Time[i]=Init_Time[i];
}
}
void LED_display_Date(void)
{
unsigned char i;
LED_Disp[0] = 0xfc;
for(i=1;i<7;i++)
{
LED_Disp[i] = LED_NUM[(LED_Date[i])-0x30];
}
}
void LED_display_Time(void)
{
unsigned char i;
LED_Disp[0] = 0xfc;
for(i=1;i<7;i++)
{
LED_Disp[i] = LED_NUM[(LED_Time[i])-0x30];
}
//LED_Disp[2] = LED_Disp[2] - 0x10;
//LED_Disp[4] = LED_Disp[4] - 0x10;
}
/****************************************************/
/*IIC子程序 大约10微秒,最少为5.425微秒*/
/****************************************************/
void delay_IIC(void)
{
int x;
x++;
x++;
}
void writebyte(unsigned char Ndata)
{
unsigned char data i;
for (i=0;i<8;i++)
{
IIC_CLK = 0;
IIC_DI = (bit)(Ndata & 0x01);
delay_IIC();
IIC_CLK = 1;
delay_IIC();
IIC_CLK = 0;
Ndata >>= 1;
}
}
void write_LED(unsigned char LED_Data0,unsigned char LED_Data1,
unsigned char LED_Data2,unsigned char LED_Data3,
unsigned char LED_Data4,unsigned char LED_Data5,
unsigned char LED_Data6)
{
EA=0;
writebyte(LED_Data0);
writebyte(LED_Data1);
writebyte(LED_Data2);
writebyte(LED_Data3);
writebyte(LED_Data4);
writebyte(LED_Data5);
writebyte(LED_Data6);
EA=1;
}
/****************************************************/
/*RS接收数据处理*/
/****************************************************/
void RS_Data(void)
{
unsigned char i;
if(Rx_Buffer[0]=='0')
{
for(i=1;i<7;i++)
{
if(Rx_Buffer[i]<='9'&&Rx_Buffer[i]>='0')
{
LED_Date[i] = Rx_Buffer[i];
}
else LED_Date[i] = '1';
}
for(i=0;i<16;i++)
{
Tx_Buffer[i] = Date[i];
}
}
else if(Rx_Buffer[0]=='1')
{
for(i=1;i<7;i++)
{
if(Rx_Buffer[i]<='9'&&Rx_Buffer[i]>='0')
{
LED_Time[i] = Rx_Buffer[i];
}
else LED_Time[i] = '1';
}
for(i=0;i<16;i++)
{
Tx_Buffer[i] = Time[i];
}
}
else
{
for(i=0;i<16;i++)
{
Tx_Buffer[i] = Eorr[i];
}
}
Tx_Length = 16;
}
/****************************************************/
/*RS接收数据处理*/
/****************************************************/
void Time_Data(void)
{
unsigned char hour,sec,min;
unsigned char year,mon,date;
/**********************************/
hour = (LED_Time[1]-0x30)*10+(LED_Time[2]-0x30);
sec = (LED_Time[3]-0x30)*10+(LED_Time[4]-0x30);
min = (LED_Time[5]-0x30)*10+(LED_Time[6]-0x30);
year = (LED_Date[1]-0x30)*10+(LED_Date[2]-0x30);
mon = (LED_Date[3]-0x30)*10+(LED_Date[4]-0x30);
date = (LED_Date[5]-0x30)*10+(LED_Date[6]-0x30);
/*********************************/
if(Count_1ms >= 1000)
{
Count_1ms = Count_1ms - 1000;
min++;
}
if(min > 59)
{
min = 0;
sec ++;
}
if(sec > 59)
{
sec = 0;
hour++;
}
if(hour > 23)
{
hour = 0;
date ++;
}
switch(mon)
{
case 1:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 2:
{
if(year%4==0)
{
if(date>29)
{
mon++;
date=1;
}
}
else
{
if(date>28)
{
mon++;
date = 1;
}
}
break;
}
case 3:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 4:
{
if(date>30)
{
mon++;
date=1;
}
break;
}
case 5:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 6:
{
if(date>30)
{
mon++;
date=1;
}
break;
}
case 7:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 8:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 9:
{
if(date>30)
{
mon++;
date=1;
}
break;
}
case 10:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
case 11:
{
if(date>30)
{
mon++;
date=1;
}
break;
}
case 12:
{
if(date>31)
{
mon++;
date=1;
}
break;
}
default: break;
}
if(mon>12)
{
mon=1;
year++;
}
/**********************************/
LED_Time[1] = hour/10+0x30;
LED_Time[2] = hour%10+0x30;
LED_Time[3] = sec/10+0x30;
LED_Time[4] = sec%10+0x30;
LED_Time[5] = min/10+0x30;
LED_Time[6] = min%10+0x30;
LED_Date[1] = year/10+0x30;
LED_Date[2] = year%10+0x30;
LED_Date[3] = mon/10+0x30;
LED_Date[4] = mon%10+0x30;
LED_Date[5] = date/10+0x30;
LED_Date[6] = date%10+0x30;
/*********************************/
}
/****************************************************/
/*主函数入口*/
/****************************************************/
void main()
{
unsigned char i;
bit RS_Flag,Date_Flag;
unsigned int LED_count,Display_count;
STATUS = 0x00;
Rx_Count = 0x00;
Tx_Count = 0x00;
Tx_Length = 0x00;
Timeout = 0x00;
Count_1ms = 0x00;
Buzzer = 1;
IIC_DI = 0;
IIC_CLK = 0;
LED = 0;
Flag = 1;
RS_Flag = 0;
Date_Flag = 0;
Init();
LED_Display_Init();
Tx_Length = 14;
/*************RS初始化*******************/
for(i=0;i<15;i++)
{
Tx_Buffer[i] = string[i];
}
Tx_Count = 0x00;
SBUF = Tx_Buffer[0];
STATUS = Sending;
/***************************************/
while(1)
{
switch(STATUS)
{
case Data:
{
RS_Data();
STATUS = Idle;
RS_Flag = 1;
break;
}
case Idle:
{
if(RS_Flag)
{
Tx_Count = 0x00;
SBUF = Tx_Buffer[0];
STATUS = Sending;
RS_Flag = 0;
}
break;
}
default: break;
}
/**************************************************/
if(Date_Flag == 1)
{
LED = 0;
}
else
{
if(LED_count<10)
{
LED = 0;
}
else if(LED_count <20)
{
LED = 1;
}
else LED_count = 0;
LED_count++;
}
/**************************************************/
Key = P1;
if( (Key & 0x80) == 0)
{
//deplay();
deplay();
Key = P1;
if( (Key & 0x80) == 0)
{
if(Flag == 1)
{
Flag = 0;
}
else Flag = 1;
while( (Key & 0x80) == 0)
{
Key = P1;
}
}
}
Buzzer = Flag;
/********************************************************/
deplay();
Time_Data();
if(Display_count<100)
{
LED_display_Date();
if(!Date_Flag)
{
write_LED(LED_Disp[0],LED_Disp[1],LED_Disp[2],
LED_Disp[3],LED_Disp[4],LED_Disp[5],LED_Disp[6]);
Date_Flag = 1;
}
}
else if(Display_count <1000)
{
LED_display_Time();
write_LED(LED_Disp[0],LED_Disp[1],LED_Disp[2],
LED_Disp[3],LED_Disp[4],LED_Disp[5],LED_Disp[6]);
Date_Flag = 0;
}
else Display_count = 0;
Display_count++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -