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(? , ?, ?);
}
}
//----------------------------------------------------------------
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