目前公司提出节约成本,故而提出把数码管的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
有外部链接,如果不合适,请版主删除。。。。
|