欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

累成狗做的

程序员文章站 2022-07-01 20:30:09
...

display。c

#include “main.h”

BYTE Sec = 0; // 当前秒
BYTE Cent = 0; // 当前分
BYTE Hour = 0; // 当前时
BYTE Year = 0; // 当前年
BYTE Day = 0; // 当前日
BYTE Week = 0; // 当前星期
BYTE Month = 0; // 当前月

// LED开始状态
bit LED_START_FLAG = 0;

// 串口接收数据的状态
// 0:起始状态
// 1:开始
// 2:接收到控制码
// 3:接收到数据长度
// 4:校验和通过
BYTE RECEIVE_STATUS = 0;
// 串口数据控制字段
// 0x01:擦除指定的扇区
// 0x02:接收到立面数据
BYTE Usart_Control = 0;
// 串口数据校验和
BYTE Rev_Verify = 0;
// 串口数据长度
BYTE Rev_Length = 0;
// 立面数据长度
BYTE Data_Length_1 = 0;
// 立面数据保存OK
BYTE Data_OK_1 = 1;
// 平面数据长度
BYTE Data_Length_2 = 0;
// 平面数据保存OK
BYTE Data_OK_2 = 0;
// 串口实际接收的数据长度
BYTE Rev_Count = 0;
// 接收数据完成
BYTE Rev_Data_Complete = 0;
// 串口接收的数据内容
BYTE rev_data[256] = {0};
BYTE Rev_adderss = 0;
//服务器协议的地址域保存
BYTE Rev_f_control = 0;
//服务器协议的控制码保存
BYTE Rev_f_length;
//服务器协议的数据长度保存
BYTE Rev_f_Verify = 0;
//服务器协议的crc16校验码保存
BYTE Rev_f_Verify_1 = 0;
//服务器协议的crc16校验码保存

BYTE END_SERVICE = 0XA9;
BYTE START_SERVICE = 0X9A;

BYTE cn1,cn2;

void Delay10us() //@18.432MHz
{
unsigned char i;

i = 43;
while (--i);

}

void delayns(WORD n)
{
WORD i = 0;
for( i = 0; i < n; i++)
{
Delay10us();
}
}

void main()
{

WORD i = 0;
	WORD j = 0;
	BYTE rom_data = 0;

EA = 1; // 打开总中断
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 打开外部中断0

// 关闭所有LED
P0 = 0XFF;
P1 = 0XFF;

	Ds1302Init();
	UartInit();

// IapEraseSector(IAP_ADDRESS);
// for(i = 0; i < 100; i++)
// {
// IapProgramByte(IAP_ADDRESS + i, (BYTE)(i + 3));
// }
// delayns(1);
// for(i = 0; i < 100; i++)
// {
// rom_data = IapReadByte(IAP_ADDRESS + i);
// SendData(rom_data);
// }

while(1)
{

// displayxinxing();
// displayks();
if(LED_START_FLAG == 1) // 为0时表示导通
{
LED_START_FLAG = 0; // 重置一圈标记位

// displayDigitalTime();
cn1 = IapReadByte(0x05);
cn2 = IapReadByte(0x06);

				if(cn1==1)
				{
					displayks();
				}
				
				if(cn2==1)
				{
					displayshi();
				}
				
				if(cn2==2)
				{
					displayshi1();
				}
				
				if(cn2==3)
				{
					displayDigitalTime();
				}
				if(cn2==4)
				{
					displayxinxing();
				}
				
				
				
				
				
        
		// 显示立面信息
		if(Data_OK_1)
		{
					displayEepromFont_1();

// for(i = 0; i < Data_Length_1; i++)
// {
// SendData(IapReadByte(i));
// }
}
}

	if(Rev_Data_Complete) // 接收数据完成
	{
		Rev_Data_Complete = 0; // 清空数据接收完毕
		if(0x01 == Usart_Control) // 删除前一半扇区(立面数据)
		{
			Data_OK_1 = 0; // 禁止显示立面数据
			for(i = 0; i < 27; i++)
			{
				IapEraseSector(i * 0x200);
			}
			SendData(0x06);
		}
		if(0x02 == Usart_Control) // 删除后一半扇区(平面数据)
		{
			Data_OK_2 = 0; // 禁止显示平面数据
			for(i = 27; i < 56; i++)
			{
				IapEraseSector(i * 0x200);
			}
			SendData(0x07);
		}
		if(0x03 == Usart_Control) // 保存立面数据
		{
			Data_Length_1 = Rev_Length; // 保存立面数据长度
			IapProgramByte(0,Data_Length_1);
			for(i = 0; i < Rev_Length; i++)
			{
				IapProgramByte(i, rev_data[i]);  
			}
				Data_OK_1 = Data_OK_1 + Rev_Length;
			SendData(0x08);			
		}
		if(0x04 == Usart_Control) // 保存平面数据
		{
			Data_Length_2 = Rev_Length; // 保存平面数据长度
				IapProgramByte(0,Data_Length_2);
			for(i = 0; i < Rev_Length; i++)
			{
				IapProgramByte(0x3600 + i, rev_data[i]);  
			}
			Data_OK_2 = Data_OK_2 + Rev_Length;
			SendData(0x09);
		}
		
		if(0x05 == Usart_Control)
		{
			cn1=1;
			IapProgramByte(5,cn1);//开始
			SendData(0x10);
		}
		
		if(0x06 == Usart_Control)
		{
			cn2=1;
			IapProgramByte(6,cn2);//但愿人长久
			SendData(0x11);
		}
		
		if(0x07 == Usart_Control)
		{
			cn2=2;
			IapProgramByte(6,cn2);//千里共婵娟
			SendData(0x11);
		}
		
	if(0x08 == Usart_Control)
	{
			cn2=3;
			IapProgramByte(6,cn2);//时间
			SendData(0x12);
	}
	if(0x09 == Usart_Control)
	{
			cn2=4;
			IapProgramByte(6,cn2);//心形
			SendData(0x13);
	}
	
		
	}
}

}

void Led_Start(void) interrupt 0
{
EX0 = 0; // 关闭中断0
LED_START_FLAG = 1;

Ds1302ReadTime();

// 括号正确很重要
Sec = (((TIME[0] >> 4) & 0x07) * 10) + (TIME[0] & 0x0F);
Cent = (((TIME[1] >> 4) & 0x07) * 10) + (TIME[1] & 0x0F);
Hour = (((TIME[2] >> 4) & 0x07) * 10) + (TIME[2] & 0x0F);
Day = (((TIME[3] >> 4) & 0x07) * 10) + (TIME[3] & 0x0F);
Month = (((TIME[4] >> 4) & 0x07) * 10) + (TIME[4] & 0x0F);
Week = (((TIME[5] >> 4) & 0x07) * 10) + (TIME[5] & 0x0F);
Year = (((TIME[6] >> 4) & 0x07) * 10) + (TIME[6] & 0x0F);

EX0 = 1; // 打开中断0

}

