74HC164驱动数码管循环显示0~F的汇编程序求注释

74HC164驱动数码管循环显示0~F的汇编程序求注释,第1张

CLK EQU P10 ;定义端口P10在该程序中用CLK表示

HEIPING:MOV R0,#40 ;r0=40 BLACK子程序入口参数

LCALL BLACK ;调用BLACK

LP: MOV R6,#0 ;r6=0

MOV R3,#16 ;r3=16决定BEGIN子程序执行次数

MOV A,#0 ;a=0

BEGIN: MOV DPTR,#MyZiKu ;dptr=MYZIKU(首地址)

MOVC A,@A+DPTR ;a=欲显示字符的字形码

LCALL SHOW ;调用SHOW程序(显示)

LCALL DELAY ;调用DELAY程序(延时)

INC R6 ;r6加1

MOV A,R6 ;a=r6

DJNZ R3,BEGIN ;r3减1不为0转移到BEGIN

;BEGIN这一段程序的作用是在LED上每隔DELAY程序设定的时间按顺序显示0~F 循环16次

LJMP LP ;转移到LP执行

;延时程序 r0 r1 r2决定延时时间

DELAY: MOV R0,#0FFH ;r0=255

DLP: MOV R1,#0FFH ;r1=255

DLP1: MOV R2,#04H ;r2=4

DJNZ R2,$ ;r2减1不为0仍在该行再次执行

DJNZ R1,DLP1 ;r1减1不为0转到DLP1

DJNZ R0,DLP ;r0减1不为0转到DLP

RET ;退出

;显示程序 该程序将循环8次显示一个字符

SHOW: MOV R0,#8 ;r0=8

SLP: CLR CLK ;P10输出低电平

RRC A ;将存放在A中欲显示的字符码右移一位(最低位存入C)

MOV A_B,C ;A_B(未见到你程序中定义 应是个端口)=C

SETB CLK ;P10输出高电平

DJNZ R0,SLP ;r0减1不为0转到SLP 继续输出字形码

RET

;该程序循环40次 P10输出40个脉冲 同时端口A_B持续输出低电平

BLACK: CLR CLK ;P10输出低电平

CLR A_B ;A_B(未见到你程序中定义 应是个端口)输出低电平

SETB CLK ;P10输出高电平

DJNZ R0,BLACK ;r0减1不为0转到BLACK

RET

;0~F的字形码

MYZIKU:

DB 77H,06H,0B3H,97H,0C6H ;"0,1,2,3,4"

DB 0D5H,0F5H,07H,0F7H,0D7H ;"5,6,7,8,9"

DB 0E7H,0F4H,71H,0B6H,0F1H,0E1H ;"A,B,C,D,E,F"

0101 0000 1289 1488 R4H5 Q533

SCANLED EQU 30H

ORG 0000H

LJMP MAIN

ORG 001BH

LJMP T1ISR ;扫描显示

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#10H

MOV TH1,#0ECH

MOV TL1,#078H

MOV SCANLED,#0

SETB ET1

SETB TR1

SETB EA

SJMP $

;--------------------

T1ISR:

CLR TR1

MOV TH1,#0ECH

MOV TL1,#78H

SETB TR1

MOV DPTR,#LEDTAB

MOV R2,SCANLED

MOV A,#01H

CJNE R2,#0,T1DIS0

SJMP T1DIS1

T1DIS0:

RL A

DJNZ R2,T1DIS0

T1DIS1:

MOV P2,A

MOV A,SCANLED

INC A

MOVC A,@A+DPTR

MOV P0,A

INC SCANLED

MOV A,SCANLED

CJNE A,#8,T1END

MOV SCANLED,#0

T1END:

RETI

;--------------------

LEDTAB:

DB 0C0H ;"0" 00H

DB 0F9H ;"1" 01H

DB 0A4H ;"2" 02H

DB 0B0H ;"3" 03H

DB 99H ;"4" 04H

DB 92H ;"5" 05H

DB 82H ;"6" 06H

DB 0F8H ;"7" 07H

DB 80H ;"8" 08H

DB 90H ;"9" 09H

DB 88H ;"A" 0AH

DB 83H ;"B" 0BH

DB 0C6H ;"C" 0CH

DB 0A1H ;"D" 0DH

DB 86H ;"E" 0EH

DB 8EH ;"F" 0FH

DB 0FFH ;" " 10H

;--------------------

END

七段共阳数码管接在P0口,显示从0到9, 按键接P32按一下加一, 按键P33 按一下减一。程序如下:

K1 BIT P32

