我这有个数码管动态扫描的程序,可以借鉴
ORG 00H
MOV 20H,#3FH
MOV 21H,#06H
MOV 22H,#5BH
MOV 23H,#4FH
MOV 24H,#66H
MOV 25H,#6DH
MOV 26H,#7DH
MOV 27H,#07H
START:CALL SCAN
JMP START
SCAN: MOV A,#0 ;扫描子程序
MOV R0,#20H
MOV R2,#8
LOOP:
MOV P2,A
MOV P0,@R0
INC R0
CALL DELAY
ADD A,#01H
DJNZ R2,LOOP
MOV R2,#8
CLR A
RET
DELAY:MOV R3,#1 ;扫描延时
D1:MOV R4,#2
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
END
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#9
CLR 00H
CLR 01H
LOOP:
JB P10,LP01
JNB P10,$
SETB TR0
CLR 01H
SJMP LOOP0
LP01:
JB P11,LP02
JNB P11,$
SETB 01H
SJMP LOOP0
LP02:
JB P12,LOOP0
JNB P11,$
CLR TR0
MOV P3,#0FDH
MOV P2,#0
MOV P3,#0FEH
MOV P2,#0
SJMP MAIN
LOOP0:
JB 00H,LOOP1
MOV A,R0
SJMP LOOP2
LOOP1:
MOV A,R1
LOOP2:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
JB 01H,T0C
INC R2
T0C:
CPL 00H
MOV A,R3
JB 00H,T001
MOV P3,#0FDH
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV P2,A
T002:
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR TR0
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R0,#0
MOV R1,#3
LOOP:
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY
MOV P1,#00H
LCALL DELAY
DJNZ R1,LOOP
INC R0
MOV R1,#3
CJNE R0,#10,LOOP
MOV R0,#0
SJMP LOOP
DELAY:
MOV R2,#200
DELAY1:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DELAY1
RET
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END
U16INC MACRO U16, ;;16位无符号型变量加1
LOCAL ZZ
INC U16+1
MOV A,U16+1
JNZ ZZ
MOV U16+1,#0
INC U16
ZZ:
ENDM
U16MOV MACRO U16,VAL ;;16位无符号型变量赋值
MOV U16+1,#LOW(VAL)
MOV U16,#HIGH(VAL)
ENDM
U16DAYV MACRO U16,VAL, ;;16位无符号型变量判断大小,最后根据Cy判断
MOV A,U16+1
CLR C
SUBB A,#LOW(VAL)
MOV A,U16
SUBB A,#HIGH(VAL)
ENDM
WX1 EQU P20
WX2 EQU P21
WX3 EQU P22
WX4 EQU P23
S4 EQU P13
S5 EQU P14
LED1 EQU P16 ;;两个LED
LED2 EQU P17
JDQ EQU P15 ;;继电器
SMGBZ1 EQU 0X30
DS1 EQU 0X31
ZT EQU DS1+4
JSBZ1 EQU ZT+1 ;0-39的计数
JSBZ2 EQU ZT+2 ;计时标志,用于闪烁和计时
JSBZ3 EQU JSBZ2+2 ;;继电器通断两次的计时和计数
ORG 0
JMP MAIN
ORG 0XB
JMP TimeInterupt
MAIN:
MOV SP,#0X70
MOV R0,#0x70
CLR A
MA1: MOV @R0,A ;数据全清0
DJNZ R0,MA1
CALL JDQLC_STOP
CALL Time0Init
;主循环
LOOP: CALL AJPD
CALL RUN
JMP lOOP
;主运行函数
RUN: MOV A,ZT
CJNE A,#1,RR1
JMP RUN1
RR1: CJNE A,#2,RR2
JMP RUN2
RR2: RET
;;0-39循环
RUN1:
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV A,JSBZ1
MOV B,#10
DIV AB
MOV DS1+2,A
MOV DS1+3,B
U16DAYV JSBZ2,1000
JC RUN1_1
U16MOV JSBZ2,0
INC JSBZ1
MOV A,JSBZ1
CJNE A,#39+1,RUN1_1
MOV JSBZ1,#0
RUN1_1:
RET
;;FFFF闪烁
RUN2: U16DAYV JSBZ2,500
JC RUN2_1
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV DS1+2,#0X10
MOV DS1+3,#0X10
SETB LED1
SETB LED2
U16DAYV JSBZ2,1000
JC RUN2_2
U16MOV JSBZ2,0
JMP RUN2_2
RUN2_1:
MOV DS1+0,#0X0F
MOV DS1+1,#0X0F
MOV DS1+2,#0X0F
MOV DS1+3,#0X0F
CLR LED1
CLR LED2
RUN2_2:
CALL JDQLC
RET
;按键判断
AJPD:
JNB S4,AJ1
JNB S5,AJ2
RET
AJ1: JNB S4,$
MOV ZT,#2
CALL JDQLC_START
RET
AJ2: CALL JDQLC_STOP
SETB LED1
SETB LED2
JNB S5,$
MOV ZT,#1
MOV JSBZ1,#0
U16MOV JSBZ2,0
RET
JDQLC_START:
U16MOV JSBZ3,0
RET
JDQLC_STOP:
U16MOV JSBZ3,30000
SETB JDQ
RET
;继电器通断两次
JDQLC:
U16DAYV JSBZ3,1000
JNC JDQ_1
CLR JDQ ;通1s
RET
JDQ_1: U16DAYV JSBZ3,1500
JNC JDQ_2
SETB JDQ ;断05s
RET
JDQ_2: U16DAYV JSBZ3,1500+1000
JNC JDQ_3
CLR JDQ ;通1s
RET
JDQ_3: U16DAYV JSBZ3,3000
JNC JDQ_4
SETB JDQ ;断
JDQ_4: RET
;;定时器初始化
Time0Init:
MOV TMOD,#0X01
MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
SETB TR0
SETB ET0
SETB EA
RET
;;数码显示
SMXS:
INC SMGBZ1
MOV A,SMGBZ1
SUBB A,#4
JC SMXS1
MOV SMGBZ1,#0
SMXS1:
MOV P2,#0XF0
MOV A,SMGBZ1
ADD A,#DS1
MOV R0,A
MOV A,@R0
MOV DPTR,#TABD
MOVC A,@A+DPTR
MOV P0,A
MOV DPTR,#TABW
MOV A,SMGBZ1
MOVC A,@A+DPTR
MOV P2,A
RET
TABD:;段码
DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
DB 0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF,0XBF
TABW:;位码
DB 0xF1,0xF2,0xF4,0xF8
;;定时器0中断
TimeInterupt:
PUSH PSW
PUSH ACC
MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
CALL SMXS
U16INC JSBZ2
U16DAYV JSBZ3,30000
JNC TimeOut
U16INC JSBZ3
TimeOut:
POP ACC
POP PSW
RETI
END
这个确实不难,属于实验级别的,我花时间给你写程序,你给我多点悬赏,谢谢数码管是动态显示,做一个子程序,为了你移植方便,我帮你写一个程序,你直接代替你的主程序就可以了
unsigned char DispDat[8],cyc=0;//DispDat是要显示的8个数据,cyc是轮询扫描计数器
const unsigned char SegDat[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//将显示的数字转换成数码管的位
void disp(void)//显示子函数
{cyc++;//显示轮询计数器
cyc&=0x7;//0-7循环显示
P2=(0x1<<cyc);//片选其中一个数码管
P0=SegDat[DispDat[cyc]];//送出该数码管的数据
}
sbit K1=P1^2;//按键1
sbit K2=P1^3;//按键2
sbit K3=P1^4;//按键3
unsigned char ReadKey(void)//读取按键子函数
{if(K1==0)return 1;
if(K2==0)return 2;
if(K3==0)return 3;
}
char sta=0;//显示状态,这里你要求55可以左右移动,所以sta范围是-3到3,-3时,最左边两个数码管显示55,再按k1就不动了,+3是最右边显示55;如果想移出去,就不限制这个范围
void main(void)//主程序
{unsigned char cnt,i;
for(cnt=0;cnt<8;cnt++)DispDat[cnt]=0;//清除显示
DispDat[3]=5; DispDat[4]=5;//最中间两个数码管显示55
while(1)//主循环
{cnt++;//
cnt%=200;//该变量记200就翻转,主要控制数码管的扫描速度
if(cnt==0)disp();//记200次扫描,根据你的晶振速度,如果数码管闪的厉害,就把200改小一点
switch(ReadKey())//读取按键
{case(1): if(sta>-3){sta--;for(i=7;i>0;i--)DispDat[i]=DispDat[i-1];}break;//还没有到最左边时继续移动,否则停止移动
case(2):sta=0;;for(i=0;i<7;i++)DispDat[i]=0;DispDat[3]=5;DispDat[4]=5;break;//按下K2就放倒中间去
case(3): if(sta<3){sta++;for(i=0;i<7;i++)DispDat[i]=DispDat[i+1];}break;//还没有到最右边就继续移动,否则停止移动
}
}
}
1、 数码管显示演示程序: 在8个LED数码管上依次显示1,2,3,4,5,6,7,8。引用端口:数码管数据p0,数码管控制p2;
DIS_DIGIT EQU 40H;位选通值, 传送到P2口用于选通当前数码管的数值,
; 如等于0xfe时, 选通P20口数码管
DIS_INDEX DATA 41H
;显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
DIS_BUF DATA 50H
;显于缓冲区起始地址
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP INTT0
ORG 0100H
MAIN:MOV P0,#0FFH; 初始化I/O口
MOV P2,#0FFH
MOV TMOD, #02H;定时器0在模式2下工作
MOV TL0, #38H; 每200μs产生一次溢出
MOV TH0, #38H;自动重装初值
SETB ET0 ;使能定时器0中断
SETB TR0;启动定时
SETB EA ;使能总中断
MOVDPTR, #DIS_CODE; 设定显示初值为1-8
MOVA,#1;初值为1,以后顺序加1
MOVC A,@A+DPTR
MOV DIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOV DIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOV DIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOV DIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOV DIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOV DIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOV DIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOV DIS_BUF+07H,A
DISPLAY:MOV DIS_DIGIT,#0FEH; 初始从第一个数码管开始扫描
MOV DIS_INDEX,#0
SETB TR0; 启动定时器0,开始动态扫描显示
MAIN_LP:NOP
; 主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容
SJMP MAIN_LP
;=====================================================
INTT0:
; 定时器0中断服程序, 用于数码管的动态扫描
PUSH ACC
PUSH PSW
MOV P2,#0FFH; 先关闭所有数码管
MOV A,#DIS_BUF; 获得显示缓冲区基地址
ADD A,DIS_INDEX; 获得偏移量
MOV R0,A; R0 = 基地址 + 偏移量
MOV A,@R0; 获得显示代码
MOV P0,A; 显示代码传送到P0口
MOV P2,DIS_DIGIT;
MOVA,DIS_DIGIT
; 位选通值左移, 下次中断时选通下一位数码管
RL A
MOVDIS_DIGIT,A
INCDIS_INDEX
; DIS_INDEX加1, 下次中断时显示下一位
ANLDIS_INDEX,#0x07
; 当DIS_INDEX等于8(0000 1000B)时, 清0
POP PSW
POP ACC
RETI
DIS_CODE: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB 20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的数码管显示代码
END
以上就是关于8字数码管动态显示0到FF的汇编程序全部的内容,包括:8字数码管动态显示0到FF的汇编程序、共阴极数码管0到99汇编语言程序怎么编、汇编语言 数码管显示0-9.每个数字闪烁三次,再显示下一个数字,如此循环。求程序,,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)