8字数码管动态显示0到FF的汇编程序

8字数码管动态显示0到FF的汇编程序,第1张

我这有个数码管动态扫描的程序,可以借鉴

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.每个数字闪烁三次,再显示下一个数字,如此循环。求程序,,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9435685.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存