K2 BIT P33

START:MOV  DPTR,#TABLE

MOV  R1,#0

MLOOP:MOV A,R1

MOVC A,@A+DPTR

MOV  P0,A

JB K1 ,TK2

CJNE R1,#9,CPM

CPM:JNC MLOOP

INC R1

JNB K1,$

SJMP MLOOP

TK2:JB  K2,MLOOP

CJNE R1,#0,CPN

SJMP MLOOP

CPN:DEC R1

JNB K2,$

SJMP MLOOP

TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H

DB 92H,82H,0F8H,80H,90H

END

仿真图及效果

//晶振12M

KEY  BIT  P32   ;按键接P32

LED_bits BIT P31;个位显示控制端

LED_ten  BIT  P30;十位显示控制端

DATA_bits   DATA    30H;个位

DATA_ten    DATA    31H;十位

ORG   00H

LJMP  MAIN

ORG  30H

MAIN: ;主程序

SETB LED_bits

SETB LED_ten

SETB KEY

MOV DATA_bits,#0

MOV DATA_ten,#0

LOOP:

ACALL DISPLAY;显示

ACALL KEY_COUNT;键控

LJMP LOOP

KEY_COUNT:;键控计数

JB KEY, KEY_END

ACALL DELAY10MS

JNB  KEY,$

ACALL COUNT

KEY_END:

RET

COUNT:  ;计数

INC DATA_bits

MOV A,DATA_bits

CJNE A,#10,COUNT_END

MOV DATA_bits,#0

INC DATA_ten

MOV A,DATA_ten

CJNE A,#10,COUNT_END

MOV DATA_ten,#0

COUNT_END:

RET

DISPLAY: ;显示

MOV A,DATA_bits

MOV DPTR,#LEDSHOW

MOVC A,@A+DPTR

MOV P2,A

CLR LED_bits

ACALL DELAY1MS

SETB LED_bits

MOV A,DATA_ten

MOV DPTR,#LEDSHOW

MOVC A,@A+DPTR

MOV P2,A

CLR LED_ten

ACALL DELAY1MS

SETB LED_ten

RET

DELAY10MS:   ;误差 0us

MOV R7,#01H

DL1:

MOV R6,#26H

DL0:

MOV R5,#82H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

RET

DELAY1MS:   ;误差 0us

MOV R7,#01H

DL3:

MOV R6,#8EH

DL2:

MOV R5,#02H

DJNZ R5,$

DJNZ R6,DL2

DJNZ R7,DL3

RET

LEDSHOW:

DB        03FH;0

DB        006H;1

DB        05BH;2

DB        04FH;3

DB        066H;4

DB        06DH;5

DB        07DH;6

DB        007H;7

DB        07FH;8

DB        06FH;9

END

unsigned char code SEG7[] = {

    0xc0,0xf9,0xa4,0xb0,0x99,

    0x92,0x82,0xf8,0x80,0x90};

    

unsigned char DISP_BUFF[] = {

    0, 0, 0, 0, 0, 0, 0, 0} 

void DelayMS(unsigned int x)

{

    unsigned char  i;

    while(x--)  for(i = 200; i > 0; i--);

}

void  display(unsigned char x)

{

    unsigned char i, w = 128;

    for(i = 0; i < 8; i++)  {  //显示八位数码

      P0 = SEG7[DISP_BUFF[i]];

      P2 = w;  DelayMS(1);   P2 = 0;

      w = _cror_(w, 1);

    }

}

LINE EQU 30H

ROW EQU 31H

VAL EQU 32H

ORG 00H

START: MOV DPTR,#TABLE ;段码表首地址

MOV P2,#00H ;数码管显示初始化

LSCAN: MOV P3,#0F0H ;列线置高电平,行线置高电平

L1: JNB P30,L2 ;逐行扫描

LCALL DELAY

JNB P30,L2

MOV LINE,#00H ;存行号

LJMP RSCAN

L2: JNB P31,L3

LCALL DELAY

JNB P31,L3

MOV LINE,#01H ;存行号

LJMP RSCAN

L3: JNB P32,L4

LCALL DELAY

JNB P32,L4

MOV LINE,#02H ;存行号

LJMP RSCAN

L4: JNB P33,L1

LCALL DELAY

JNB P33,L1

MOV LINE,#03H ;存行号

RSCAN: MOV P3,#0FH ;行线列线电平互换

C1: JNB P34,C2 ;逐列扫描

MOV ROW,#00H ;存列号

LJMP CALCU

C2: JNB P35,C3

MOV ROW,#01H ;存列号

