📄 main.c
字号:
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 + -