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

📄 hldkzqts.c

📁 LED照明行业地砖及护栏控制器程序 从现况来看
💻 C
字号:
/*############################################################################
鼎立照明	16级灰度护栏灯控制器程序						
创建时间:2004-07-01
硬件资源:
		RAM ADDRESS :0000H---7FFFH
		FLASH	ADDRESS:8000H---8FFFH
		CPLD	ADDRESS:9000H---FFFFH
		RAM	SIZE	:32K	FLASH SIZE:8MBYTE = 4K*512PAGE*4PCS
2004-07-09	:测试程序
*/
#include <reg52.h>
#include <intrins.h>
//#include <ctype.h>//字符函数
#include <string.h>//字符串函数
#include <stdio.h>//一般I/O函数
#include <stdlib.h>//标准函数
//#include <math.h>//数学函数
#include <absacc.h>//绝对地址
#include <intrins.h>//内部函数	
#include	<setjmp.h>
#define uchar unsigned char
#define uint unsigned int
#define byte unsigned char
#define word unsigned  
#define bool bit
#define TRUE 1
#define FALSE 0
/*
code uchar demo_tab[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0xF8,0x3E,0xF8,0xFC,0xFC,0x3C,0xE7,0x7C,0x3E,0xEE,0xE0,0xEE,0xC7,0x38,0xFC,0x38,0xFC,0x3E,0xE7,0xE7,0xD6,0xE7,0xEE,
0x10,0x44,0x42,0x44,0x42,0x42,0x44,0x42,0x10,0x08,0x44,0x40,0x6C,0x62,0x44,0x42,0x44,0x42,0x42,0x42,0x42,0x92,0x42,0x44,
0x18,0x44,0x42,0x42,0x48,0x48,0x44,0x42,0x10,0x08,0x48,0x40,0x6C,0x62,0x82,0x42,0x82,0x42,0x42,0x42,0x42,0x92,0x24,0x44,
0x28,0x44,0x80,0x42,0x48,0x48,0x80,0x42,0x10,0x08,0x50,0x40,0x6C,0x52,0x82,0x42,0x82,0x42,0x40,0x42,0x44,0x92,0x24,0x28,
0x28,0x78,0x80,0x42,0x78,0x78,0x80,0x42,0x10,0x08,0x70,0x40,0x6C,0x52,0x82,0x42,0x82,0x7C,0x20,0x42,0x24,0x92,0x18,0x28,
0x24,0x44,0x80,0x42,0x48,0x48,0x80,0x7E,0x10,0x08,0x50,0x40,0x54,0x4A,0x82,0x7C,0x82,0x48,0x18,0x42,0x24,0xAA,0x18,0x10,
0x3C,0x42,0x80,0x42,0x48,0x48,0x8E,0x42,0x10,0x08,0x48,0x40,0x54,0x4A,0x82,0x40,0x82,0x48,0x04,0x42,0x28,0xAA,0x18,0x10,
0x44,0x42,0x80,0x42,0x40,0x40,0x84,0x42,0x10,0x08,0x48,0x40,0x54,0x4A,0x82,0x40,0xB2,0x44,0x02,0x42,0x28,0x6C,0x24,0x10,
0x42,0x42,0x42,0x42,0x42,0x40,0x44,0x42,0x10,0x08,0x44,0x40,0x54,0x46,0x82,0x40,0xCA,0x44,0x42,0x42,0x18,0x44,0x24,0x10,
0x42,0x44,0x44,0x44,0x42,0x40,0x44,0x42,0x10,0x08,0x44,0x42,0x54,0x46,0x44,0x40,0x4C,0x42,0x42,0x42,0x10,0x44,0x42,0x10,
0xE7,0xF8,0x38,0xF8,0xFC,0xE0,0x38,0xE7,0x7C,0x08,0xEE,0xFE,0xD6,0xE2,0x38,0xE0,0x38,0xE3,0x7C,0x3C,0x10,0x44,0xE7,0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};*/
/* 定义定时器T0的时间常数值和方式控制字 */                
#define V_TH0   0x4c                     /* 时间常数高8位 */
#define V_TL0   0x00                     /* 时间常数低8位50ms  12mhz */
#define V_TMOD  0x01                     /* 定时器T0方式控制字 */

#define  REGL XBYTE[0x9003] //控制寄存器护栏管的长度
#define  FPGH XBYTE[0x9001] //闪存页高位
#define  FPGL XBYTE[0x9002] //闪存页低位
//**********************************************
sbit	senden=P1^5;

