SDK版本:AC692x_SDK_release_V2.6.3
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坐标,直接填真值表就完事了。