【杰理AC692X】7脚屏亮度不均匀的处理

SDK版本:AC692x_SDK_release_V2.6.3

亮度不均匀:
【杰理AC692X】7脚屏亮度不均匀的处理_第1张图片
改之后:
【杰理AC692X】7脚屏亮度不均匀的处理_第2张图片
SDK标准的7脚屏驱动:

void LED_drive7(void)
{
    u8 k, i, j, temp;
    k = 0;

    //led7_var.bShowBuff[0]=0xff;
    //led7_var.bShowBuff[1]=0xff;
    //led7_var.bShowBuff[2]=0xff;
    //led7_var.bShowBuff[3]=0xff;
    //led7_var.bShowBuff[4]=0xff;

    led7_var.bShowBuff1[0] = 0;
    led7_var.bShowBuff1[1] = 0;
    led7_var.bShowBuff1[2] = 0;
    led7_var.bShowBuff1[3] = 0;
    led7_var.bShowBuff1[4] = 0;
    led7_var.bShowBuff1[5] = 0;
    led7_var.bShowBuff1[6] = 0;

    for (i = 0; i < 5; i++) {
        temp = led7_var.bShowBuff[i];
        if (get_sys_halfsec()) {
            if ((led7_var.bFlashIcon) && (i == 4)) {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            } else if (led7_var.bFlashChar & BIT(i)) {
                temp = 0x0;
            }
        }

        for (j = 0; j < 7; j++) {
            if (temp & bit_table[j]) {
                led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
            }
            k++;
        }
		
        if (j == 7) {
            if (temp & bit_table[j]) {
                led7_var.bShowBuff1[led_7[34][0]] |= bit_table[led_7[34][1]];
            }
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   LED清屏函数
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_clear(void)
*/
/*----------------------------------------------------------------------------*/
void led7_clear(void)
{
    LEDN_PORT_OUT &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_DIR |= (BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_PU  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_PD  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_HD  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_HD1 &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
}

/*----------------------------------------------------------------------------*/
/**@brief   LED扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_scan(void *param)
*/
/*----------------------------------------------------------------------------*/
void led7_scan(void *param)
{
    static u8 cnt;
    u8 seg;

    LED_drive7();

    seg = led7_var.bShowBuff1[cnt];

    led7_clear();

    switch (cnt) {
    case 0:
        LEDN_PORT_OUT |=  BIT(LEDN_S0_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S0_BIT);
        break;

    case 1:
        LEDN_PORT_OUT |=  BIT(LEDN_S1_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S1_BIT);
        break;

    case 2:
        LEDN_PORT_OUT |=  BIT(LEDN_S2_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S2_BIT);
        break;

    case 3:
        LEDN_PORT_OUT |=  BIT(LEDN_S3_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S3_BIT);
        break;

    case 4:
        LEDN_PORT_OUT |=  BIT(LEDN_S4_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S4_BIT);
        break;

    case 5:
        LEDN_PORT_OUT |=  BIT(LEDN_S5_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S5_BIT);
        break;

    case 6:
        LEDN_PORT_OUT |=  BIT(LEDN_S6_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S6_BIT);
        break;

    default :
        break;
    }

    if (seg & BIT(0)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S0_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S0_BIT);
    }

    if (seg & BIT(1)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S1_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S1_BIT);
    }

    if (seg & BIT(2)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S2_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S2_BIT);
    }

    if (seg & BIT(3)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S3_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S3_BIT);
    }

    if (seg & BIT(4)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S4_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S4_BIT);
    }

    if (seg & BIT(5)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S5_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S5_BIT);
    }

    if (seg & BIT(6)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S6_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S6_BIT);
    }
    cnt = (cnt >= 7) ? 0 : cnt + 1;
}

这样有一个弊端,一个公共端,输出电流是固定的,每次扫描亮的段的数量不同,有多有少,造成电流分流,亮度不一致。

我的解决方法就是每次扫描亮一段,逐段扫描,这样每段的电流就一样了。