/----------------------------
UART interrupt service routine
----------------------------
/
void Uart_Isr() interrupt 4
{
BYTE rev_tmp_data = 0;
if (RI)
{
RI = 0; //Clear receive interrupt flag
rev_tmp_data = SBUF; //P0 show UART data
// 根据接收状态控制流程
switch(RECEIVE_STATUS)
{
case 0://判断9A
if(START_SERVICE == rev_tmp_data)
{
RECEIVE_STATUS = 1; // 修改接收状态位开始
}
break;
case 1://接收地域码
if(Rev_Count < 6)
{
rev_data[Rev_Count] = rev_tmp_data;
Rev_Count++;
if(Rev_Count == 6)
{
RECEIVE_STATUS = 2;
Rev_Count = 0;
}
break;
}
break;
case 2://接收服务器控制码
Rev_f_control = rev_tmp_data;
RECEIVE_STATUS = 3;
break;
case 3://接收服务器数据长度
Rev_f_length = rev_tmp_data;
RECEIVE_STATUS = 4;
break;
case 4://判断数据协议
if(START == rev_tmp_data) // 如果接收到开始数据
{
RECEIVE_STATUS = 5; // 修改接收状态位开始
}else
{
RECEIVE_STATUS = 0;
}
break;

				case 5://接收数据控制码,主函数就以这个控制码为准
						Usart_Control = rev_tmp_data;
						RECEIVE_STATUS = 6;
						break;
				
				case 6://接收数据长度码
						Rev_Length = rev_tmp_data;
						RECEIVE_STATUS = 7;
						break;
				
				case 7://接收数据校验码(无用)
								Rev_Verify = rev_tmp_data;
								RECEIVE_STATUS = 8;
						break;
				case 8://判断数据协议尾
						if(END == rev_tmp_data) // 数据接收完成
						{
								RECEIVE_STATUS = 9;
						}
						break;
				case 9://接收服务器校验码(无用)
						Rev_f_Verify = rev_tmp_data;
						RECEIVE_STATUS = 10;
						break;
				case 10://接收服务器校验码(无用)
						Rev_f_Verify_1 = rev_tmp_data;
						RECEIVE_STATUS = 11;
						break;
				case 11://接收服务器协议结束码
						if(END_SERVICE == rev_tmp_data) // 数据接收完成
						{
								Rev_Data_Complete = 1;
								RECEIVE_STATUS = 0;
						}
						break;
						
			}
}
if (TI)
{
    TI = 0;             //Clear transmit interrupt flag
    busy = 0;           //Clear transmit busy flag
}

}

//void Ir_Timer_Isr(void) interrupt 1 using 1
//{
// TL0 = T0US; //initial timer0 low byte
// TH0 = T0US >> 8; //initial timer0 high byte
//
// if(count >= 5000)
// {
// Sc–;
// sk++;
// count = 0;
// }
// count++;
// if(sk == 10)
// {
// sk = 0;
// Sc = Sc - 6;
// }
// if(Sc < 0)
// {
// Sc = 0x99;
// }
//}

//void IrInit(void) //100微秒@18.432MHz
//{
//
// //200us @18.432MHz
// TMOD |= 0x01; /t timer0 as mode1 (16-bit)
// TL0 = T0US; //initial timer0 low byte
// TH0 = T0US >> 8; //initial timer0 high byte
// ET0 = 1; //enable timer0 interrupt
// TR0 = 0;
//}

多少302

#include “main.h”

//DS1302引脚连接
sbit DSIO = P3 ^ 6;
sbit RST = P3 ^ 7;
sbit SCLK = P3 ^ 5;

//DS1302读写程序*******//
//—DS1302写入和读取时分秒的地址命令—//
//—秒分时日月周年 最低位读写位;-------//
BYTE code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
BYTE code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//—DS1302时钟初始化2019年5月21日星期二12点01分00秒。—//
//—存储顺序是 秒、 分、 时、 日、 月、 周、 年, 存储格式是用BCD码—//
BYTE TIME[7] = {0x12, 0x18, 0x16, 0x22, 0x05, 0x03, 0x19};

/*******************************************************************************

  • 函 数 名 : Ds1302Write
  • 函数功能 : 向DS1302命令(地址+数据)
  • 输 入 : addr,dat
  • 输 出 : 无
    *******************************************************************************/

void Ds1302Write(BYTE addr, BYTE dat)
{
BYTE n;
RST = 0;
nop();

SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();

for (n=0; n<8; n++)//开始传送八位地址命令
{
    DSIO = addr & 0x01;//数据从低位开始传送
    addr >>= 1;
    SCLK = 1;//数据在上升沿时,DS1302读取数据
    _nop_();
    SCLK = 0;
    _nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
    DSIO = dat & 0x01;
    dat >>= 1;
    SCLK = 1;//数据在上升沿时,DS1302读取数据
    _nop_();
    SCLK = 0;
    _nop_();    
}   
     
RST = 0;//传送数据结束
_nop_();

}

/*******************************************************************************

  • 函 数 名 : Ds1302Read
  • 函数功能 : 读取一个地址的数据
  • 输 入 : addr
  • 输 出 : dat
    *******************************************************************************/

BYTE Ds1302Read(BYTE addr)
{
BYTE n,dat,dat1;
RST = 0;
nop();

SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();

for(n=0; n<8; n++)//开始传送八位地址命令
{
    DSIO = addr & 0x01;//数据从低位开始传送
    addr >>= 1;
    SCLK = 1;//数据在上升沿时,DS1302读取数据
    _nop_();
    SCLK = 0;//DS1302下降沿时,放置数据
    _nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
    dat1 = DSIO;//从最低位开始接收
    dat = (dat>>1) | (dat1<<7);
    SCLK = 1;
    _nop_();
    SCLK = 0;//DS1302下降沿时,放置数据
    _nop_();
}

RST = 0;
_nop_();    //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat; 

}

