⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 基于51单片机的源码,内有液晶显示(IIC)接口,还实现串口和定时操作等功能.
💻 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 + -