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

📄 main.c

📁 S3C2410上RS485驱动源码,用ADS1.2编译工程,已测试通过.内附文档.
💻 C
📖 第 1 页 / 共 2 页
字号:
		CmdAnalyse(GREEN_LIGHT_OPEN);
		WriteCmdFor485(GREEN_LIGHT_OPEN);
	}
}

void OnBtnBlue(void)
{
	if (g_blueLight == TRUE)
	{
		g_blueLight = FALSE;
		CmdAnalyse(BLUE_LIGHT_CLOSE);
		WriteCmdFor485(BLUE_LIGHT_CLOSE);
	}
	else
	{
		g_blueLight = TRUE;
		CmdAnalyse(BLUE_LIGHT_OPEN);
		WriteCmdFor485(BLUE_LIGHT_OPEN);
	}
}

void CmdAnalyse(char Cmd)
{
	char info[20] = {0,};
	
	switch(Cmd)
	{
	case RED_LIGHT_OPEN:
		{
			strcpy(info, "红灯点亮");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2-95, g_yMax/2+20, g_xMax/2-45, g_yMax/2+50, RGB(255,0,0));
		}break;
	case RED_LIGHT_CLOSE:
		{
			strcpy(info, "红灯熄灭");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2-95, g_yMax/2+20, g_xMax/2-45, g_yMax/2+50, RGB(255,255,255));

		}break;
	case GREEN_LIGHT_OPEN:
		{
			strcpy(info, "绿灯点亮");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2-25, g_yMax/2+20, g_xMax/2+25, g_yMax/2+50, RGB(0,255,0));
		}break;
	case GREEN_LIGHT_CLOSE:
		{
			strcpy(info, "绿灯熄灭");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2-25, g_yMax/2+20, g_xMax/2+25, g_yMax/2+50, RGB(255,255,255));
		}break;
	case BLUE_LIGHT_OPEN:
		{
			strcpy(info, "蓝灯点亮");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2+45, g_yMax/2+20, g_xMax/2+95, g_yMax/2+50, RGB(0,0,255));
		}break;
	case BLUE_LIGHT_CLOSE:
		{
			strcpy(info, "蓝灯熄灭");
			
			if (currentWin == WIN_485_S)
				fillrectangle(g_xMax/2+45, g_yMax/2+20, g_xMax/2+95, g_yMax/2+50, RGB(255,255,255));
		}break;
	default:
		{
			if (Cmd <= 30+30)
			{
				Cmd -= 30;
				if (Cmd > g_GuageValue)
					strcpy(info, "数值增加");
				else
					if (Cmd <= 0+30 || Cmd == 30+30)
						strcpy(info, "到达界限");
					else
						strcpy(info, "数值减小");
				
				g_GuageValue = Cmd;
				DrawGuage(Cmd);
			}
			else
				strcpy(info, "无效命令");
		}break;
	}
	
	Rewriteletter((g_xMax-180)/2+5 ,g_yMax/2-70+23,info,1,0,RGB(255,0,0),RGB(255,255,255));
}

void WIN_485(void)
{
	SetBtn(&Btn485[0],(g_xMax-130)/2, g_yMax/2+30, 130,40,"主机",0);
	SetBtn(&Btn485[1],(g_xMax-130)/2, g_yMax/2-30, 130,40,"从机",0);
	
	WIN_WaterTek("485总线实验");
	DrawBtn(Btn485, 2);
	
	memcpy (Btn,Btn485,sizeof(Btn485));
	BtnMax = 2;
}

void SetBtn(BUTTON_SUB *Btn, U16 x, U16 y, U16 w, U16 h, char *title, U16 s)
{
	Btn->X = x;
	Btn->Y = y;
	Btn->W = w;
	Btn->H = h;
	Btn->status = s;
	memcpy(Btn->title, title, strlen(title));
}