/*******************************************************************************

  • 函 数 名 : Ds1302Init
  • 函数功能 : 初始化DS1302.
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/

void Ds1302Init(void)
{
BYTE n;
Ds1302Write(0x8E, 0X00); //禁止写保护,就是关闭写保护功能
for (n = 0; n < 7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n], TIME[n]);
}
Ds1302Write(0x8E, 0x80); //打开写保护功能
}

/*******************************************************************************

  • 函 数 名 : Ds1302ReadTime
  • 函数功能 : 读取时钟信息
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/

void Ds1302ReadTime(void)
{
BYTE n;
for (n = 0; n < 7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}

uart。c
#include “main.h”

#define FOSC 18432000L //系统频率
#define BAUD 4800 //UART baudrate

bit busy;

void SendData(BYTE dat);
void SendString(char *s);

void UartInit(void)
{
SCON = 0x50; //8-bit variable UART

TMOD = 0x20;            //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //设置自动重载vaule
TR1 = 1;                //Timer1 start run
	REN = 1;
	SM0 = 0;
	SM1 = 1;
ES = 1;                 //Enable UART interrupt
EA = 1;                 //Open master interrupt switch

}

/----------------------------
将字节数据发送到UART
输入:dat(要发送的数据)
输出:无
----------------------------
/
void SendData(BYTE dat)
{
while (busy); //等待完成之前发送的数据
ACC = dat; //计算偶校验位P(PSW.0)
busy = 1;
SBUF = ACC; //将数据发送到UART缓冲区
}

/----------------------------
将字符串发送到UART
输入:s(字符串的地址)
输出:无
----------------------------
/
void SendString(char *s)
{
while (*s) //检查字符串的结尾
{
SendData(*s++); //发送当前字符和增量字符串ptr
}
}

main。c
#include “main.h”

BYTE Sec = 0; // 当前秒
BYTE Cent = 0; // 当前分
BYTE Hour = 0; // 当前时
BYTE Year = 0; // 当前年
BYTE Day = 0; // 当前日
BYTE Week = 0; // 当前星期
BYTE Month = 0; // 当前月

// LED开始状态
bit LED_START_FLAG = 0;

// 串口接收数据的状态
// 0:起始状态
// 1:开始
// 2:接收到控制码
// 3:接收到数据长度
// 4:校验和通过
BYTE RECEIVE_STATUS = 0;
// 串口数据控制字段
// 0x01:擦除指定的扇区
// 0x02:接收到立面数据
BYTE Usart_Control = 0;
// 串口数据校验和
BYTE Rev_Verify = 0;
// 串口数据长度
BYTE Rev_Length = 0;
// 立面数据长度
BYTE Data_Length_1 = 0;
// 立面数据保存OK
BYTE Data_OK_1 = 1;
// 平面数据长度
BYTE Data_Length_2 = 0;
// 平面数据保存OK
BYTE Data_OK_2 = 0;
// 串口实际接收的数据长度
BYTE Rev_Count = 0;
// 接收数据完成
BYTE Rev_Data_Complete = 0;
// 串口接收的数据内容
BYTE rev_data[256] = {0};
BYTE Rev_adderss = 0;
//服务器协议的地址域保存
BYTE Rev_f_control = 0;
//服务器协议的控制码保存
BYTE Rev_f_length;
//服务器协议的数据长度保存
BYTE Rev_f_Verify = 0;
//服务器协议的crc16校验码保存
BYTE Rev_f_Verify_1 = 0;
//服务器协议的crc16校验码保存

BYTE END_SERVICE = 0XA9;
BYTE START_SERVICE = 0X9A;

BYTE cn1,cn2;

void Delay10us() //@18.432MHz
{
unsigned char i;

i = 43;
while (--i);

}

void delayns(WORD n)
{
WORD i = 0;
for( i = 0; i < n; i++)
{
Delay10us();
}
}

void main()
{

WORD i = 0;
	WORD j = 0;
	BYTE rom_data = 0;

EA = 1; // 打开总中断
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 打开外部中断0

// 关闭所有LED
P0 = 0XFF;
P1 = 0XFF;

	Ds1302Init();
	UartInit();

// IapEraseSector(IAP_ADDRESS);
// for(i = 0; i < 100; i++)
// {
// IapProgramByte(IAP_ADDRESS + i, (BYTE)(i + 3));
// }
// delayns(1);
// for(i = 0; i < 100; i++)
// {
// rom_data = IapReadByte(IAP_ADDRESS + i);
// SendData(rom_data);
// }

while(1)
{

// displayxinxing();
// displayks();
if(LED_START_FLAG == 1) // 为0时表示导通
{
LED_START_FLAG = 0; // 重置一圈标记位

// displayDigitalTime();
cn1 = IapReadByte(0x05);
cn2 = IapReadByte(0x06);

				if(cn1==1)
				{
					displayks();
				}
				
				if(cn2==1)
				{
					displayshi();
				}
				
				if(cn2==2)
				{
					displayshi1();
				}
				
				if(cn2==3)
				{
					displayDigitalTime();
				}
				if(cn2==4)
				{
					displayxinxing();
				}
				
				
				
				
				
        
		// 显示立面信息
		if(Data_OK_1)
		{
					displayEepromFont_1();

// for(i = 0; i < Data_Length_1; i++)
// {
// SendData(IapReadByte(i));
// }
}
}

	if(Rev_Data_Complete) // 接收数据完成
	{
		Rev_Data_Complete = 0; // 清空数据接收完毕
		if(0x01 == Usart_Control) // 删除前一半扇区(立面数据)
		{
			Data_OK_1 = 0; // 禁止显示立面数据
			for(i = 0; i < 27; i++)
			{
				IapEraseSector(i * 0x200);
			}
			SendData(0x06);
		}
		if(0x02 == Usart_Control) // 删除后一半扇区(平面数据)
		{
			Data_OK_2 = 0; // 禁止显示平面数据
			for(i = 27; i < 56; i++)
			{
				IapEraseSector(i * 0x200);
			}
			SendData(0x07);
		}
		if(0x03 == Usart_Control) // 保存立面数据
		{
			Data_Length_1 = Rev_Length; // 保存立面数据长度
			IapProgramByte(0,Data_Length_1);
			for(i = 0; i < Rev_Length; i++)
			{
				IapProgramByte(i, rev_data[i]);  
			}
				Data_OK_1 = Data_OK_1 + Rev_Length;
			SendData(0x08);			
		}
		if(0x04 == Usart_Control) // 保存平面数据
		{
			Data_Length_2 = Rev_Length; // 保存平面数据长度
				IapProgramByte(0,Data_Length_2);
			for(i = 0; i < Rev_Length; i++)
			{
				IapProgramByte(0x3600 + i, rev_data[i]);  
			}
			Data_OK_2 = Data_OK_2 + Rev_Length;
			SendData(0x09);
		}
		
		if(0x05 == Usart_Control)
		{
			cn1=1;
			IapProgramByte(5,cn1);//开始
			SendData(0x10);
		}
		
		if(0x06 == Usart_Control)
		{
			cn2=1;
			IapProgramByte(6,cn2);//但愿人长久
			SendData(0x11);
		}
		
		if(0x07 == Usart_Control)
		{
			cn2=2;
			IapProgramByte(6,cn2);//千里共婵娟
			SendData(0x11);
		}
		
	if(0x08 == Usart_Control)
	{
			cn2=3;
			IapProgramByte(6,cn2);//时间
			SendData(0x12);
	}
	if(0x09 == Usart_Control)
	{
			cn2=4;
			IapProgramByte(6,cn2);//心形
			SendData(0x13);
	}
	
		
	}
}

}

void Led_Start(void) interrupt 0
{
EX0 = 0; // 关闭中断0
LED_START_FLAG = 1;

Ds1302ReadTime();

// 括号正确很重要
Sec = (((TIME[0] >> 4) & 0x07) * 10) + (TIME[0] & 0x0F);
Cent = (((TIME[1] >> 4) & 0x07) * 10) + (TIME[1] & 0x0F);
Hour = (((TIME[2] >> 4) & 0x07) * 10) + (TIME[2] & 0x0F);
Day = (((TIME[3] >> 4) & 0x07) * 10) + (TIME[3] & 0x0F);
Month = (((TIME[4] >> 4) & 0x07) * 10) + (TIME[4] & 0x0F);
Week = (((TIME[5] >> 4) & 0x07) * 10) + (TIME[5] & 0x0F);
Year = (((TIME[6] >> 4) & 0x07) * 10) + (TIME[6] & 0x0F);

EX0 = 1; // 打开中断0

}

/----------------------------
UART interrupt service routine
----------------------------
/
void Uart_Isr() interrupt 4
{
BYTE rev_tmp_data = 0;
if (RI)
{
RI = 0; //Clear receive interrupt flag
rev_tmp_data = SBUF; //P0 show UART data
// 根据接收状态控制流程
switch(RECEIVE_STATUS)
{
case 0://判断9A
if(START_SERVICE == rev_tmp_data)
{
RECEIVE_STATUS = 1; // 修改接收状态位开始
}
break;
case 1://接收地域码
if(Rev_Count < 6)
{
rev_data[Rev_Count] = rev_tmp_data;
Rev_Count++;
if(Rev_Count == 6)
{
RECEIVE_STATUS = 2;
Rev_Count = 0;
}
break;
}
break;
case 2://接收服务器控制码
Rev_f_control = rev_tmp_data;
RECEIVE_STATUS = 3;
break;
case 3://接收服务器数据长度
Rev_f_length = rev_tmp_data;
RECEIVE_STATUS = 4;
break;
case 4://判断数据协议
if(START == rev_tmp_data) // 如果接收到开始数据
{
RECEIVE_STATUS = 5; // 修改接收状态位开始
}else
{
RECEIVE_STATUS = 0;
}
break;

				case 5://接收数据控制码,主函数就以这个控制码为准
						Usart_Control = rev_tmp_data;
						RECEIVE_STATUS = 6;
						break;
				
				case 6://接收数据长度码
						Rev_Length = rev_tmp_data;
						RECEIVE_STATUS = 7;
						break;
				
				case 7://接收数据校验码(无用)
								Rev_Verify = rev_tmp_data;
								RECEIVE_STATUS = 8;
						break;
				case 8://判断数据协议尾
						if(END == rev_tmp_data) // 数据接收完成
						{
								RECEIVE_STATUS = 9;
						}
						break;
				case 9://接收服务器校验码(无用)
						Rev_f_Verify = rev_tmp_data;
						RECEIVE_STATUS = 10;
						break;
				case 10://接收服务器校验码(无用)
						Rev_f_Verify_1 = rev_tmp_data;
						RECEIVE_STATUS = 11;
						break;
				case 11://接收服务器协议结束码
						if(END_SERVICE == rev_tmp_data) // 数据接收完成
						{
								Rev_Data_Complete = 1;
								RECEIVE_STATUS = 0;
						}
						break;
						
			}
}
if (TI)
{
    TI = 0;             //Clear transmit interrupt flag
    busy = 0;           //Clear transmit busy flag
}

}

//void Ir_Timer_Isr(void) interrupt 1 using 1
//{
// TL0 = T0US; //initial timer0 low byte
// TH0 = T0US >> 8; //initial timer0 high byte
//
// if(count >= 5000)
// {
// Sc–;
// sk++;
// count = 0;
// }
// count++;
// if(sk == 10)
// {
// sk = 0;
// Sc = Sc - 6;
// }
// if(Sc < 0)
// {
// Sc = 0x99;
// }
//}

//void IrInit(void) //100微秒@18.432MHz
//{
//
// //200us @18.432MHz
// TMOD |= 0x01; /t timer0 as mode1 (16-bit)
// TL0 = T0US; //initial timer0 low byte
// TH0 = T0US >> 8; //initial timer0 high byte
// ET0 = 1; //enable timer0 interrupt
// TR0 = 0;
//}

eeprom。c

/------------------------------------------------------------------/
/* — STC MCU Limited ---------------------------------------------/
/
— STC12C5Axx Series MCU ISP/IAP/EEPROM Demo -------------------/
/
— Mobile: (86)13922805190 -------------------------------------/
/
— Fax: 86-0513-55012956,55012947,55012969 ---------------------/
/
— Tel: 86-0513-55012928,55012929,55012966----------------------/
/
— Web: www.STCMCU.com -----------------------------------------/
/
— Web: www.GXWMCU.com -----------------------------------------/
/
If you want to use the program or the program referenced in the /
/
article, please specify in which data and procedures from STC /
/
------------------------------------------------------------------*/