void LED_drive7(void)
{
    u8 k, i, j, temp;
    k = 0;

    //led7_var.bShowBuff[0]=0xff;
    //led7_var.bShowBuff[1]=0xff;
    //led7_var.bShowBuff[2]=0xff;
    //led7_var.bShowBuff[3]=0xff;
    //led7_var.bShowBuff[4]=0xff;

    led7_var.bShowBuff1[0] = 0;
    led7_var.bShowBuff1[1] = 0;
    led7_var.bShowBuff1[2] = 0;
    led7_var.bShowBuff1[3] = 0;
    led7_var.bShowBuff1[4] = 0;
    led7_var.bShowBuff1[5] = 0;
    led7_var.bShowBuff1[6] = 0;

    for (i = 0; i < 5; i++) {
        temp = led7_var.bShowBuff[i];
        if (get_sys_halfsec()) {
            if ((led7_var.bFlashIcon) && (i == 4)) {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            } else if (led7_var.bFlashChar & BIT(i)) {
                temp = 0x0;
            }
        }

        for (j = 0; j < 7; j++) {
            if (temp & bit_table[j]) {
                led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
            }
            k++;
        }
		
        if (j == 7) {
            if (temp & bit_table[j]) {
                led7_var.bShowBuff1[led_7[34][0]] |= bit_table[led_7[34][1]];
            }
        }
    }
}

/*----------------------------------------------------------------------------*/
/**@brief   LED清屏函数
   @param   x:显示横坐标
   @return  void
   @author  Change.tsai
   @note    void led7_clear(void)
*/
/*----------------------------------------------------------------------------*/
void led7_clear(void)
{
    LEDN_PORT_OUT &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_DIR |= (BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_PU  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_PD  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_HD  &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
    LEDN_PORT_HD1 &= ~(BIT(LEDN_S0_BIT) | BIT(LEDN_S1_BIT) | BIT(LEDN_S2_BIT) | BIT(LEDN_S3_BIT) | BIT(LEDN_S4_BIT) | BIT(LEDN_S5_BIT) | BIT(LEDN_S6_BIT));
}

/*----------------------------------------------------------------------------*/
/**@brief   LED扫描函数
   @param   void
   @return  void
   @author  Change.tsai
   @note    void led7_scan(void *param)
*/
/*----------------------------------------------------------------------------*/
void led7_scan(void *param)
{
    static u8 cnt;
    u8 seg;
	static u8 seg_back = 0;

    LED_drive7();

    seg = led7_var.bShowBuff1[cnt];

	if(!seg_back)
		seg_back = seg;
	
    led7_clear();

    switch (cnt) {
    case 0:
        LEDN_PORT_OUT |=  BIT(LEDN_S0_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S0_BIT);
        break;

    case 1:
        LEDN_PORT_OUT |=  BIT(LEDN_S1_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S1_BIT);
        break;

    case 2:
        LEDN_PORT_OUT |=  BIT(LEDN_S2_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S2_BIT);
        break;

    case 3:
        LEDN_PORT_OUT |=  BIT(LEDN_S3_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S3_BIT);
        break;

    case 4:
        LEDN_PORT_OUT |=  BIT(LEDN_S4_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S4_BIT);
        break;

    case 5:
        LEDN_PORT_OUT |=  BIT(LEDN_S5_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S5_BIT);
        break;

    case 6:
        LEDN_PORT_OUT |=  BIT(LEDN_S6_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S6_BIT);
        break;

    default :
        break;
    }

    if (seg_back & BIT(0)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S0_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S0_BIT);
		seg_back &= ~BIT(0);
    }else if (seg_back & BIT(1)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S1_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S1_BIT);
		seg_back &= ~BIT(1);
    }else if (seg_back & BIT(2)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S2_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S2_BIT);
		seg_back &= ~BIT(2);
    }else if (seg_back & BIT(3)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S3_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S3_BIT);
		seg_back &= ~BIT(3);
    }else if (seg_back & BIT(4)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S4_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S4_BIT);
		seg_back &= ~BIT(4);
    }else if (seg_back & BIT(5)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S5_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S5_BIT);
		seg_back &= ~BIT(5);
    }else if (seg_back & BIT(6)) {
        LEDN_PORT_OUT &= ~BIT(LEDN_S6_BIT);
        LEDN_PORT_DIR &= ~BIT(LEDN_S6_BIT);
		seg_back &= ~BIT(6);
    }
	if(!seg_back)
    	cnt = (cnt >= 7) ? 0 : cnt + 1;
}

改成逐段扫描后,整体的扫描就相当于放慢了,显示会出现闪烁的问题,这时就要调整下定时器的速率了(半秒计数那里也要同步修改):

/****为了处理闪屏问题。默认独立使用timer3设置成最高优先级使用。
 *   如果有其他调度要认真考虑能不能放在最高优先级里面
 * ****/