void DrawBtn(BUTTON_SUB bBtn[30], int num)
{
	int i,xText,yText,textSize;
	int BtnColor = RGB(0,0,255);
	
	for(i = 0; i < num; i++)
	{
		if (bBtn[i].mode == 2)
			BtnColor = bBtn[i].color;
		else
			BtnColor =  RGB(0,0,255);;
		
		fillrectangle(bBtn[i].X,
					  bBtn[i].Y,
					  bBtn[i].X + bBtn[i].W,
					  bBtn[i].Y + bBtn[i].H,
					  BtnColor
					 );
		textSize = strlen(bBtn[i].title) * 8;						// 计算名称长度
		xText = ((bBtn[i].W - textSize) / 2) + bBtn[i].X;			// 计算名称 X 坐标
		yText = ((bBtn[i].H - 16) / 2) + 16 + bBtn[i].Y;			// 计算名称 Y 坐标
		drawletter(xText,yText,bBtn[i].title,1,0,RGB(255,255,0));		// 打印名称
	
		line(bBtn[i].X, bBtn[i].Y + bBtn[i].H, bBtn[i].X + bBtn[i].W, bBtn[i].Y + bBtn[i].H, 0xFFFF);
		line(bBtn[i].X, bBtn[i].Y, bBtn[i].X, bBtn[i].Y + bBtn[i].H, 0xFFFF);
		line(bBtn[i].X, bBtn[i].Y, bBtn[i].X + bBtn[i].W, bBtn[i].Y, 0x0);
		line(bBtn[i].X + bBtn[i].W, bBtn[i].Y, bBtn[i].X + bBtn[i].W, bBtn[i].Y + bBtn[i].H, 0x0);
	}
}

void DrawGuage(int value)
{
	char info[20] = {0,};
	
	int x = (g_xMax-152)/2;
	int y = g_yMax/2-10;
	int len = 152;
	int Max = 30;
	int Min = 0;
	
	if (value < Min)
		value = Min;
	if (value > Max)
		value = Max;
	
	DrawFrame(x, y, x+len, y+4, 1, RGB(200,200,200));
	fillrectangle(x+1, y+1, x+151, y+3, RGB(255,255,255));
	fillrectangle(x+1, y+1, x+1+value*5, y+3, RGB(0,255,64));
	line(x+2, y+2, x+value*5, y+2, RGB(0,190,50));
	
	sprintf(info, "%2d", g_GuageValue);
	Rewriteletter((g_xMax)/2-8 ,g_yMax/2+15,info,1,0,RGB(255,255,0),RGB(130,130,240));
}

void WIN_Master(void)
{
	SetBtn(&BtnSub485[0],(g_xMax-152)/2-21, g_yMax/2-18, 20,20,"-",0);
	SetBtn(&BtnSub485[1],(g_xMax-152)/2+153, g_yMax/2-18, 20,20,"+",0);
	
	SetBtn(&BtnSub485[2],g_xMax/2-95, g_yMax/2+20, 50,30," ",0);
	BtnSub485[2].color = RGB(255,0,0);
	BtnSub485[2].mode =2;
	SetBtn(&BtnSub485[3],g_xMax/2-25, g_yMax/2+20, 50,30," ",0);
	BtnSub485[3].color = RGB(0,255,0);
	BtnSub485[3].mode =2;
	SetBtn(&BtnSub485[4],g_xMax/2+45, g_yMax/2+20, 50,30," ",0);
	BtnSub485[4].color = RGB(0,0,255);
	BtnSub485[4].mode =2;
	
	WIN_WaterTek("485总线实验 - Master");
	DrawBtn(BtnSub485, 5);

	drawletter((g_xMax-64)/2 ,g_yMax-40,"主机窗口",1,0,RGB(255,255,0));
	
	fillrectangle((g_xMax-180)/2, g_yMax/2-70, (g_xMax-180)/2+180, g_yMax/2-40, RGB(255,255,255));
	DrawFrame((g_xMax-180)/2-2, g_yMax/2-72, (g_xMax-180)/2+182, g_yMax/2-38, 2, RGB(110,120,130));
	
	memcpy(Btn,BtnSub485,sizeof(BtnSub485));
	BtnMax = 5;
	
	DrawGuage(0);
	Rewriteletter((g_xMax)/2 ,g_yMax/2+15,"0",1,0,RGB(255,255,0),RGB(130,130,240));
}