#include “main.h”

/Define ISP/IAP/EEPROM command/
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-Read
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase

/Define ISP/IAP/EEPROM operation const for IAP_CONTR/
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz

void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

/----------------------------
禁用ISP / IAP / EEPROM功能
使MCU处于安全状态
----------------------------
/
void IapIdle()
{
IAP_CONTR = 0; //关闭 IAP 功能
IAP_CMD = 0; //清除命令到待机状态
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //数据ptr指向非EEPROM区域
IAP_ADDRL = 0; //清除IAP地址以防止滥用
}

/----------------------------
从ISP / IAP / EEPROM区域读取一个字节
输入:addr(ISP / IAP / EEPROM地址)
输出:Flash数据
----------------------------
/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //Data buffer

IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
_nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
IapIdle();                      //Close ISP/IAP/EEPROM function

return dat;                     //Return Flash data

}

/----------------------------
将一个字节编程到ISP / IAP / EEPROM区域
输入:addr(ISP / IAP / EEPROM地址)
dat(ISP / IAP / EEPROM数据)
输出:-
----------------------------
/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //打开IAP功能,并设置等待时间,
IAP_CMD = CMD_PROGRAM; //设置ISP / IAP / EEPROM PROGRAM命令。
IAP_ADDRL = addr; //设置ISP / IAP / EEPROM 低位地址。
IAP_ADDRH = addr >> 8; //设置ISP / IAP / EEPROM 高位地址。
IAP_DATA = dat; //Write ISP/IAP/EEPROM data
IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)发送触发器命令1(0x5a)
IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)发送触发器命令2(0xa5)
nop(); //MCU将保持在此处,直到ISP / IAP / EEPROM操作完成
IapIdle();
}

/*----------------------------

擦除一个扇区
输入:addr(ISP / IAP / EEPROM地址)
输出:-
----------------------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
IAP_TRIG = 0x5a; //Send trigger command1 (0x5a)
IAP_TRIG = 0xa5; //Send trigger command2 (0xa5)
nop(); //MCU will hold here until ISP/IAP/EEPROM operation complete
IapIdle();
}

zimo。c

#include “main.h”

// 时间的字模
const BYTE code time_zimo[12][16] =
{
0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,/“0”,0/

0xFF,0xFF,0xFF,0xFB,0xFF,0xFB,0xE0,0x03,0xF7,0xFB,0xF7,0xFB,0xFF,0xFF,0xFF,0xFF,/*"1",1*/

0xFF,0xFF,0xF0,0xF3,0xEF,0x7B,0xEF,0xBB,0xEF,0xDB,0xEF,0xEB,0xF1,0xF3,0xFF,0xFF,/*"2",2*/

0xFF,0xFF,0xF1,0xC7,0xEE,0xBB,0xEF,0x7B,0xEF,0x7B,0xEF,0xFB,0xF3,0xE7,0xFF,0xFF,/*"3",3*/

0xFF,0xDB,0xFF,0xDB,0xE0,0x03,0xF3,0xDB,0xFD,0xDB,0xFE,0x5F,0xFF,0x9F,0xFF,0xFF,/*"4",4*/

0xFF,0xFF,0xEF,0x8F,0xEF,0x77,0xEE,0xFB,0xEE,0xFB,0xEE,0xFB,0xE0,0x67,0xFF,0xFF,/*"5",5*/

0xFF,0xFF,0xFF,0x07,0xF6,0xFB,0xEE,0xFB,0xEE,0xFB,0xF7,0x77,0xF8,0x0F,0xFF,0xFF,/*"6",6*/

0xFF,0xFF,0xE7,0xFF,0xE9,0xFF,0xEE,0x7F,0xEF,0x83,0xEF,0xFF,0xE7,0xFF,0xFF,0xFF,/*"7",7*/

0xFF,0xFF,0xF1,0xC7,0xEE,0xBB,0xEF,0x7B,0xEF,0x7B,0xEE,0xBB,0xF1,0xC7,0xFF,0xFF,/*"8",8*/

0xFF,0xFF,0xF8,0x0F,0xF7,0x77,0xEF,0xBB,0xEF,0xBB,0xEF,0xB7,0xF0,0x7F,0xFF,0xFF,/*"9",9*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xF3,0xFC,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*":",10*/

