图11-48 习题11-12题电路图
分析:P2.3驱动个位LED显示8,其段码为80H,P2.2驱动十位LED显示7,其段码为F8H,P2.1驱动百位LED显示6,其段码为82H,P2.0驱动千位LED显示5,其段码为92H,段码从P0口输出。P2.3、P2.2 、P2.1、P2.0作为输出位选端,加入小功率PNP型三极管9012增强驱动能力。限流电阻为330Ω,使两位LED动态显示时,每一段的电流大约为10mA。
取刷新频率为50Hz,刷新周期20ms,共4个数码管,所以每隔5ms就要交替刷新一个数码管的显示状态。选择延时5ms或更短时间即可 (1) 汇编语言程序:
ORG 00H
LJMP START ORG 80H START: MOV SP,#50H LLOOP: MOV 30H,#5 MOV R0,#30H MOV R1,#0FEH
MOV R7,#4 LOOP:
MOV DPTR,#TABLE MOV A,@R0 MOVC A,@A+DPTR MOV P0,A INC @R0 MOV A,R1 MOV P2,A RL A ;左移 MOV R1,A ACALL DELAY DJNZ R7,LOOP SJMP LLOOP DELAY:
;延时5ms程序
MOV R3,#60 DELAY1: MOV R2,#250 DELAY3:
DJNZ R2,DELAY3 DJNZ R3,DELAY1 RET
TABLE: ;共阳极八段码键值表
DB C0H,F9H,A4H,B0H,99H,92H DB 82H,F8H,80H,90H,88H,83H DB C6H,A1H,86H,8EH END (2)C51程序: #include
unsigned char code seg[ ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x 82,0xF8,0x80,0x90,0x88,0x83,0x C6,0xA1,0x86,0x8E}
unsigned char code xianshi[]={5,6,7,8} void main( ) {
unsigned char i,j,weixuan; {
while(1)
weixuan=0xfe; for(i=0;i<4;i++)
{
var1=xianshi[i];;//取待显示的数字
} } }
void delay( ) {
unsigned char a,b; for(a=142;a>0;a--)
var2=seg[var1]; //取该数字对应的字段码 P0=var2; P2=weixuan; delay();
weixuan=_crol_(weixuan,1);
for(b=250;b>0;b--);
}
或用定时器做定时 ORG 0000H LJMP MAIN ORG 001BH LJMP T1_INT ORG 0100H
MAIN: MOV SP,#0BFH SETB P2.0 SETB P2.1 SETB P2.2 SETB P2.3 MOV TMOD,#10H MOV TL1,#78H MOV TH1,#0ECH MOV R7,#4 SETB EA SETB ET1 SETB TR1 SJMP $
T1_INT: MOV TL1,#78H MOV TH1,#ECH CJNE R7,#4,NEXT1 SETB P2.3 CLR P2.0 MOV P0,#092H DEC R7 RETI
NEXT1: CJNZ R7,#3,NEXT2 SETB P2.0 CLR P2.1 MOV P0,#082H DEC R7 RETI
NEXT2: CJNZ R7,#2,NEXT3 SETB P2.1 CLR P2.2 MOV P0,#0F8H DEC R7 RETI
NEXT3: CJNZ R7,#1,EXIT SETB P2.2 CLR P2.3 MOV P0,#080H EXIT: MOV R7,#4 RETI END
C51程序:
#include
P2_0=1 P2_1=1 P2_2=1 P2_3=1 TMOD=0x10; TL1=0x78; TH1=0xEC; EA=1; ET1=1; TR1=1; while(1); }
void T1_INT() interrupt 3 {
TL1=0x78; TH1=0xEC; i++; switch(i) {
case 1: P2_3=1;P2_0=0;P0=0x92;break; case 2:P2_0=1;P2_1=0;P0=0x82;break; case 3:P2_1=1;P2_2=0;P0=0xF8;break; case 4:P2_2=1;P2_3=0;P0=0x80;i=0;break; default: i=0; } }