void WIN_Slave(void)
{
	SetBtn(&BtnSub485[0],(g_xMax-152)/2-21, g_yMax/2-18, 20,20,"-",0);
	SetBtn(&BtnSub485[1],(g_xMax-152)/2+153, g_yMax/2-18, 20,20,"+",0);
	

	WIN_WaterTek("485总线实验 - Slave");
	DrawBtn(BtnSub485, 2);

	drawletter((g_xMax-64)/2 ,g_yMax-40,"从机窗口",1,0,RGB(255,255,0));
	
	fillrectangle((g_xMax-180)/2, g_yMax/2-70, (g_xMax-180)/2+180, g_yMax/2-40, RGB(255,255,255));
	DrawFrame((g_xMax-180)/2-2, g_yMax/2-72, (g_xMax-180)/2+182, g_yMax/2-38, 2, RGB(110,120,130));
	
	fillrectangle(g_xMax/2-95, g_yMax/2+20, g_xMax/2-45, g_yMax/2+50, RGB(255,255,255));
	DrawFrame(g_xMax/2-97, g_yMax/2+18, g_xMax/2-43, g_yMax/2+52, 2, RGB(110,120,130));
	
	fillrectangle(g_xMax/2-25, g_yMax/2+20, g_xMax/2+25, g_yMax/2+50, RGB(255,255,255));
	DrawFrame(g_xMax/2-27, g_yMax/2+18, g_xMax/2+27, g_yMax/2+52, 2, RGB(110,120,130));
	
	fillrectangle(g_xMax/2+45, g_yMax/2+20, g_xMax/2+95, g_yMax/2+50, RGB(255,255,255));
	DrawFrame(g_xMax/2+43, g_yMax/2+18, g_xMax/2+97, g_yMax/2+52, 2, RGB(110,120,130));
	
	
	memcpy (Btn,BtnSub485,sizeof(BtnSub485));
	BtnMax = 2;
	
	DrawGuage(0);
	Rewriteletter((g_xMax)/2 ,g_yMax/2+15,"0",1,0,RGB(255,255,0),RGB(130,130,240));
}


/*!	\mainpage	基于RS485标准的串口实验
	\author		 丁雷
	\version 1.0
	\date    2006-9-14
	\section ABSTRACT 概要
    \n  在两台嵌入式实验设备之间实现主、从站工作模式。主站和从站之间可以信息数据的互相传感;主站对从站的远程控制;从站实验设备状态的改变可以及时的反映到主站的相关设备上。	
    \section HARDWARE 硬件
	\n    	Super-ARM嵌入式教学实验系统、 	RS485扩展卡
	\section SOFTERWARE 软件
	\n   DEMO演示平台
*/
	