static void timer3_isr_fun(void)
{
    struct loop_detect_handler *detect;
    JL_TIMER3->CON |= BIT(14);

    sys_global_value.t3_cnt1++;

    list_for_each_loop_ui(detect) {
        if ((sys_global_value.t3_cnt1 %  detect->time) == 0) {
            if (detect->fun) {
                detect->fun();
            }
        }
    }
    if (0 == (sys_global_value.t3_cnt1 % 1000)) {
        sys_global_value.sys_halfsec = !sys_global_value.sys_halfsec;//led7 driver
    }
}
IRQ_REGISTER(IRQ_TIME3_IDX, timer3_isr_fun);

static void timer3_init(void)
{
    u32 prd_cnt, clk, tmp_tick;
    u8 index;
    u8 clk_src;
    u8 catch_flag = 0;

    //resrt_sfr
    JL_TIMER3->CON = 0;

    clk = TIMER_CLK;
    clk /= 2000;
    clk *= 1;//500us  //2ms
    for (index = 0; index < (sizeof(timer_div) / sizeof(timer_div[0])); index++) {
        prd_cnt = clk / timer_div[index];
        if (prd_cnt > MIN_TIME_CNT && prd_cnt < MAX_TIME_CNT) {
            catch_flag = 1;
            break;
        }
    }

#if SOURCE_CLK
    clk_src = TIMER_CLK_SRC_OSC;
#else
    clk_src = TIMER_CLK_SRC_SYSCLK;
#endif

    if (catch_flag == 0) {
        puts("warning:timer_err\n");
        return;
    }

    IRQ_REQUEST(IRQ_TIME3_IDX, timer3_isr_fun);

    JL_TIMER3->CNT = 0;
    JL_TIMER3->PRD = prd_cnt - 1;
    JL_TIMER3->CON = BIT(0) | (clk_src << 2) | (index << 4);
    //JL_TIMER3->PRD = 0x7530/40/1;
    //JL_TIMER3->CON = 0x11;

    /* log_printf("JL_TIMER3->CNT = 0x%x\n", JL_TIMER3->CNT); */
    /* log_printf("JL_TIMER3->PRD = 0x%x\n", JL_TIMER3->PRD); */
    /* log_printf("JL_TIMER3->CON = 0x%x\n", JL_TIMER3->CON); */
}

这样,屏的亮度就均匀了。

如果加上7脚屏的规格书加以叙述就更清晰了,实在是找不到规格书了,现在写7脚屏都不用规格书了:

u8 xxx = 0;
u8 yyy = 0;
extern u8 get_sys_halfsec(void);
void LED_drive7(void)
{
    u8 k, i, j, temp;
    k = 0;

    //led7_var.bShowBuff[0]=0xff;
    //led7_var.bShowBuff[1]=0xff;
    //led7_var.bShowBuff[2]=0xff;
    //led7_var.bShowBuff[3]=0xff;
    //led7_var.bShowBuff[4]=0xff;

    led7_var.bShowBuff1[0] = 0;
    led7_var.bShowBuff1[1] = 0;
    led7_var.bShowBuff1[2] = 0;
    led7_var.bShowBuff1[3] = 0;
    led7_var.bShowBuff1[4] = 0;
    led7_var.bShowBuff1[5] = 0;
    led7_var.bShowBuff1[6] = 0;

    for (i = 0; i < 5; i++) {
        temp = led7_var.bShowBuff[i];
        if (get_sys_halfsec()) {
            if ((led7_var.bFlashIcon) && (i == 4)) {
                temp = LED_STATUS & (~led7_var.bFlashIcon);
            } else if (led7_var.bFlashChar & BIT(i)) {
                temp = 0x0;
            }
        }

        for (j = 0; j < 7; j++) {
            if (temp & bit_table[j]) {
                //led7_var.bShowBuff1[led_7[k][0]] |= bit_table[led_7[k][1]];
				led7_var.bShowBuff1[xxx] |= bit_table[yyy];
            }
            k++;
        }
		
        /*if (j == 7) {
            if (temp & bit_table[j]) {
                led7_var.bShowBuff1[led_7[34][0]] |= bit_table[led_7[34][1]];
            }
        }*/
    }
}
case MSG_BT_NEXT_FILE:
			xxx++;
			xxx%=7;
			printf("x:  %d  y:  %d\n",xxx,yyy);
			break;
		case MSG_BT_PREV_FILE:
			yyy++;
			yyy%=7;
			printf("x:  %d  y:  %d\n",xxx,yyy);
			break;

直接这样改,用两个按键改变X,Y坐标,直接填真值表就完事了。

你可能感兴趣的:(杰理692系列问题)