LJMP CALCU

C3: JNB P36,C4

MOV ROW,#02H ;存列号

LJMP CALCU

C4: JNB P37,C1

MOV ROW,#03H ;存列号

CALCU: MOV A,LINE ;根据行号和列号计算键值

MOV B,#04H

MUL AB

ADD A,ROW

MOV VAL,A ;存键值

MOVC A,@A+DPTR ;要据键值查段码

MOV P2,A ;输出段码显示

LJMP LSCAN

DELAY: MOV R6,#20

D1: MOV R7,#250

DJNZ R7,$

DJNZ R6,D1

RET

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

END

我也是看的别人的

ORG 0000H

SJMP MAIN

ORG 030H

MAIN: MOV R1,#00H

MOV A,R1

D1: ANL A,#0FH

MOV DPTR,#TAB

MOVC A,@A+DPTR ;查表

MOV P0,A ;P0口输出,显示数字

ACALL DELAY

INC R1

MOV A,R1 ;A加1

CJNE A,#10,D1 ;判断A是否到达10

LJMP MAIN ;当A达到10跳回主函数,重新赋值为0

DELAY: MOV R2,#05H ;延时

D2: MOV R3,#0FFH

D3: MOV R4,#0FFH

DJNZ R4,$

DJNZ R3,D3

DJNZ R2,D2

RET

TAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数值1到9的共阳极编码

END

补充说明两点:

1、程序下载到目标板之后,注意一下晶振频率,如果显示效果不佳,可以通过修改延时参数,调节刷新频率。

2、这里采用的是共阳极编码二极管(公共端已经接VCC了),下载程序前,请注意自己到网上找编码,代替倒数第二行代码。

KEYCARD

BIT

00H

;用于标志是否有键按下

KEYCOU

EQU

5AH

;用于记录按下键的次数

ORG

0000H

;程序开始

AJMP

START

ORG

30H

;为避免占用中断向量区,主程序从30H开始

START:

MOV

SP,#5FH

;设置堆栈的初始地址

MOV

P2,#0H

;P2,P3的初始化

MOV

P3,#0FFH

CLR

KEYCARD

;有按键标志清0

MOV

KEYCOU,#0

;计数初值赋0

LOOP:

;循环扫描键盘

ACALL

KEY_CHECK

JNB

KEYCARD,DISPLAY

INC

KEYCOU

DISPLAY:

;显示程序

MOV

DPTR,#ASCII

;获得对应的显示码

PUSH

B

MOV

A,KEYCOU

MOV

B,#0AH

DIV

AB

;选显示第一位高位

MOVC

A,@A+DPTR

MOV

P0,A

;把显示码传至A口

SETB

P21

;选通P20,显示

ACALL

DELAY1S

CLR

P21

MOV

A,

B

POP

B

MOVC

A,@A+DPTR

MOV

P0,A

;把显示码传至A口

SETB

P20

;选通P20,显示

ACALL

DELAY1S

CLR

P20

AJMP

LOOP

KEY_CHECK:

;看有没有键按下

MOV

A,P3

ANL

A,#0fFH

;逻辑与

CJNE

A,#0FFH,KEY_CER

;如果读入的与写出的不相等,延时消抖

CLR

KEYCARD

RET

KEY_CER:

;延时,再读入,看是否真的有键按下

ACALL

DELAY1S

MOV

A,P3

ANL

A,#0FFH

CJNE

A,#0FFH,KEY_CE

CLR

KEYCARD

RET

KEY_CE:

MOV

A,P3

;直等到按键放下,则算作一次

ANL

A,#0FFH

CJNE

A,#0FFH,KEY_CE

SETB

KEYCARD

;真的有键按下,则置标志位

RET

DELAY1S:

;延时函数

MOV

R7,#10

D1:

MOV

R6,#50

DJNZ

R6,$

DJNZ

R7,D1

RET

ASCII:

DB

0C0H,0F9H,0A4H,0B0H,099H

DB

092H,082H,0F8H,080H,090H

DB

088H,083H,0C6H,0A1H,086H

DB

08EH,08CH,0BFH,0FFH

END

模仿下

呵呵

大家都没多少时间的

以上就是关于74HC164驱动数码管循环显示0~F的汇编程序求注释全部的内容,包括:74HC164驱动数码管循环显示0~F的汇编程序求注释、汇编语言程序 使数码管显示1,2,3,4,5,6,7,8、求汇编程序 七段数码管显示从0到9的程序 按键按一下加一 按一下减一 按键接p3.2p3.3等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存