0xFF,0xFF,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,/*"-",11*/

};
const BYTE code ti_zimo[10][16] =
{
0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,/“0”,0/

0xFF,0xFF,0xFF,0xFB,0xFF,0xFB,0xE0,0x03,0xF7,0xFB,0xF7,0xFB,0xFF,0xFF,0xFF,0xFF,/*"1",1*/

0xFF,0xFF,0xF0,0xF3,0xEF,0x7B,0xEF,0xBB,0xEF,0xDB,0xEF,0xEB,0xF1,0xF3,0xFF,0xFF,/*"2",2*/

0xFF,0xFF,0xF1,0xC7,0xEE,0xBB,0xEF,0x7B,0xEF,0x7B,0xEF,0xFB,0xF3,0xE7,0xFF,0xFF,/*"3",3*/

0xFF,0xDB,0xFF,0xDB,0xE0,0x03,0xF3,0xDB,0xFD,0xDB,0xFE,0x5F,0xFF,0x9F,0xFF,0xFF,/*"4",4*/

0xFF,0xFF,0xEF,0x8F,0xEF,0x77,0xEE,0xFB,0xEE,0xFB,0xEE,0xFB,0xE0,0x67,0xFF,0xFF,/*"5",5*/

0xFF,0xFF,0xFF,0x07,0xF6,0xFB,0xEE,0xFB,0xEE,0xFB,0xF7,0x77,0xF8,0x0F,0xFF,0xFF,/*"6",6*/

0xFF,0xFF,0xE7,0xFF,0xE9,0xFF,0xEE,0x7F,0xEF,0x83,0xEF,0xFF,0xE7,0xFF,0xFF,0xFF,/*"7",7*/

0xFF,0xFF,0xF1,0xC7,0xEE,0xBB,0xEF,0x7B,0xEF,0x7B,0xEE,0xBB,0xF1,0xC7,0xFF,0xFF,/*"8",8*/

0xFF,0xFF,0xF8,0x0F,0xF7,0x77,0xEF,0xBB,0xEF,0xBB,0xEF,0xB7,0xF0,0x7F,0xFF,0xFF,/*"9",9*/

};

const BYTE code font_zimo[8][16] =
{
0xFF,0xFE,0x7F,0xFF,0x9F,0xFF,0x07,0x00,0xF8,0xFF,0xBF,0xEF,0xDF,0xF3,0xE7,0xFC,
0xF0,0xBF,0xF7,0x7F,0x37,0x80,0xF7,0xFF,0xF7,0xFE,0xD7,0xF9,0xE7,0xE7,0xFF,0xFF,/“你”,0/

0xEF,0xBF,0xEF,0xDD,0x0F,0xEA,0xE0,0xF7,0xEF,0xE9,0x0F,0x9E,0xFF,0xFF,0x7F,0xFF,
0x7D,0xBF,0x7D,0x7F,0x1D,0x80,0x6D,0xFF,0x75,0xFF,0x79,0xFF,0x7F,0xFF,0xFF,0xFF,/*"好",1*/

0xFF,0xFF,0x8F,0xC7,0x77,0xDF,0xF7,0xDE,0xF7,0xDE,0xF7,0xDD,0xC7,0xE3,0xFF,0xFF,/*"S",2*/

0xFF,0xFF,0xF7,0xDF,0xF7,0xDF,0x07,0xC0,0xF7,0xDF,0xF7,0xDF,0xFF,0xFF,0xFF,0xFF,/*"I",3*/

0xFF,0xFF,0x8F,0xC7,0x77,0xDF,0xF7,0xDE,0xF7,0xDE,0xF7,0xDD,0xC7,0xE3,0xFF,0xFF,/*"S",4*/

0x1F,0xF0,0xEF,0xEF,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,0xEF,0xEF,0x1F,0xF0,0xFF,0xFF,/*"O",5*/

};

const BYTE code shi_zimo[] =
{
0xFF,0xFE,0x7F,0xFF,0x9F,0xFF,0x07,0x00,0xF8,0xFF,0xFF,0xBF,0x03,0xB0,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0x03,0xB0,0xFF,0xBF,0xFF,0xFF,/“但”,0/

0xFF,0x7F,0xFF,0x9F,0x01,0xE0,0xFD,0x7F,0xFD,0x9B,0x05,0xFD,0x55,0x9E,0x55,0x7B,0x51,0x77,0x55,0x48,0x55,0x7F,0x55,0x3E,0x05,0xFD,0xFD,0xEB,0xFD,0x9F,0xFF,0xFF,/“愿”,1/

0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xEF,0xFF,0xF3,0xFF,0xFC,0x3F,0xFF,0xC0,0xFF,0x3F,0xFF,0xFF,0xFC,0xFF,0xF3,0xFF,0xEF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,/“人”,2/

0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x00,0x00,0x7F,0xBF,0x7F,0xDE,0x5F,0xED,0x6F,0xFB,0x77,0xF7,0x7B,0xEF,0x7D,0xDF,0x7F,0xDF,0x7F,0xBF,0x7F,0xBF,0xFF,0xFF,/“长”,3/

0xFF,0x7F,0xFF,0x7E,0x7F,0xBF,0xBF,0xBF,0xCF,0xDF,0xF0,0xEF,0xF7,0xF7,0xF7,0xFB,0xF7,0xFC,0x37,0xF3,0xC7,0xEF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,/“久”,4/

};
const BYTE code shi1_zimo[] =
{
0x7F,0xFF,0x7F,0xFF,0x7B,0xFF,0x7B,0xFF,0x7B,0xFF,0x7B,0xFF,0x7B,0xFF,0x03,0x00,0x7D,0xFF,0x7D,0xFF,0x7D,0xFF,0x7C,0xFF,0x7D,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,/“千”,6/

0xFF,0xBF,0xFF,0xBF,0x01,0xBB,0x6D,0xBB,0x6D,0xBB,0x6D,0xBB,0x6D,0xBB,0x01,0x80,0x6D,0xBB,0x6D,0xBB,0x6D,0xBB,0x6D,0xBB,0x01,0xBB,0xFF,0xBF,0xFF,0xBF,0xFF,0xFF,/“里”,7/

0xFF,0xFF,0xFF,0xFB,0xEF,0x7B,0xEF,0xBB,0xEF,0xDB,0x00,0xE8,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0x00,0xE8,0xEF,0xDB,0xEF,0xBB,0xEF,0x7B,0xFF,0xFB,0xFF,0xFF,/“共”,8/

0xEF,0xBF,0xEF,0xDD,0x0F,0xEA,0xE0,0xF7,0xEF,0xE9,0x0F,0x9E,0xFF,0xEF,0x06,0xEC,0xB5,0xED,0xB3,0xED,0x07,0x00,0xB3,0xED,0xB5,0xED,0x06,0xEC,0xFF,0xEF,0xFF,0xFF,/“婵”,9/

0xEF,0x7D,0x0F,0x9A,0xE0,0xE7,0xEF,0xE9,0x0F,0x9E,0xFF,0xFF,0x3F,0x00,0xA1,0xED,0xAD,0xED,0xAD,0xED,0xAD,0xED,0xAD,0xAD,0xA1,0x6D,0x3F,0x80,0xFF,0xFF,0xFF,0xFF,/“娟”,10/
};
const BYTE code ks_zimo[3219] =
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0xFF,0xCB,0xFF,0xFD,0xFF,0xFF,0xFF,0xC7,0xFF,0xCB,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/
“*///0

