A. 數碼管動態顯示 匯編
可以實現的。
當先後按下《1、3、0、8、d、A》,顯示如下圖:
程序,可見我的網路空間。
B. 共陰數碼管動態顯示程序(匯編)
一、 MOV 30H,#0 MOV 31H,#1 MOV 32H,#2 MOV 33H,#3 ;預置顯示數據為0,1,2,3 這樣,30H到33H,4個地址的數據依次是0,1,2,3, MOV R0,#30H 是為了讓@R0這個指針指向第一個數據0 二、你有4個組數碼管,就是說要顯示4位數,而你一次給P0傳輸的數據只能顯示1位, 這就要用給P2傳輸的數據來指定要顯示的位,#0FEH就是#11111110B,其中0的位置,就代表要顯示的位,所以:MOV R1,#0FEH ;共陰初始位選碼 三、INC R0,就是把@R0這個指針向後移一位 四、 RL A,循環右移,把要顯示的位,也就是R1中的0,向右移一位,選定要顯示的下一位。
C. 求單片機大神,用匯編編寫使動態數碼管分別顯示1-8,時間間隔1秒左右。
使用中斷就行了啊,C語言也是這樣的,編譯器會把C語言轉換成匯編語言。然後再轉換成HEX文件。下面是在你的程序上修改的,沒試過,你編譯一下看看有沒錯誤
ORG 00H
LJMP MAIN
ORG 001BH ;定時器1入口地址
LJMP TIMER1_ISR
ORG 0100H
MAIN:
MOV TMOD,#10H
MOV TL1,#0F0H
MOV TH1,#0D8H ;賦初值,定時10毫秒
SETB TR1
MOV IE,#88H
MOV R2,#20 ;R2的值可以隨時修改
MOV R3,#100 ;100 * 10MS = 1S
DISP:
MOV A,R2 ;南北方向顯示初值R2=20秒
MOV B,#10
DIV AB
MOV P0,A ;段選
MOV P2,#01 ;位選
ACALL D1ms ;延時
MOV P2,#00 ;清零
MOV P0,B
MOV P2,#02
ACALL D1ms
MOV P2,#00 ;清零
LJMP DISP ;這個地方就一直循環,怎樣實現定時器的作用??
;*********** 定 時 1 秒 中 斷 ***********
TIMER1_ISR:
MOV TL1,#0F0H
MOV TH1,#0D8H ;賦初值,定時10毫秒
PUSH ACC
PUSH PSW
DJNZ R3,TIMER1_END
MOV R3,#100
MOV A,R2
DEC R2
JNZ TIMER1_END
MOV R2,#20
TIMER1_END:
POP PSW
POP ACC
RETI
;************ 延 時 D1ms 程序***********
D1ms:
MOV R7,#02H
DL:
MOV R6,#0FFH
DL1:
DJNZ R6,DL1
DJNZ R7,DL
RET
;***************************************
END
D. 求一段數碼管動態顯示的匯編語言程序
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsignedcharsec=0,min=0,hour=12,scanled;
unsignedcharkey,time;
unsignedchardisdat[6];
sbitK1=P1^2;
sbitK2=P1^3;
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒計時
{
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=00;
min=00;
hour=12;
scanled=0;
time=0;
key=0;
dischg();
while(1)
{
if(K1==0)
{
while(K1==0);
key=1;
}
if(K2==0)
{
while(K2==0);
key=2;
}
switch(key)
{
case0:
TR0=1;
break;
case1:
TR0=0;
break;
}
}
}
E. 匯編 數碼管動態顯示(74HC573利用) 請教!
根據你的思路做了如下修改。已經實現你所需的切換顯示。但其實還有更好的方法來實現,代碼不用那麼長。
; SEG_C BIT P2.7 ;/段控制位定義
; BIT_C BIT P2.6 ;/位控制位定義
SEG_C BIT P1.4 ;/段控制位定義
BIT_C BIT P1.5 ;/位控制位定義
COUN_WEI EQU 3CH ;/顯示位存儲區
COUN_DISP EQU 3dh ;顯示次數,顯示指定次數後,切換顯示
CN_COUN_DISP EQU 10;顯示次數
ORG 0000H
AJMP MAIN
MAIN: MOV SP,#60H
MOV COUN_WEI,#0
MOV R0,#1 ;/從1開始顯示
MOV COUN_DISP,#20 ;顯示次數
LOOP: CALL DISPLAY_0
JMP LOOP
;/第一組顯示數據給出 87654321
DISPLAY_0:
CLR SEG_C ;/關顯示
CLR BIT_C ;[]
MOV P0,#0ffh;[]
SETB BIT_C
NOP
CLR BIT_C
; MOV R0,#0 ;/段碼給出【不能在循環中給初值】
MOV A,R0
MOV DPTR,#SEG_TAB
MOVC A,@A+DPTR
MOV P0,A
SETB SEG_C
NOP
CLR SEG_C
MOV A,COUN_WEI ;/位碼給出
MOV DPTR,#WEI_TAB
MOVC A,@A+DPTR
MOV P0,A
SETB BIT_C
nop
CLR BIT_C
CALL DELAY_1MS;【先clr bti—C再做延時】
INC R0
INC COUN_WEI
MOV A,COUN_WEI
CJNE A,#8,DISPLAY_0
MOV COUN_WEI,#0
MOV R0,#1
DJNZ COUN_DISP,DISPLAY_0
MOV COUN_DISP,#CN_COUN_DISP
MOV R0,#8
;/第二組顯示數據給出 12345678
DISPLAY_1:
CLR SEG_C
CLR BIT_C
MOV P0,#0ffh;[]
SETB BIT_C
NOP
CLR BIT_C
MOV A,R0
MOV DPTR,#SEG_TAB
MOVC A,@A+DPTR
MOV P0,A
SETB SEG_C
NOP
CLR SEG_C
MOV A,COUN_WEI
MOV DPTR,#WEI_TAB
MOVC A,@A+DPTR
MOV P0,A
SETB BIT_C
nop;[]
CLR BIT_C
CALL DELAY_1MS;【先clr bti—C再做延時】
INC COUN_WEI;[]
DEC R0
MOV A,COUN_WEI
CJNE A,#8,DISPLAY_1
MOV COUN_WEI,#0
MOV R0,#8
DJNZ COUN_DISP,DISPLAY_1
MOV COUN_DISP,#CN_COUN_DISP
MOV R0,#1
RET
DELAY_1MS:
MOV R1,#35;50[防止閃爍]
D1:
MOV R2,#100
DJNZ R2,$
DJNZ R1,D1
RET
SEG_TAB: DB 03fh,06H,05BH,04FH,66H,06DH,07DH,07H,07FH,06FH;共陰數碼管段碼[0~9]
WEI_TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FeH;f7h改feh
END
F. 動態數碼管 匯編 60進制
程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVDPTR,#TAB;表首址送DPTR
MOVR1,#0
MOVR2,#0
M1:
MOVR0,#50
LOOP:
CALLDIS
DJNZR0,LOOP
MOVA,R3
ADDA,#1
DAA
CJNEA,#60H,SSS
CLRA
SSS:
MOVR3,A;計數值.
MOVB,#16
DIVAB
MOVR2,A
MOVR1,B
SJMPM1
;-------------------------------------------------------
DIS:;顯示程序.
MOVA,R2;顯示十位.
MOVCA,@A+DPTR
CLRP2.1
MOVP1,A
SETBP2.0;十位的位選.
CALLDLY
MOVA,R1;個位顯示.
MOVCA,@A+DPTR
CLRP2.0;關閉十位的顯示.
MOVP1,A
SETBP2.1;個位的位選.
CALLDLY
RET
;-------------------------------------------------------
TAB:DB0xc0,0xf9,0xa4,0xb0,0x99;共陽極0~9
DB0x92,0x82,0xf8,0x80,0x90
DLY:MOVR6,#14H;10ms延時.
D1:MOVR7,#0F8H
DJNZR7,$
DJNZR6,D1
RET
;-------------------------------------------------------
G. 4位共陽數碼管動態掃描顯示匯編程序 嗎
用51單片機實現4位共陽數碼管動態掃描顯示程序,採用74HC573做驅動,定時器T0定時16ms,用來刷新數碼管顯示屏,軟體延時1ms實現數碼管亮滅延時,相當穩定,沒有一點閃爍的感覺。