/*!	\defgroup rs485softconstruction   基于RS485标准的串口实验的软件模块结构图
	\image html images\rs485softconstruction.gif

*/
/*!	\defgroup uartstruct 串口结构体介绍
\n   typedef struct   SD_INIT_STRUCT
\n   {
\n       UINT32        			data_mode;			//数据模式
\n       UINT32        			base_address;			//偏移地址基址
\n       NU_SEMAPHORE   *sd_semaphore;			//信号量定义
\n       UINT32          	com_port;				//端口号:0 or 1
\n       UINT32          	data_bits;					//数据位长:6,7 or 8.
\n       UINT32          	stop_bits;					//停止位:1/帧,2/帧
\n       UINT32          	parity;					//奇偶校验位:奇,偶,无,1,0
\n       UINT32          	baud_rate;				//波特率
\n       UINT32          	vector;					//向量表中中断位置
\n       UINT32          	driver_options;			
\n       UINT32          	sd_buffer_size;			//缓冲区大小	 
\n       UINT32          	parity_errors;				//校验错误变量
\n       UINT32          	frame_errors;				//帧错误变量
\n       UINT32          	overrun_errors;			//数据覆盖错误变量
\n       UINT32          	busy_errors;				//系统忙错误变量
\n       UINT32          	general_errors;			//普通错误变量	
\n       CHAR            	*rx_buffer;				//数据接收缓冲区指针
\n       INT             	rx_buffer_read;			//数据接收缓冲区读指针
\n       INT             	rx_buffer_write;			//数据接收缓冲区写指针
\n       volatile INT    		rx_buffer_status;			//数据接收缓冲区状态	
\n       UINT32          	communication_mode;		//通讯模式
\n       CHAR            	*tx_buffer;				//数据发送缓冲区指针
\n       INT             	tx_buffer_read;			//数据发送缓冲区读指针
\n       INT             	tx_buffer_write;			//数据发送缓冲区写指针
\n       volatile INT    		tx_buffer_status;			//数据发送缓冲区状态
\n   } SD_PORT;
\n   描述:在这个结构体里定义了所有可能要用到的变量,在动态加载中只用到了部分变量。定义了这个结构体,串口的初始主要的工作就是给这个结构体中变量赋值,然后根据里面部分变量值再来初始化CPU相关的一些寄存器(串口控制寄存器),以下变量就是初始化CPU相关的:
\n   com_port			确定要初始化的端口号;
\n   data_bits			数据位长:5-8bit
\n   stop_bits			停止位:1/帧,2/帧
\n   parity			奇偶校验位:奇,偶,无,1,0
\n   vector;			中断向量表中位置(CPU决定)
\n   变量com_port用来确定要初始化的端口号(0,1)从而确定其偏移地址基址,后续CPU寄存器的初始化需要这个基址,变量data_bits用来确定接受/发送每一帧的字长,变量stop_bits用来确定接受/发送每一帧的停止位1/帧,2/帧。变量parity用来确定接受/发送每一帧的奇偶校验位:奇,偶,无,1或0;变量vector用来指明发送中断/接收中断向量表中位置(CPU决定),主要是为了中断服务程序注册ISR用的。
*/
/*!	\defgroup rs485init  基于RS485标准的串口初始化模块
	\n	串口初始化函数:STATUS SDC_Init_Port(SD_PORT  * uart) 
	\n	输入:RS485所使用的串口的结构体指针。(本实验使用了串口1)
	\n	输出:串口初始化成功与否的状态。
	\n	功能:完成串口的初始化工作。主要包括指针uart所指向的结构体中每个成员变量的初始化,变量值的检查;根据要求设置ULCON,UCON,UFCON,UMCON等寄存器,以此设置波特率,校验类型,数据位,停止位,接收/发送数据的模式,触发中断的类型,使能串口中断。
*/
/*!	\defgroup rs485send 基于RS485标准的串口数据发送模块
	\n	串口数据发送函数:void SDC_Put_Char(UINT8 ch, SD_PORT *uart)
	\n	输入:ch--要发送的数据;uart--指向要用于发送数据的基于RS485标准的串口
	\n	程序流程图如下所示:
	\image html images\rs485send.gif
*/
/*!	\defgroup rs485interrupt 基于RS485标准的串口中断服务程序模块
	\n	RS485串口中断服务程序:void __irq RS4_LISR1(void)
    \n  功能:当有数据传到RX的FIFO中,产生中断,RX中断服务程序部分的作用就是在CPU响应此中断后将FIFO中的数据读出并写到RX的缓冲区中,同时还要检查每一帧是否有错误,将读取到的正确的数据保存下来。
	\n	程序流程图如下所示:
	\image html images\rs485interrupt.gif
*/
/*! \defgroup picture 基于RS485标准的串口演示实验图片
	\image html images\rs485main.gif
	\image html images\rs485master.gif
	\image html images\rs485slave.gif
*/

⌨️ 快捷键说明

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