0xFF,0xFF,0xFF,0xFF,0x0F,0xF0,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0x00,0x00,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0x0F,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,////1

0xDF,0xFE,0xEF,0xFE,0xD3,0xFE,0x18,0x80,0xDB,0xDE,0xDB,0xEE,0xEF,0xFB,0xF7,0xFD,0xEB,0x00,0x58,0xBD,0xBB,0xBD,0xDB,0xBD,0xEB,0xBD,0xF3,0x01,0xFF,0xFF,0xFF,0xFF,////2

0xEF,0xFB,0xEF,0xFC,0x2F,0xFF,0x00,0x00,0xAF,0xFF,0x6F,0xFB,0xFB,0xFD,0xFB,0xFE,0x7B,0xFF,0x1B,0x00,0xE3,0xFF,0x7B,0xFF,0xFB,0xFE,0xFB,0xF9,0xFB,0xFF,0xFF,0xFF,////3

0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xE9,0xFF,0xF1,0xFF,0xFF,0xFF,0xDF,0xFF,0xE9,0xFF,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,////4

0xFD,0xFF,0x1D,0x00,0xDD,0xFF,0xDD,0xF7,0xDD,0xF9,0x01,0xFE,0xDD,0xE9,0xDD,0xF7,0xDD,0xF9,0x01,0xFE,0xDD,0xFD,0xDD,0xB3,0xDD,0x7F,0x1D,0x80,0xFD,0xFF,0xFF,0xFF,////5

0xFF,0xBF,0xFF,0xCF,0x11,0xF0,0xD7,0xFB,0x57,0xFB,0x57,0xFB,0x57,0xFB,0x50,0xFB,0x57,0x00,0x57,0xFB,0x57,0xFB,0x57,0xFB,0x51,0xFB,0xDF,0xFB,0xFF,0xFB,0xFF,0xFF,////6

0xBF,0xFD,0xC3,0xF9,0xEF,0xFD,0x00,0x00,0xEF,0xFE,0xEF,0xFE,0xDF,0xFB,0xEF,0xBD,0x70,0xDE,0x87,0xE7,0xF7,0xB9,0x07,0x7E,0xF7,0xBF,0x07,0xC0,0xFF,0xFF,0xFF,0xFF,////7

0xFD,0xEF,0x01,0xE0,0x6D,0xF7,0x6D,0xF7,0x01,0x00,0xFD,0xFB,0xFF,0x7E,0xEF,0xBE,0xEE,0xCE,0xE9,0xF2,0x0F,0xFC,0xEB,0xF2,0xEC,0xCE,0xEF,0xBE,0xFF,0x7E,0xFF,0xFF,////8

0xFF,0xFF,0x01,0x00,0xFD,0xEF,0xDD,0xF7,0xBD,0xF9,0x7D,0xFE,0x8D,0xF1,0xFD,0xEF,0xDD,0xF7,0xBD,0xF9,0x7D,0xFE,0x8D,0xB1,0xFD,0x7F,0x01,0x80,0xFF,0xFF,0xFF,0xFF,////9

0xFF,0xBF,0xFF,0xCF,0x03,0xF0,0xFB,0xBF,0xBB,0xBF,0x7B,0xBE,0xFB,0xB1,0xDA,0xBF,0x39,0xBF,0xFB,0x9C,0xFB,0xAF,0xFB,0xB3,0xFB,0xBC,0x1B,0xBF,0xFB,0xBF,0xFF,0xFF,////10

0xFF,0x7F,0xFF,0x9F,0x01,0xE0,0xDD,0xFD,0xDD,0xFD,0xDD,0xFD,0xDD,0xFD,0x01,0x80,0xDD,0xFD,0xDD,0xFD,0xDD,0xBD,0xDD,0x7D,0x01,0x80,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,////11

0xEF,0xFB,0xEF,0xBB,0xEF,0x7D,0x00,0x80,0xEF,0xFE,0x6F,0x7F,0xF7,0x7F,0x77,0xBF,0x77,0xBC,0x77,0xD3,0x00,0xEF,0x77,0xD7,0x77,0xB9,0x77,0x7E,0xF7,0x7F,0xFF,0xFF,////12

0xFF,0xEF,0xEF,0xF7,0xEF,0xFB,0xEF,0xFD,0xEF,0xFE,0x2F,0xFF,0xCF,0xFF,0x00,0x00,0xCF,0xFF,0x2F,0xFF,0xED,0xFE,0xE3,0xFD,0xEF,0xFB,0xEF,0xF7,0xFF,0xEF,0xFF,0xFF,////13

0xEF,0xFB,0xEF,0xBB,0xEF,0x7D,0x00,0x80,0xEF,0xFE,0x6F,0x7F,0xF7,0x7F,0x77,0xBF,0x77,0xBC,0x77,0xD3,0x00,0xEF,0x77,0xD7,0x77,0xB9,0x77,0x7E,0xF7,0x7F,0xFF,0xFF,////14

0xF7,0xFF,0x33,0x00,0xB5,0xED,0xB6,0xED,0xB7,0xAD,0xB5,0x6D,0x33,0x80,0xE7,0xFF,0xFF,0xFF,0x80,0x81,0x77,0x77,0x77,0x77,0x7B,0x7B,0x7D,0x7D,0x1F,0x1F,0xFF,0xFF,////15

0xBF,0x7F,0xBD,0xBF,0x33,0xC0,0xFF,0xAE,0x83,0x76,0xA9,0x78,0x2A,0x6A,0xAB,0x5A,0x83,0x62,0xBF,0x5E,0xDF,0x6F,0x61,0x76,0xEF,0x79,0x0F,0x76,0xEF,0x4F,0xFF,0xFF,////16

0xBF,0xFF,0xBD,0xFF,0x33,0x80,0xFF,0xDF,0xFF,0xEF,0xBB,0xFF,0xAB,0x00,0xAB,0xEA,0xAB,0xEA,0x80,0xEA,0xAB,0xAA,0xAB,0x6A,0xAB,0x80,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,////17

0x77,0xF7,0x79,0xF7,0x5D,0xFB,0x55,0x7D,0x55,0x40,0x01,0xBD,0x55,0xDD,0x54,0xE1,0x55,0xDD,0x01,0xBD,0x55,0x40,0x55,0xFD,0x5D,0xFB,0x75,0xF7,0x79,0xF7,0xFF,0xFF////18
};
const BYTE code xinxing[]=
{ /心型变化/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xF7,0xFC,0xFB,0xFB,0xFD,0xF7,0xFD,0xEF,0xFD,0xDF,
0xFB,0xBF,0xF7,0x7F,0xFB,0xBF,0xFD,0xDF,0xFD,0xEF,0xFD,0xF7,0xFB,0xFB,0xF7,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0xF3,0xF8,0xF9,0xF3,0xF9,0xE7,0xF9,0xCF,
0xF3,0x9F,0xF7,0x3F,0xF3,0x9F,0xF9,0xCF,0xF9,0xE7,0xF9,0xF3,0xF3,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0xF1,0xF0,0xF1,0xE3,0xF1,0xC7,
0xE3,0x8F,0xE7,0x1F,0xE3,0x8F,0xF1,0xC7,0xF1,0xE3,0xF1,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0x01,0xF0,0xE1,0xE0,0xE1,0xC3,
0xC3,0x87,0xC7,0x0F,0xC3,0x87,0xE1,0xC3,0xE1,0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0x01,0xF0,0x01,0xE0,0xC1,0xC0,
0xC3,0x83,0xE7,0x07,0xC3,0x83,0xC1,0xC0,0x01,0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0x01,0xF0,0x01,0xE0,0x01,0xC0,
0xC3,0x80,0xE7,0x01,0xC3,0x80,0x01,0xC0,0x01,0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0x01,0xF0,0x01,0xE0,0x01,0xC0,
0x03,0x80,0x87,0x00,0x03,0x80,0x01,0xC0,0x01,0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0x07,0xFC,0x03,0xF8,0x01,0xF0,0x01,0xE0,0x01,0xC0,
0x03,0x80,0x07,0x00,0x03,0x80,0x01,0xC0,0x01,0xE0,0x01,0xF0,0x03,0xF8,0x07,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/“未命名文件”,0/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};

