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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)