显示个位、十位、百位

问题:

a范围为0~255,将其值显示到数码管或LCD上。

 

算法1

百位:a /100

十位:a %100 / 10

个位:a % 10

 

算法2

if(200 < a) 百位为2a -= 200

else if(100 < a) 百位为1a -= 100

else 百位为0

 

if(90 <= a) 十位为9a -= 90;个位此时为a

else if(80 <= a) 十位为8a -= 80;个位此时为a

else if(70 <= a) 十位为7a -= 70;个位此时为a

...

...

else if(10 <= a) 十位为1a -= 10;个位此时为a

else 十位为0,个位此时为a

 

算法3

位权 128  64  32  16  8  4  2  1

0xFF = 1    1   1   1  1   1  1  1

254 = 0xFE = 1111 1110 = 1*128+1*64+1*32+1*16+1*8+1*4+1*2+0*1

位权表:

uint8_t bit_table[][3] =

{

0,0,1,

0,0,2,

0,0,4,

0,0,8,

0,1,6,

0,3,2,

0,6,4,

1,2,8

};

3列数加起来为个位,超过10则进1,第2列数加起来为十位,超过10则进1,第1列数加起来为百位。

 

for(i=0;i<8;i++)

{

if(val & 0x01)

{

asc[2] += bit_table[i][2];//个位

if(10 <= asc[2]) {asc[2] -= 10;asc[1]+=1;}//101

asc[1] += bit_table[i][1];//十位

if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}//101

asc[0] += bit_table[i][0];//百位

}

val >>= 1;

}

asc[0] += 0x30;//百位,转ASCII

asc[1] += 0x30;//十位,转ASCII

asc[2] += 0x30;//个位,转ASCII

 

优化:

//位权表

const static uint8_t bit_table[ ] = {1,2,4,8,6,2,4,8,1,3,6,2,1};

asc[0] = 0;

asc[1] = 0;

asc[2] = 0;

for(i = 0; i < 8; i ++)

{

if(val & 0x01)

{

switch(i)

{

case 7:asc[0] += bit_table[i + 5];

case 6:if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}

case 5:

case 4:asc[1] += bit_table[i + 4];

case 3:if(10 <= asc[2]){asc[2] -= 10;asc[1]+=1;}

default:asc[2] += bit_table[i];break;

}

}

val >>= 1;

}

if(10 <= asc[2]) {asc[2] -= 10;asc[1]+=1;}

if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}

asc[0] += 0x30;

asc[1] += 0x30;

asc[2] += 0x30;

 

posted @ 2022-08-25 09:59  hifish  阅读(68)  评论(0)    收藏  举报