main。h

#ifndef MAIN_H
#define MAIN_H

#include “intrins.h”
#include “STC12C5A.h”

#define FOSC 18432000L
#define T0US (65536 - (FOSC / 12 / 1000000 * 200)) //200us timer calculation method in 12T mode

// 宏定义
typedef unsigned char BYTE;
typedef unsigned int WORD;

// 定义数值的字模
extern const BYTE code time_zimo[12][16];
// 定义文字字模
extern const BYTE code font_zimo[8][16];
extern const BYTE code shi_zimo[];
extern const BYTE code shi1_zimo[];
extern const BYTE code ks_zimo[32*19];
extern const BYTE code dtime_zimo[10][16];
extern const BYTE code ti_zimo[10][16];
extern const BYTE code xinxing[];
// 外部中断0,表示转了1圈
extern void displayshi(void);
extern void displayks(void);
extern void displayshi1(void);
extern void displaysj(void);
extern bit LED_START_FLAG;

extern void delayns(WORD n);

/=显示接口函数=/
// 立面数据长度
extern BYTE Data_Length_1;
// 平面数据长度
extern BYTE Data_Length_2;
// 显示平面数字时间
extern void displayDigitalTime(void);
// 从EEPROM中读取数据,并在立面显示
extern void displayEepromFont_1(void);
/*==================================================*/

/=DS1302的接口函数=/
/* 往DS1302写入数据 /
extern void Ds1302Write(BYTE addr, BYTE dat);
/
读取DS1302某地址的数据 /
extern BYTE Ds1302Read(BYTE addr);
/
初始化1302 /
extern void Ds1302Init(void);
/
读取DS1302中的时间 */
extern void Ds1302ReadTime();

extern BYTE TIME[7]; // 起始时间
extern BYTE Sec; // 当前秒
extern BYTE Cent; // 当前分
extern BYTE Hour; // 当前时
extern BYTE Year; // 当前年
extern BYTE Day; // 当前日
extern BYTE Week; // 当前星期
extern BYTE Month; // 当前月
/*=====================================================*/

/=串口的接口函数=/
#define START 0X7A // 起始位
#define END 0XA7 // 结束位
#define ACK 0X06 // 相应指令
/* 串口数据 /
extern bit busy;
/
串口初始化 /
extern void UartInit(void);
/
串口发字节 /
extern void SendData(BYTE dat);
/
串口发字符串 */
extern void SendString(char s);
/
=====================================================*/

/=EEPROM接口函数=/
//Start address for STC11/10xx EEPROM
#define IAP_ADDRESS 0x0000
/* EEPROM读取 /
extern BYTE IapReadByte(WORD addr);
/
EEPROM写入 /
extern void IapProgramByte(WORD addr, BYTE dat);
/
EEPROM擦除 /
extern void IapEraseSector(WORD addr);
/
=====================================================*/

#endif

STC12C、h
#ifndef _STC12C5A60S2_H
#define _STC12C5A60S2_H

/////////////////////////////////////////////////

//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs
// 7 6 5 4 3 2 1 0 Reset Value
sfr ACC = 0xE0; //Accumulator 0000,0000
sfr B = 0xF0; //B Register 0000,0000
sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000
//-----------------------------------
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
//-----------------------------------
sfr SP = 0x81; //Stack Pointer 0000,0111
sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000
sfr DPH = 0x83; //Data Pointer High Byte 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机系统管理特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000
// 7 6 5 4 3 2 1 0 Reset Value
sfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000
//-----------------------------------
sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000
/*
PCA_P4:
0, 缺省PCA 在P1 口
1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,
PCA0/PWM0 从P1.3 切换到P4.2 口
PCA1/PWM1 从P1.4 切换到P4.3 口
SPI_P4:
0, 缺省SPI 在P1 口
1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口
MISO 从P1.6 切换到P4.2 口
MOSI 从P1.5 切换到P4.1 口
SS 从P1.4 切换到P4.0 口
S2_P4:
0, 缺省UART2 在P1 口
1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口
RxD2 从P1.2 切换到P4.2 口
GF2: 通用标志位

ADRJ:
0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

DPS: 0, 使用缺省数据指针DPTR0
1,使用另一个数据指针DPTR1
/
//-----------------------------------
sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO
/

7 6 5 4 3 2 1 0 Reset Value
PCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000B

b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。
b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。
b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。
b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。
b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。
b2 -
b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率
b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率
/
//-----------------------------------
sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000
//-----------------------------------
sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011
/

ALES1 and ALES0:
00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle
01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.
10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)
11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

RWS2,RWS1,RWS0:
000 : The MOVX read/write pulse is 1 clock cycle.
001 : The MOVX read/write pulse is 2 clock cycles.
010 : The MOVX read/write pulse is 3 clock cycles.
011 : The MOVX read/write pulse is 4 clock cycles. (default)
100 : The MOVX read/write pulse is 5 clock cycles.
101 : The MOVX read/write pulse is 6 clock cycles.
110 : The MOVX read/write pulse is 7 clock cycles.
111 : The MOVX read/write pulse is 8 clock cycles.
*/
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机中断特殊功能寄存器
//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义
//其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南
// 7 6 5 4 3 2 1 0 Reset Value
sfr IE = 0xA8; //中断控制寄存器 EA ELVD EADC ES ET1 EX1 ET0 EX0 0x00,0000
//-----------------------
sbit EA = IE^7;
sbit ELVD = IE^6; //低压监测中断允许位
sbit EADC = IE^5; //ADC 中断允许位
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
//-----------------------
sfr IE2 = 0xAF; //Auxiliary Interrupt - - - - - - ESPI ES2 0000,0000B
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000
//--------
sbit PPCA = IP^7; //PCA 模块中断优先级
sbit PLVD = IP^6; //低压监测中断优先级
sbit PADC = IP^5; //ADC 中断优先级
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000
sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00
sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00
//-----------------------
//新一代 1T 8051系列 单片机I/O 口特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr P0 = 0x80; //8 bitPort0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 1111,1111
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P0M0 = 0x94; // 0000,0000
sfr P0M1 = 0x93; // 0000,0000
sfr P1 = 0x90; //8 bitPort1 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1111,1111
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P1M0 = 0x92; // 0000,0000
sfr P1M1 = 0x91; // 0000,0000
sfr P1ASF = 0x9D; //P1 analog special function
sfr P2 = 0xA0; //8 bitPort2 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 1111,1111
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P2M0 = 0x96; // 0000,0000
sfr P2M1 = 0x95; // 0000,0000
sfr P3 = 0xB0; //8 bitPort3 P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 1111,1111
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
sfr P3M0 = 0xB2; // 0000,0000
sfr P3M1 = 0xB1; // 0000,0000
sfr P4 = 0xC0; //8 bitPort4 P4.7 P4.6 P4.5 P4.4 P4.3 P4.2 P4.1 P4.0 1111,1111
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;
sfr P4M0 = 0xB4; // 0000,0000
sfr P4M1 = 0xB3; // 0000,0000
// 7 6 5 4 3 2 1 0 Reset Value
sfr P4SW = 0xBB; //Port-4 switch - LVD_P4.6 ALE_P4.5 NA_P4.4 - - - - x000,xxxx