//*************************************************
uchar 	setx,sety;				//显示屏的尺寸设置
uchar	ADD;					//地址
uchar 	idata send_buf[72];		//接收缓冲区
uchar 	pointer,subchk;			//接收指针 和校验
uchar 	paklen;					//包长
jmp_buf env;
int retval;
uint	dis_page;			//当前显示的帧号
sbit	led=P1^7;
uchar	bdata flag;
sbit 	frameok=flag^0;		 	//rece ok
sbit	color=flag^1;			//0 sing red color 1 red green color
sbit	rec_sta=flag^2;			//1 进入接状态,不显示
sbit	rec_end=flag^3;
uint page;
//************************************** 
//清除显存内容立即引出  0000h--03FFH = 0
//**************************************
void cler(void)
{
uint i;
uchar xdata *s;
s=0x000;
for(i=0;i<1024;i++)*s++=0;
}
//******************************************* 
//从FLASH加载数据到RAM, flash -> ram 000
//入口参数:帧号 取值范围:0--8095
//******************************************
void load_data(uint page)
{
uint i;
uchar xdata *s;
uchar xdata *sp;
sp=(page<<10                                                                                                                                                                                                                                                                                                                                                                                             )|0x8000;
FPGH=(page>>2)/256;FPGL=(page>>2)%256;
s=0x000;
for(i=0;i<4096;i++)*s++=*sp++;

}
/*************************************************

************************************************/
void delayms( uchar ticks )
{
	uint	Count;
	uchar	Tick;
	for (Tick=ticks;Tick>0;Tick--)
	{
		for (Count=0;Count<=2000;Count++);
	}
}
/************************************************************************/
/* PROCEDURE:   Erase_One_Sector                                        */
/*                                                                      */
/* This procedure can be used to erase a total of 4096 bytes.           */
/*                                                                      */
/* Input:                                                               */
/*      Dst     DESTINATION address where the erase operation starts    */
/*                                                                      */
/* Output:                                                              */
/*      NONE                                                            */
/************************************************************************/

void Erase_One_Sector (uint  Sec)
{
    uchar xdata *Temp;
	Temp=0x0000;
	FPGH=(Sec/256)&0x06;FPGL=5;
	XBYTE[0x8555]=0Xaa;
	FPGL=2;
	XBYTE[0x8aaa]=0x55;
	FPGL=5;
	XBYTE[0x8555]=0X80;
	FPGL=5;
	XBYTE[0x8555]=0Xaa;
	FPGL=2;
	XBYTE[0x8aaa]=0X55;
	FPGH=Sec/256;FPGL=Sec%256;
	*Temp=0x30;
    delayms(25);       /* Delay time = Tse                 */
}

/************************************************************************/
/* PROCEDURE:    Check_Toggle_Ready                                     */
/*                                                                      */
/* During the internal program cycle, any consecutive read operation    */
/* on DQ6 will produce alternating 0's and 1's (i.e. toggling between   */
/* 0 and 1). When the program cycle is completed, DQ6 of the data will  */
/* stop toggling. After the DQ6 data bit stops toggling, the device is  */
/* ready for next operation.                                            */
/*                                                                      */
/* Input:                                                               */
/*           Dst        Must already be set-up by the caller            */
/*                                                                      */
/* Output:                                                              */
/*           None                                                       */
/************************************************************************/

void Check_Toggle_Ready (uchar xdata  *Dst)
{
        uchar Loop = TRUE;
        uchar  PreData;
        uchar  CurrData;
        unsigned int TimeOut = 0;

        PreData = *Dst;
        PreData = PreData & 0x40;
        while ((TimeOut< 0xFFFF) && (Loop))
        {
            CurrData = *Dst;
            CurrData = CurrData & 0x40;
            if (PreData == CurrData)
                    Loop = FALSE;   /* ready to exit the while loop */
            PreData = CurrData;
            TimeOut++;
        }
}
/************************************************************************/
/* PROCEDURE:   Program_One_Byte                                        */
/*                                                                      */
/* This procedure can be used to program ONE byte of data to the        */
/* 39VF016.                                                             */
/*                                                                      */
/* NOTE:  It is necessary to first erase the sector containing the      */
/*        byte to be programmed.                                	*/
/*                                                                      */
/* Input:                                                               */
/*           Src     The BYTE which will be written to the 39VF016      */
/*           Dst     DESTINATION address which will be written with the */
/*                   data passed in from Src                            */
/*                                                                      */
/* Output:                                                              */
/*           None                                                       */
/************************************************************************/

void Program_One_Byte (uchar Src, uchar xdata *Dst)
{
//	uchar xdata *Temp;
    uchar xdata *DestBuf;
    DestBuf = Dst;
	FPGH=(page/256)&0x06;FPGL=5;
	XBYTE[0x8555]=0Xaa;
	FPGL=2;
	XBYTE[0x8aaa]=0x55;
	FPGL=5;
	XBYTE[0x8555]=0Xa0;
	FPGH=page/256;FPGL=page%256;
	*DestBuf=Src;
    Check_Toggle_Ready(DestBuf);    /* wait for TOGGLE bit to get ready */
}


