#include "UART_Set.h" #include "UART.h" #include "pwm_control.h" #include "string.h" #include "config.h" #include "timer.h" #include "STC8xxxx.h" #include "PWM15bit.h" G_Usart g_Usart; G_answer g_answer; S_recv s_recv; u8 debug = 0x00; /* 判断接收的指令是否合法 */ void Usart_judge_Data(void) { u8 len = 0; u8 i, sum; sum = 0; g_Usart.ok_flag = 0; if((recv_start_flag==1)&&(systick_1ms-recv_time>8)) { recv_start_flag=0; #if DEBUG_ { for(i=0;i s_recv.B_max) { s_recv.B_Ch[i] = s_recv.B_max; } s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_Ch[i] * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i]; s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i]; //更新调光起始点 s_recv.gradual_time[i] = g_Usart.recv_buffer[9] * 10; /*接收的渐变时间*/ /* 除数不能为零 */ if (s_recv.gradual_time[i] == 0) { s_recv.gradual_time[i] = 1; } /*计算10ms处理的pwm步进值*/ if (s_pwm.wanttopwm[i] > s_pwm.currpwm[i]) { s_pwm.every_change_10ms[i] = (float)(s_pwm.wanttopwm[i] - s_pwm.currpwm[i]) / s_recv.gradual_time[i]; if (s_pwm.every_change_10ms[i] < 1) { s_pwm.every_change_10ms[i] = 1; } } if (s_pwm.wanttopwm[i] < s_pwm.currpwm[i]) { s_pwm.every_change_10ms[i] = (float)(s_pwm.currpwm[i] - s_pwm.wanttopwm[i]) / s_recv.gradual_time[i]; if (s_pwm.every_change_10ms[i] < 1) { s_pwm.every_change_10ms[i] = 1; } } } } //第二个使能位 for (i = 0; i < 4; i++) { if (g_Usart.recv_buffer[8] & (1 << i)) { s_recv.flag1[i+8] = 1; s_recv.flag2[i+8] = 0; s_recv.B_Ch[i+8] = g_Usart.recv_buffer[13 - i]; if (s_recv.B_Ch[i+8] < s_recv.B_min) { s_recv.B_Ch[i+8] = s_recv.B_min; } if (s_recv.B_Ch[i+8] > s_recv.B_max) { s_recv.B_Ch[i+8] = s_recv.B_max; } s_pwm.wanttopwm[i+8] = PWM_MAX_VALUE - s_recv.B_Ch[i+8] * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i+8]; s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i]; //更新调光起始点 s_recv.gradual_time[i+8] = g_Usart.recv_buffer[9] * 10; /*接收的渐变时间*/ /* 除数不能为零 */ if (s_recv.gradual_time[i+8] == 0) { s_recv.gradual_time[i+8] = 1; } /*计算10ms处理的pwm步进值*/ if (s_pwm.wanttopwm[i+8] > s_pwm.currpwm[i+8]) { s_pwm.every_change_10ms[i+8] = (float)(s_pwm.wanttopwm[i+8] - s_pwm.currpwm[i+8]) / s_recv.gradual_time[i+8]; if (s_pwm.every_change_10ms[i+8] < 1) { s_pwm.every_change_10ms[i+8] = 1; } } if (s_pwm.wanttopwm[i+8] < s_pwm.currpwm[i+8]) { s_pwm.every_change_10ms[i+8] = (float)(s_pwm.currpwm[i+8] - s_pwm.wanttopwm[i+8]) / s_recv.gradual_time[i+8]; if (s_pwm.every_change_10ms[i+8] < 1) { s_pwm.every_change_10ms[i+8] = 1; } } } } g_answer.short_answer_flag=0x01; break; //设置模式:递增、递减和循环 case USART_CMD_SET_MODE: g_answer.short_answer[UART_FMT_CMD]=USART_CMD_SET_MODE_A; if(debug) { PrintString1("change light"); } for (i = 0; i < 8; i++) { if (g_Usart.recv_buffer[7] & (1 << i)) { s_recv.flag1[i] = 0; s_recv.flag2[i] = 1; s_recv.mode[i] = g_Usart.recv_buffer[9]; s_recv.pwm_step[i] = g_Usart.recv_buffer[11]; if (s_recv.mode[i] == 0x00) { if (g_Usart.recv_buffer[10] == 0x00) { s_recv.forward[i] = 0; } if (g_Usart.recv_buffer[10] == 0x01) { s_recv.forward[i] = 1; } if (g_Usart.recv_buffer[10] == 0x02) //翻转 { if (s_recv.forward[i] == 0x01) { s_recv.forward[i] = 0x00; continue; // 为防止翻转之后直接进入下一个状态 } if (s_recv.forward[i] == 0x00) { s_recv.forward[i] = 0x01; continue; } } } } } for (i = 0; i < 4; i++) { if (g_Usart.recv_buffer[8] & (1 << i)) { s_recv.flag1[i+8] = 0; s_recv.flag2[i+8] = 1; s_recv.mode[i+8] = g_Usart.recv_buffer[9]; s_recv.pwm_step[i+8] = g_Usart.recv_buffer[11]; if (s_recv.mode[i+8] == 0x00) { if (g_Usart.recv_buffer[10] == 0x00) { s_recv.forward[i+8] = 0; } if (g_Usart.recv_buffer[10] == 0x01) { s_recv.forward[i+8] = 1; } if (g_Usart.recv_buffer[10] == 0x02) //翻转 { if (s_recv.forward[i+8] == 0x01) { s_recv.forward[i+8] = 0x00; continue; // 为防止翻转之后直接进入下一个状态 } if (s_recv.forward[i+8] == 0x00) { s_recv.forward[i+8] = 0x01; continue; } } } } } g_answer.short_answer_flag=0x01; break; //设置整体亮度 case USART_CMD_ALL_BRIGHTNESS: g_answer.short_answer[UART_FMT_CMD]=USART_CMD_ALL_BRIGHTNESS_A; if(debug) { PrintString1("global light"); } // s_recv.changeflag = 1; if (g_Usart.recv_buffer[7] & (1 << 5)) //全局可调下限 { s_recv.B_min = g_Usart.recv_buffer[10]; for (i = 0; i < 12; i++) { if ( s_pwm.currvalue[i] < s_recv.B_min) { s_pwm.currvalue[i] = s_recv.B_min; } } } if (g_Usart.recv_buffer[7] & (1 << 6)) //全局可调上限 { s_recv.B_max = g_Usart.recv_buffer[9]; for (i = 0; i < 12; i++) { if ( s_pwm.currvalue[i] > s_recv.B_max) { s_pwm.currvalue[i] = s_recv.B_max; } } } if (g_Usart.recv_buffer[7] & (1 << 7)) //全局亮度 { s_recv.global_brightness = g_Usart.recv_buffer[8]; for (i = 0; i < 12; i++) { // s_pwm.wanttopwmflash[i] = PWM_MAX_VALUE - s_pwm.currvalue[i] * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i]; s_recv.flag1[i] = 1; s_recv.flag2[i] = 0; s_pwm.wanttopwm[i] = PWM_MAX_VALUE - s_recv.B_Ch[i] * PWM_MAX_VALUE * s_recv.global_brightness / 100 / 100 * s_recv.key_status[i]; s_pwm.doublecurrpwm[i] = s_pwm.currpwm[i]; //更新调光起始点 if(s_pwm.wanttopwm[i] > PWM_MAX_VALUE) { s_pwm.wanttopwm[i] = PWM_MAX_VALUE; } /*计算10ms处理的pwm步进值*/ if (s_pwm.wanttopwm[i] > s_pwm.currpwm[i]) { s_pwm.every_change_10ms[i] = (float)(s_pwm.wanttopwm[i] - s_pwm.currpwm[i]) / s_recv.gradual_time[i]; if (s_pwm.every_change_10ms[i] < 1) { s_pwm.every_change_10ms[i] = 1; } } if (s_pwm.wanttopwm[i] < s_pwm.currpwm[i]) { s_pwm.every_change_10ms[i] = (float)(s_pwm.currpwm[i] - s_pwm.wanttopwm[i]) / s_recv.gradual_time[i]; if (s_pwm.every_change_10ms[i] < 1) { s_pwm.every_change_10ms[i] = 1; } } } } g_answer.short_answer_flag=0x01; break; //设置开关状态 case USART_CMD_SWITCH_STATUS: g_answer.short_answer[UART_FMT_CMD]=USART_CMD_SWITCH_STATUS_A; if(debug) { PrintString1("switch state"); } for (i = 0; i < 8; i++) { if (g_Usart.recv_buffer[7] & (1 << i)) { if (g_Usart.recv_buffer[9 + i] == 0x01) { s_recv.key_status[i] = 0x01; //s_pwm.currvalue[i] = s_pwm.thenvalue[i]; Open_Light(i); } if (g_Usart.recv_buffer[9 + i] == 0x00) { //s_pwm.thenvalue[i] = s_pwm.currvalue[i]; Close_Light(i); s_recv.flag1[i] = 0; s_recv.flag2[i] = 0; s_recv.mode[i] = 2; s_recv.key_status[i] = 0x00; } if (g_Usart.recv_buffer[9 + i] == 0x02) { if (s_recv.key_status[i] == 0x00) { s_recv.key_status[i] = 0x01; //s_pwm.currvalue[i] = s_pwm.thenvalue[i]; Open_Light(i); continue; } if (s_recv.key_status[i] == 0x01) { //s_pwm.thenvalue[i] = s_pwm.currvalue[i]; Close_Light(i); s_recv.flag1[i] = 0; s_recv.flag2[i] = 0; s_recv.mode[i] = 2; s_recv.key_status[i] = 0x00; continue; } } } } for (i = 0; i < 4; i++) { if (g_Usart.recv_buffer[8] & (1 << i)) { if (g_Usart.recv_buffer[9 + 8 + i] == 0x01) { s_recv.key_status[i+8] = 0x01; //s_pwm.currvalue[i+8] = s_pwm.thenvalue[i]; Open_Light(i+8); } if (g_Usart.recv_buffer[9 +8 + i] == 0x00) { //s_pwm.thenvalue[i+8] = s_pwm.currvalue[i+8]; Close_Light(i+8); s_recv.flag1[i+8] = 0; s_recv.flag2[i+8] = 0; s_recv.mode[i+8] = 2; s_recv.key_status[i+8] = 0x00; } if (g_Usart.recv_buffer[9 + 8 + i] == 0x02) { if (s_recv.key_status[i+8] == 0x00) { s_recv.key_status[i+8] = 0x01; //s_pwm.currvalue[i+8] = s_pwm.thenvalue[i]; Open_Light(i+8); continue; } if (s_recv.key_status[i+8] == 0x01) { //s_pwm.thenvalue[i+8] = s_pwm.currvalue[i+8]; Close_Light(i+8); s_recv.flag1[i+8] = 0; s_recv.flag2[i+8] = 0; s_recv.mode[i+8] = 2; s_recv.key_status[i+8] = 0x00; continue; } } } } g_answer.short_answer_flag=0x01; break; case USART_CMD_DEBUG_SET: g_answer.short_answer[UART_FMT_CMD]=USART_CMD_DEBUG_SET_A; if(debug) { PrintString1("debug"); } debug = g_Usart.recv_buffer[7]; g_answer.short_answer_flag=0x01; break; case Usart_CMD_Version: g_answer.version_answer[UART_FMT_CMD]=Usart_CMD_Version_A; g_answer.version_answer_flag=0x01; if(debug) { PrintString1("version"); } break; } g_Usart.ok_flag=0; } } void Usart_answer(void) { u8 i=0; u8 checksum=0; if(g_answer.long_answer_flag) { g_answer.long_answer[UART_FMT_ADDR_TX]=ADDR_RX; g_answer.long_answer[UART_FMT_TYPE]=g_Usart.Sn; g_answer.long_answer[UART_FMT_DEV_TYPE]=DEV_TYPE; g_answer.long_answer[UART_FMT_ADDR_RX]=g_Usart.recv_buffer[UART_FMT_ADDR_TX]; g_answer.long_answer[UART_FMT_LEN]=0x14; g_answer.long_answer[7] = s_recv.global_brightness; for(i=0;i<12;i++) { g_answer.long_answer[8+i] = s_pwm.currvalue[11-i]; if(s_recv.key_status[i] == 0x01) { g_answer.long_answer[8+i] |= 0x80; } } checksum=sumfunc(g_answer.long_answer,0x14); g_answer.long_answer[UART_FMT_CKS]=checksum; Printbuffer3(g_answer.long_answer,0x14); //串口3输出打印 if(debug) { // PrintString1("long answer"); } g_answer.long_answer_flag=0; memset(g_Usart.recv_buffer,0,32); } if(g_answer.short_answer_flag) { g_answer.short_answer[UART_FMT_ADDR_TX]=ADDR_RX; g_answer.short_answer[UART_FMT_TYPE]=g_Usart.Sn; g_answer.short_answer[UART_FMT_DEV_TYPE]=DEV_TYPE; g_answer.short_answer[UART_FMT_ADDR_RX]=g_Usart.recv_buffer[UART_FMT_ADDR_TX]; g_answer.short_answer[UART_FMT_LEN]=0x07; checksum=sumfunc(g_answer.short_answer,0x07); g_answer.short_answer[UART_FMT_CKS]=checksum; Printbuffer3(g_answer.short_answer,0x07); if(debug) { PrintString1("short answer"); } g_answer.short_answer_flag=0; memset(g_Usart.recv_buffer,0,32); } if(g_answer.version_answer_flag) { g_answer.version_answer[UART_FMT_ADDR_TX]=ADDR_RX; g_answer.version_answer[UART_FMT_TYPE]=g_Usart.Sn; g_answer.version_answer[UART_FMT_DEV_TYPE]=DEV_TYPE; g_answer.version_answer[UART_FMT_ADDR_RX]=g_Usart.recv_buffer[UART_FMT_ADDR_TX]; g_answer.version_answer[UART_FMT_LEN]=0x09; g_answer.version_answer[UART_FMT_CMD+1]=Version_High; g_answer.version_answer[UART_FMT_CMD+2]=Version_Low; checksum=sumfunc(g_answer.version_answer,0x09); g_answer.version_answer[UART_FMT_CKS]=checksum; Printbuffer3(g_answer.version_answer,0x09); if(debug) { PrintString1("version_answer"); } g_answer.version_answer_flag=0; memset(g_Usart.recv_buffer,0,32); } memset(&g_answer,0,sizeof(g_answer)); } u8 sumfunc(u8* answer,u8 len) { u8 m = 0; u8 j; for (j = 0; j < len; j++) { if (5 == j) continue; m += *(answer+j); } return ~m; }