位选 驱动写法明显错误,多个数字重叠 导致 所有 LED段 点亮 ,那就只能显示 888888
这要看你的数码管是共阴还是共阳的哈。还有和单片机IO口的链接情况。然后对应IO口将相应的''0-F编码。
如下面是我的开发板的一位数码管的显示程序,你在上面做些修改就是了哈!
#include reg51.h
#include intrins.h
#define NOP() _nop_() /* 定义空指令 */
void delay(unsigned int i); //函数声名
// 此表为 LED 的字模
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
main()
{
unsigned int LedNumVal=1 ,C ; //定义变量
while(1)
{
if (++C= 300)
{ LedNumVal++ ; //每隔300个扫描周期加一次
C =0; //每隔300个扫描清零
}
// 将字模送到P0口显示
P0 = LED7Code[LedNumVal%10]0x7f; //LED7 0x7f为小数点 共阴和共阳此处也是不一样;
delay(150); //调用延时程序
}
}
/*****************************************************************
* *
* 延时程序 *
* *
*****************************************************************/
void delay(unsigned int i)
{
char j;
for(i; i 0; i--)
for(j = 200; j 0; j--);
}
P1口外接共阳极的8段数码显示器。
P3.2外接一个按键,按下后,接地,用来起动.
ORG 0000H
JB P3.2, $
MOV R2, #0
LOOP:
INC R2
MOV A, R2
ANL A, #0FH
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV P1, A
LCALL DL500MS
LCALL DL500MS
SJMP LOOP
TAB:
DB 0c0H,0f9H,0a4H,0b0H, 99H, 92H, 82H,0f8H
DB 80H, 90H, 88H, 83H,0c6H,0a1H, 86H, 8eH
DL500MS:
MOV R5, #100
MOV R6, #10
MOV R7, #248
NOP
DJNZ R7, $
DJNZ R6, $ - 5
DJNZ R5, $ - 9
RET
错误给你找到了,由于在查显示编码表时 要不断地使用累加器A, 累加器A不能用来保存要轮流要显示的数据,可以改用R4.
ORG 0000H
TT: MOV R4,#0 ;循环16次
KK: MOV A,R4
MOV DPTR,#TABLE ;存入表的起始地址
MOVC A,@A+DPTR ;按地址取代码并存入A
MOV P0,A ;将代码送P0转变为数字显示
INC R4
LCALL DELAY
CJNE R4,#16,KK
AJMP TT
TABLE: DB 0FCH,60H,0DAH,0F2H ;代码表
DB 66H,0B6H,0BEH,0E0H
DB 0FEH,0F6H,0AAH,3EH
DB 9CH,7AH,9EH,8EH
DELAY: MOV R1,#25 ;延时
L1: MOV R2,#50
L2: MOV R3,#250
L3: DJNZ R3,L3
DJNZ R2,L2
DJNZ R1,L1
RET
51单片机汇编语言,用定时器中断实现数码管从0-F每秒进1且循环进行。
电路与程序如下:
由于条件不足,晶振频率不明,所以,本程序没有精确定时。
提问者采纳的答案是错误的。
题目要求显示 0~F,这就需要 16 个七段码。
而采纳答案中,并没有写全。
单片机1到f循环的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机1到f循环