/************************************************************************/
/* PROCEDURE:   Program_One_Sector                                      */
/*                                                                      */
/* This procedure can be used to program a total of 4096 bytes of data  */
/* to the SST39VF016.                                                   */
/*                                                                      */
/* NOTES: 1. It is necessary to first erase the sector before the	*/
/*        programming.                                			*/
/*        2. This sample code assumes the destination address passed	*/
/*        from the calling function is the starting address of the	*/
/*        sector.							*/
/*                                                                      */
/* Input:                                                               */
/*           Src     SOURCE address containing the data which will be   */
/*                   written to the 39VF016                             */
/*           Dst     DESTINATION address which will be written with the */
/*                   data passed in from Src                            */
/*                                                                      */
/* Output:                                                              */
/*           None                                                       */
/************************************************************************/

void Program_One_Sector (uint Dst)
{
        uchar xdata *SourceBuf;
        uchar xdata *DestBuf;

        uint Index;
		page=Dst;
        SourceBuf = 0x1000;
        DestBuf = 0x8000;

        Erase_One_Sector(Dst);          /* erase the sector first */

        for (Index = 0; Index < 4096; Index++)
	        {
			Program_One_Byte( *SourceBuf, DestBuf);
			DestBuf++;
			SourceBuf++;
        	}
}

//***********************************************
//			接收数据
//************************************************
void rece_picture(void)
{
uchar i;
uchar xdata *op;
uchar idata *sp;	//0x1000 test 0x1000
FPGH=send_buf[4];
FPGL=send_buf[3];
op=(send_buf[5]*64)|0x1000;
sp=&send_buf[8];
for(i=0;i<64;i++)*op++=*sp++;	//写入RAM 1000H 单元 位图数据
}

/*
************************************
	通讯协议解析			接收数据
*******************************************8
*/
void receive(void)
{

switch(send_buf[2])//命令标志
	{
	case 1:rec_sta=1;//进入接收状态
		break;	
	case 2:			//接收数据
		rece_picture();
		break;	
	case 0:			//加载某一帧数据到显存
		dis_page=send_buf[4]*256+send_buf[3];
		load_data(dis_page);
		break;	
	case	3:		//将一扇区数据写闪存
		Program_One_Sector(send_buf[4]*256+send_buf[3]);
		break;
	default:break;
	}
}
//********************************************
void	delay1s()
{
uint i,j;
for(i=0;i<0xfff;i++)
	for(j=0;j<0x11;j++);
led=!led;
}
//***********************************************
void test()
{
uchar xdata *rp;
uchar xdata *p;
uchar xdata *sp;
uchar j;
uint i;
p=0x0000;
memset(p,0x00,1024);
delay1s();//1	

FPGH=4;FPGL=0;
p=0x0000;
sp=0x8000;
rp=memcpy(p,sp,255);
delay1s();//1	
p=0x0100;
sp=0x8100;
rp=memcpy(p,sp,255);
delay1s();//1
p=0x0200;
sp=0x8200;
rp=memcpy(p,sp,255);
delay1s();//1
p=0x0300;
sp=0x8300;
rp=memcpy(p,sp,255);
delay1s();//1XS


p=0x0000;
memset(p,0x00,1024);
delay1s();//1	
p=0x0000;
memset(p,255,255);
delay1s();  //4

p=0x0100;
memset(p,255,255);
delay1s();  //4

p=0x0200;
memset(p,255,255);
delay1s();//8

p=0x0300;
memset(p,255,255);
delay1s();//15

}

//********************************************
//					 主程序
//********************************************
void main()
{
uchar xdata *p;
PS=1;
ES=0;
SM0=1;
SM1=1;
T2CON=0X30;
RCAP2H=0XFF;
TH2=0XFF;
RCAP2L=0Xf6;	//9600bps c4  115200bps fb 57600 f6 
TL2=0Xf6;
TR2=1;
EA=1;
REN=1;
ES=1;
SM2=1;
ADD=(~P1)&0x1f;
frameok=0;
cler();

p=0x1000;
memset(p,0x01,4096);
Program_One_Sector(1024);

while(1)
	{test();
	}
while(1)
	{
	if(frameok)
		{receive();frameok=0;}
	}//while(1)
}
//*****************************************
//			串口中断服务程序
//*****************************************
void send(void) interrupt  4 
{
uchar d;
if(!TI && RI && !frameok)
 {RI=0;
  d=SBUF;
	if(pointer==0)
    	{if(d==ADD)
			{subchk=d;send_buf[0]=d;TB8=1;senden=1;
			delayms(1);SBUF=d;while(!TI);TI=0;delayms(1);
			senden=0;SM2=0;TB8=0;pointer++;paklen=68;}//71
		else if(d==0xff)
			{subchk=d;SM2=0;TB8=0;pointer++;paklen=5;}
			
     	}
  else 
		{if(pointer==paklen)
       	{send_buf[pointer]=d;
			if(d==subchk)
				{senden=1;delayms(1);SBUF=subchk;while(!TI);delayms(1);senden=0;TI=0;frameok=1;}
			else
				{senden=1;delayms(1);SBUF=~subchk;while(!TI);delayms(1);TI=0;senden=0;}
			SM2=1;pointer=0;
			}
     	else
          {send_buf[pointer]=d;subchk+=d;pointer++;}
		}        
  }//end if
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -