① 单片机 按键控制8位数码管显示问题
关于数码管的显示,是显示完一个位的是数字后,在显示下一个位时要先把上一个位显示彻底关闭掉,通常可以是把全部数码管位全部显示为空的状态,谈后在开下一个位的显示(有延时),这样在开下一个位的锁存时上一个位的数据就不会跑到该位显示,不然会在下一位显示时会与上一个位的数字出现重影现象。。。
还有对于数码管的显示,最好是一次性显示完全部数码管,还没有得位就显示0ff(要记得初始化你的数组)。我个人不建议你这种显示按位数变化方式。。。
for(i=0;i<j;i=i+1)
//每次都显示完8个数码管比较好。。。
{
/*
在此增加把所有数码管显示为0FF状态,全部位都打开显示
*/
display=weima_table[i];
//数码管需要显示的位
weima_latch=1;
//锁存器(位码)打开
weima_latch=0;
//锁存器(位码)关闭
display=cunchudisplay[i];
//数码管需要显示的段
anma_latch=1;
//锁存器(段码)打开
anma_latch=0;
//锁存器(段码)关闭
Delay(100);
}
判断归零一个变量,最好紧跟在修改该值的后面,不用放在主循环里每次循环都要判断,虽然你那没多大问题但可读性不够好。。。
j=j+1;
if(j==8)
{j=0;}
② 51单片机,怎样编程,让所有的数码管都显示8,给出详细编程,谢谢!
让所有的数码管都显示8其实是最简单的,将所有位码都置为有效,段码送8的码就可以了,不需要扫描。
比如:P0为段码,P2为位码
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV P0,#7FH
MOV P2,#00H
SJMP $
END
③ 设计一位8段数码管静态显示接口电路,选用单片机P0作数据信号,并列表写出显示0—9的显示段码
#include<reg51.h> // 包含51单片机寄存器定义的头文件
/**************************************************
函数功能:延时函数,延时一段时间
***************************************************/
void delay(void)
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++)
;
}
/**************************************************
函数功能:主函数
***************************************************/
void main(void)
{
unsigned char i;
unsigned char code Tab[10]=;
//数码管显示0~9的段码表,程序运行中当数组值不发生变化时,
//前面加关键字code ,可以大大节约单片机的存储空间
P2=0x7f; //P2.7引脚输出低电平,数码显示器第7位接通电源工作
while(1) //无限循环
{
for(i=0;i<10;i++)
{
P0=Tab[i]; //让P0口输出数字的段码92H
delay(); //调用延时函数
}
}
}
另外,站长团上有产品团购,便宜有保证
④ 51单片机数码管显示8位二进制数程序,第6、7位永远都只显示0,其他位显示正常。
MOV 26H,20H ;二进制数第6位送26H单元
MOV 20H,A
RR A
ANL 20H,#01H
MOV 27H,20H ;二进制数第7位送27H单元
这26H,27H是保存第6,7位数据的,但是延时慧粗子程序又用顷闹26H,27H单元了,延时结束,这两个单元永远是0了。
DELAY: MOV 26H,#4 ;延时服务子程序
DLY1: MOV 27H,#250
DJNZ 27H,$
DJNZ 26H,DLY1
RET
这延时子程序要用29H,2AH,两个单元就好雀碧罩了,还不如用R4,R5更方便呢,也不会出错。这样的
DELAY: MOV R4,#4 ;延时服务子程序
DLY1: MOV R5,#250
DJNZ R5,$
DJNZ R4,DLY1
RET
这多好哇
⑤ 单片机 按键控制8位数码管显示问题
关于数码管的显示,是显示完一个位的是数字后,在显示下一个位时要先把上一个位显示彻底关闭掉,通常可以是把全部数码管位全部显示为空的状态,谈后在开下一个位的显示(有延时),这样在开下一个位的锁存时上一个位的数据就不会跑到该位显示,不然会在下一位显示时会与上一个位的数字出现重影现象。。。
还有对于数码管的显示,最好是一次性显示完全部数码管,还没有得位就显示0ff(要记得初始化你的数组)。我个人不建议你这种显示按位数变化方式。。。
for(i=0;i<j;i=i+1) //每次都显示完8个数码管比较好。。。
{
/*
在此增加把所有数码管显示为0FF状态,全部位都打开显示
*/
display=weima_table[i]; //数码管需要显示的位
weima_latch=1; //锁存器(位码)打开
weima_latch=0; //锁存器(位码)关闭
display=cunchudisplay[i]; //数码管需要显示的段
anma_latch=1; //锁存器(段码)打开
anma_latch=0; //锁存器(段码)关闭
Delay(100);
}
判断归零一个变量,最好紧跟在修改该值的后面,不用放在主循环里每次循环都要判断,虽然你那没多大问题但可读性不够好。。。
j=j+1;
if(j==8)
{j=0;}