sfr P5 = 0xC8; //8 bitPort5 - - - - P5.3 P5.2 P5.1 P5.0 xxxx,1111
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sfr P5M0 = 0xCA; // 0000,0000
sfr P5M1 = 0xC9; // 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机定时器特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr TCON = 0x88; //T0/T1 Control TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000
//-----------------------------------
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
//-----------------------------------
sfr TMOD = 0x89; //T0/T1 Modes GATE1 C/T1 M1_1 M1_0 GATE0 C/T0 M0_1 M0_0 0000,0000
sfr TL0 = 0x8A; //T0 Low Byte 0000,0000
sfr TH0 = 0x8C; //T0 High Byte 0000,0000
sfr TL1 = 0x8B; //T1 Low Byte 0000,0000
sfr TH1 = 0x8D; //T1 High Byte 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机串行口特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr SCON = 0x98; //Serial Control SM0/FE SM1 SM2 REN TB8 RB8 TI RI 0000,0000
//-----------------------------------
sbit SM0 = SCON^7; //SM0/FE
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
//-----------------------------------
sfr SBUF = 0x99; //Serial Data Buffer xxxx,xxxx
sfr SADEN = 0xB9; //Slave Address Mask 0000,0000
sfr SADDR = 0xA9; //Slave Address 0000,0000
//-----------------------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B
sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx
sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器
sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
// 7 6 5 4 3 2 1 0 Reset Value
// WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000
//-----------------------

//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机PCA/PWM 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00
//-----------------------
sbit CF = CCON^7; //PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。
sbit CR = CCON^6; //1:允许 PCA 计数器计数, 必须由软件清0。
//-
//-
sbit CCF1 = CCON^1; //PCA 模块1 中断标志, 由硬件置位, 必须由软件清0。
sbit CCF0 = CCON^0; //PCA 模块0 中断标志, 由硬件置位, 必须由软件清0。
//-----------------------
sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000
/*
CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。

CPS2: PCA 计数器脉冲源选择位 2。
CPS1: PCA 计数器脉冲源选择位 1。
CPS0: PCA 计数器脉冲源选择位 0。
CPS2 CPS1 CPS0
0 0 0 系统时钟频率 fosc/12。
0 0 1 系统时钟频率 fosc/2。
0 1 0 Timer0 溢出。
0 1 1 由 ECI/P3.4 脚输入的外部时钟,最大 fosc/2。
1 0 0 系统时钟频率, Fosc/1
1 0 1 系统时钟频率/4,Fosc/4
1 1 0 系统时钟频率/6,Fosc/6
1 1 1 系统时钟频率/8,Fosc/8

ECF: PCA计数器溢出中断允许位, 1–允许 CF(CCON.7) 产生中断。
*/
//-----------------------
sfr CL = 0xE9; //PCA 计数器低位 0000,0000
sfr CH = 0xF9; //PCA 计数器高位 0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr CCAPM0 = 0xDA; //PCA 模块0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000
sfr CCAPM1 = 0xDB; //PCA 模块1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000

//ECOMn = 1:允许比较功能。
//CAPPn = 1:允许上升沿触发捕捉功能。
//CAPNn = 1:允许下降沿触发捕捉功能。
//MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
//TOGn = 1:当匹配情况发生时, CEXn 将翻转。
//PWMn = 1:将 CEXn 设置为 PWM 输出。
//ECCFn = 1:允许 CCON 中的 CCFn 触发中断。

//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
// 0 0 0 0 0 0 0 0x00 未启用任何功能。
// x 1 0 0 0 0 x 0x21 16位CEXn上升沿触发捕捉功能。
// x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。
// x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。
// 1 0 0 1 0 0 x 0x49 16位软件定时器。
// 1 0 0 1 1 0 x 0x4d 16位高速脉冲输出。
// 1 0 0 0 0 1 0 0x42 8位 PWM。

//ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
// 0 0 0 0 0 0 0 0x00 无此操作
// 1 0 0 0 0 1 0 0x42 普通8位PWM, 无中断
// 1 1 0 0 0 1 1 0x63 PWM输出由低变高可产生中断
// 1 0 1 0 0 1 1 0x53 PWM输出由高变低可产生中断
// 1 1 1 0 0 1 1 0x73 PWM输出由低变高或由高变低都可产生中断

//-----------------------
sfr CCAP0L = 0xEA; //PCA 模块 0 的捕捉/比较寄存器低 8 位。 0000,0000
sfr CCAP0H = 0xFA; //PCA 模块 0 的捕捉/比较寄存器高 8 位。 0000,0000
sfr CCAP1L = 0xEB; //PCA 模块 1 的捕捉/比较寄存器低 8 位。 0000,0000
sfr CCAP1H = 0xFB; //PCA 模块 1 的捕捉/比较寄存器高 8 位。 0000,0000
//-----------------------
// 7 6 5 4 3 2 1 0 Reset Value
sfr PCA_PWM0 = 0xF2; //PCA 模块0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00
sfr PCA_PWM1 = 0xF3; //PCA 模块1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00
//PCA_PWMn: 7 6 5 4 3 2 1 0
// - - - - - - EPCnH EPCnL
//B7-B2: 保留
//B1(EPCnH): 在 PWM 模式下,与 CCAPnH 组成 9 位数。
//B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 ADC 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES = 0xBD; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000
sfr ADC_RESL = 0xBE; //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 SPI 特殊功能寄存器
// 7 6 5 4 3 2 1 0 Reset Value
sfr SPCTL = 0xCE; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100
sfr SPSTAT = 0xCD; //SPI Status Register SPIF WCOL - - - - - - 00xx,xxxx
sfr SPDAT = 0xCF; //SPI Data Register 0000,0000
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机 IAP/ISP 特殊功能寄存器
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
// 7 6 5 4 3 2 1 0 Reset Value
sfr IAP_CMD = 0xC5; //IAP Mode Table 0 - - - - - MS1 MS0 0xxx,xx00
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7; //IAP Control Register IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000
//--------------------------------------------------------------------------------

/////////////////////////////////////////////////

#endif

INTRINS.H
/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright © 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef INTRINS_H
#define INTRINS_H

#pragma SAVE

#if defined (CX2)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

extern void nop (void);
extern bit testbit (bit);
extern unsigned char cror (unsigned char, unsigned char);
extern unsigned int iror (unsigned int, unsigned char);
extern unsigned long lror (unsigned long, unsigned char);
extern unsigned char crol (unsigned char, unsigned char);
extern unsigned int irol (unsigned int, unsigned char);
extern unsigned long lrol (unsigned long, unsigned char);
extern unsigned char chkfloat(float);
#if defined (CX2)
extern int abs (int);
extern void illop (void);
#endif
#if !defined (CX2)
extern void push (unsigned char _sfr);
extern void pop (unsigned char _sfr);
#endif

#pragma RESTORE

#endif

相关标签: 哈哈哈