目前公司提出节约成本,故而提出把数码管的8段码的电阻取消,改为在公共脚串接.但在写程序出现开多段和少段时亮度不同的情况.现在我有想到反过来扫描,即扫段码(通常我们是扫描位码).但想了很久也没有想出应该如何编写程序.不知各位有没有更好的程序方法来解决这种问题.常用接法:
简化后接法:
参考代码:
void display_scan(void)
{
unsigned char i;
P1 &= Bin(11111110);
P1 |= Bin(11111000);
P2 &= Bin(00000000);
P3 &= Bin(01100111);
P3 |= Bin(01100110); //关闭段码和位码,如共阳数码管(公共脚置低,段码置高)
//======================================//
for(i = 0;i < 4;i ++)
{
r_dis_data = table_seg[r_dis_buff]; //查LED段码表
}
switch (r_dig_bit) //在公共端接限流电阻,在数码管位数少时布线时有优势
{
case 1:
p_seg_a = 0; //扫描a段
// if(r_dis_data[0] & 0x01) p_dig_1 = 1; //如果r_dis_data[0]第0位为高,则需要点亮,反之则不点亮
// if(r_dis_data[1] & 0x01) p_dig_2 = 1;
// if(r_dis_data[2] & 0x01) p_dig_3 = 1;
// if(r_dis_data[3] & 0x01) p_dig_4 = 1;
// if(r_dis_buff[4] & 0x01) p_dig_5 = 1;
// if(r_dis_buff[5] & 0x01) p_dig_6 = 1;
//i=0x01;
break;
case 2:
p_seg_b = 0;
break;
case 3:
p_seg_c = 0;
break;
case 4:
p_seg_d = 0;
break;
case 5:
p_seg_e = 0;
break;
case 6:
p_seg_f = 0;
break;
case 7:
p_seg_g = 0;
break;
case 8:
p_seg_h = 0;
break;
default:
keyscan_process(); //按键扫描
break;
}
if((r_dig_bit<9)&&(r_dig_bit))
{
i=0x01<<(r_dig_bit-1);
if(r_dis_data[0] & i) p_dig_1 = 1;
if(r_dis_data[1] & i) p_dig_2 = 1;
if(r_dis_data[2] & i) p_dig_3 = 1;
if(r_dis_data[3] & i) p_dig_4 = 1;
if(r_dis_buff[4] & i) p_dig_5 = 1;
if(r_dis_buff[5] & i) p_dig_6 = 1;
}
r_dig_bit ++;
if(r_dig_bit >= 9) //扫描时基
r_dig_bit = 0;
}
可以看看我发的贴子:
http://www.amobbs.com/thread-5534576-1-1.html
http://www.amobbs.com/thread-5576556-1-1.html
有外部链接,如果不合适,请版主删除。。。。
|