永发信息网

51单片机共阴数码管越来越暗

答案:4  悬赏:50  手机版
解决时间 2021-04-04 23:13
  • 提问者网友:酱爆肉
  • 2021-04-04 14:35
我在写一个51单片机的程序,是让共阴数码管显示矩阵键盘按下的按钮所包含的字母或者数字,但是我发现越是输入得多,数码管闪烁越厉害,而且越来越暗,而且靠左一个的数码管有右边一个数码管的残影。求大神给去残影的方法,下面送上我的代码;还有,在输满8个之后开始出现乱显示东西了,为啥?

void main(void){
unsigned char cord_l;
unsigned char cord_r;
unsigned char total;
unsigned char num;
while(1){
Key=0x0f;
cord_l=Key;
while(Key==cord_l){
if(num!=0){
Display(num);
if(num==9){
num=0;
}
}
}
if(Key!=cord_l){
DelayMs(10);
if(Key!=cord_l){
cord_l=Key;
Key=0xf0;
cord_r=Key;
total=cord_l+cord_r;
number[num]=cult(total);
num++;
while(cord_r==Key){
Display(num);
}
}
}

}
}

unsigned char cult(unsigned char total){
unsigned char i;
switch(total){
case 0x7E: i=0; return i;break;
case 0x7D: i=1; return i;break;
case 0x7B: i=2; return i;break;
case 0x77: i=3; return i;break;
case 0xBE: i=4; return i;break;
case 0xBD: i=5; return i;break;
case 0xBB: i=6; return i;break;
case 0xB7: i=7; return i;break;
case 0xDE: i=8; return i;break;
case 0xDD: i=9; return i;break;
case 0xDB: i=10; return i;break;
case 0xD7: i=11; return i;break;
case 0xEE: i=12; return i;break;
case 0xED: i=13; return i;break;
case 0xEB: i=14; return i;break;
case 0xE7: i=15; return i;break;
}
i=0;return i;
}

void DelayMs(unsigned char t){
while(t--){
DelayUs2x(245);
DelayUs2x(245);
}
}

void DelayUs2x(unsigned char t){
while(--t);
}

void Display(unsigned char num){
unsigned char i;
unsigned char t;
t=num-1;
for(i=0;i DataPort=wei[i];
LATCH1=1;
LATCH1=0;

DataPort=table[number[t]];
LATCH2=1;
LATCH2=0;
DelayMs(5);
t--;
}
}
最佳答案
  • 五星知识达人网友:冷風如刀
  • 2021-04-04 14:41
你显示用中断或按键用中断,然后感觉你用573做的驱动你送位码和段码的程序对换,然后就是你在给573送数据前给它先送一个全0或1让它在送数据时不亮就没阴影了,你按键有延时,按了按键显示就抖变暗,手机打字欢迎追问
全部回答
  • 1楼网友:空山清雨
  • 2021-04-04 17:52
关注这个问题
  • 2楼网友:行路难
  • 2021-04-04 17:21
将显示程序放到中断去,并设置扫描中断时间在20ms以内
  • 3楼网友:你可爱的野爹
  • 2021-04-04 16:15
//51单片机控制3位7段共阴数码管 p0口控制 abcdefg dp , //p2.0-p2.2控制123位,----注意:没有用p2.3。 //要使其间隔1s分别显示123,231,321,213...........无限循环 //下列程序,经过仿真,符合要求。 #include #define uchar unsigned char sbit bit1 = p2^0; sbit bit2 = p2^1; sbit bit3 = p2^2; uchar code dulatab[] = //数字编码0-9 {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //---------------------------------------------------------------- void delay(uchar time) { uchar i, j; for(i = 0; i < time; i++) for(j = 0; j < 110; j++); } //---------------------------------------------------------------- void disp_num(uchar a , b, c) { uchar i; for(i = 1; i < 250; i++) { p2 = 255; //关显示. p0 = dulatab[a]; bit1 = 0; delay(4); p2 = 255; //关显示. p0 = dulatab[b]; bit2 = 0; delay(4); p2 = 255; //关显示. p0 = dulatab[c]; bit3 = 0; delay(4); } } //---------------------------------------------------------------- void main() { while(1) { //要使其间隔1s分别显示123,231,321,213...........无限循环. disp_num(1, 2, 3); disp_num(2, 3, 1); disp_num(3, 2, 1); disp_num(2 , 1, 3); // disp_num(? , ?, ?); 还想显示?内容,楼主可自行编写. // disp_num(? , ?, ?); } } //----------------------------------------------------------------
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