MCS-51单片机查表程序的问题

MCS-51单片机查表程序的问题,第1张

MOV DPTR,#TAB

MOVC A,@A+DPTR

CPL A ;理解这句

MOV P0,A

MOV DPTR,#TAB 这句是将TAB处的内容的地址移入DPTR寄存器(51单片机中唯一的一个16位的)

MOVC A,@A+DPTR 这句将(A寄存器中的内容+DPTR)中的地址处的数据移入A

比如此时 A=0,DPTR=300,这时就将300+0寄存器里的数据移到A

如果A=2,DPTR=300,这时就将(300+2)寄存器里的数据移到A

CPL A ; A求反,

MOV P0,A 将A的值移入P0口,用数码管等显示出来结果

以下为完整测试通过代码,0~9的立方表存于table中,按esc退出程序,程序查表结果以四位十进制输出,若要十六进制输出可自己做微小调整,最后附带部分dos环境测试结果

-----------------------------------------------------------------------------------

; multi-segment executable file template

data segment

; add your data here!

table dw 0000h,0001h,0008h,001bh,0040h,007dh,00d8h,0157h,0200h,02d9h

ends

stack segment

dw 128 dup(0)

ends

code segment

start:

; set segment registers:

mov ax, data

mov ds, ax

mov es, ax

; add your code here

again:

call rechar;in:none out:al

call newline_b

cmp al,1bh

jz exit

mov bx,table

call checktable;in:bx al out:ax

call outax

jmp again

exit:

mov ax, 4c00h ; exit to operating system

int 21h

;call rechar ;in:none out:al

rechar proc near

again1:

call newline_b ;in:none out:none

mov ah,01h

int 21h

cmp al,1bh

jz oute

cmp al,30h

jl again1

cmp al,39h

jg again1

sub al,30h

oute:

ret

rechar endp

;call newline_b ;in:none out:none

newline_b proc near ;none effect

push ax

push dx

mov ah,02h

mov dl,0ah

int 21h

mov dl,0dh

int 21h

pop dx

pop ax

ret

newline_b endp

;call checktable ;in:bx al out:ax

checktable proc near

push cx

shl al,01h

mov ah,al

inc ah

xlat

mov cl,al

mov al,ah

xlat

mov ch,al

mov ax,cx

pop cx

ret

checktable endp

;call outax ;in:ax out:ax_Denum

outax proc near

push bx

mov dl,00h

call outdl;in:dl out:dl_asciiNum

mov bl,64h

div bl

mov dl,al

call outdl

mov al,ah

xor ah,ah

mov bl,0ah

div bl

mov dl,al

call outdl

mov dl,ah

call outdl

pop bx

ret

outax endp

;call outdl ;in:dl out:dl_asciiNum

outdl proc near

push ax

add dl,30h

mov ah,02h

int 21h

pop ax

ret

outdl endp

ends

end start ; set entry point and stop the assembler

------------------------------------------------------------------

C:\CODEST~1>xlatexe

0

0000

1

0001

2

0008

5

0125

7

0343

9

0729

8

0512

C:\CODEST~1>

附录1:晶振为12M的音乐频率表

音符 频率(Hz) 简谱码(T值)

低1DO 262 63628 TH0=F7H TL0=24H

#1DO# 277 63731 TH0=F8H TL0=F3H

低2RE 294 63835 TH0=F9H TL0=5BH

#2RE# 311 63928 TH0=F9H TL0=B8H

低3M 330 64021 TH0=FAH TL0=15H

低4FA 349 64103 TH0=FAH TL0=67H

#4FA# 370 64185 TH0=FAH TL0=B9H

低5SO 392 64260 TH0=FBH TL0=04H

#5SO# 415 64331 TH0=FBH TL0=4BH

低6LA 440 64400 TH0=FBH TL0=90H

#6 466 64463 TH0=FBH TL0=CFH

低7SI 494 64524 TH0=FCH TL0=0CH

中1DO 523 64580 TH0=FCH TL0=44H

#1DO# 554 64633 TH0=FCH TL0=79H

中2RE 587 64684 TH0=FCH TL0=ACH

#2RE# 622 64732 TH0=FCH TL0=DCH

中3M 659 64777 TH0=FDH TL0=09H

中4FA 698 64820 TH0=FDH TL0=34H

#4FA# 740 64860 TH0=FDH TL0=5CH

中5SO 784 64898 TH0=FDH TL0=82H

#5SO# 831 64934 TH0=FDH TL0=A6H

中6LA 880 64968 TH0=FDH TL0=C8H

#6 932 64994 TH0=FDH TL0=E2H

中7SI 988 65030 TH0=FEH TL0=06H

高1DO 1046 65058 TH0=FEH TL0=22H

#1DO# 1109 65085 TH0=FEH TL0=3DH

高2RE 1175 65110 TH0=FEH TL0=56H

#2RE# 1245 65134 TH0=FEH TL0=6EH

高3M 1318 65157 TH0=FEH TL0=85H

高4FA 1397 65178 TH0=FEH TL0=9AH

#4FA# 1480 65198 TH0=FEH TL0=AEH

高5SO 1568 65217 TH0=FEH TL0=C1H

#5SO# 1661 65235 TH0=FEH TL0=D3H

高6LA 1760 65252 TH0=FEH TL0=E4H

#6 1865 65268 TH0=FEH TL0=F4H

高7SI 1967 65283 TH0=FFH TL0=03H

休止符用TH0=FFH ,TL0=FFH表示

附录2:LCD相关资料

两行液晶显示的地址:(均为十六位计数)

0 1 2 3 4 5 6 7 8 9 A B C D E F

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

命令格式要求,设置地址指针的时候第8位为1,后边为地址,即AC0~AC6,就是对应上表的地址。

附录3:实验程序:

RS BIT P20 ;定义液晶显示端口标号

RW BIT P21

E BIT P22

;

T0TH EQU 24H ;T0两个暂存变量

T0TL EQU 23H

ORG 0000H

LJMP INITION

ORG 000BH

LJMP T0INT

ORG 0100H

;

;液晶初始化

INITION:

MOV SP,#70H

MOV P0,#01H ;清屏

CALL ENABLE

MOV P0,#38H ;8位,2行显示

CALL ENABLE

MOV P0,#0CH ;屏显on,关光标

CALL ENABLE

MOV P0,#06H ;计数地址加1,自动右移

CALL ENABLE

;

;开机提示

;

MOV P0,#80H

CALL ENABLE

MOV DPTR,#TABLE0 ;写数据的第一行

CALL WRITE1

MOV P0,#00010000B ;光标左移两位

CALL ENABLE

MOV P0,#00010000B

CALL ENABLE

CALL DEL0

LJMP MAIN

;写指令

ENABLE:

CLR RS

CLR RW

SETB E

CALL DEL0

CLR E

RET

;写数据

WRITE1:

MOV R1,#00H ;查表程序,从表头到表尾

A1:

MOV A,R1

MOVC A,@A+DPTR

CALL WRITE2

INC R1

CJNE A,#00H,A1 ;未到字符串末尾继续

RET

WRITE2:

MOV P0,A ;直接将数据写入液晶屏

SETB RS

CLR RW

SETB E

CALL DEL0

CLR E

RET

DEL0:MOV R4,#020H

C0:MOV R5,#020H

C1: DJNZ R5,C1

DJNZ R4,C0

RET

;

TABLE0:DB 'WELCOM HERE',00H

;内存初始化

INITIAL:

MOV R3,#08H

MOV R0,#30H

M1:

MOV @R0,#00H

INC R0

DJNZ R3,M1

RET

;选择按键播放八个音调

MAIN: MOV SP,#80H ;初始化堆栈

MOV TMOD,#11H ;定时器0工作方式0,定时器1工作方式0

SETB EA

SETB ET0 ;计数器0允许

SETB ET1 ;计数器1允许

START: SETB P37 ;关蜂鸣器

CLR TR0 ;定时器不允许

SCAN: ;键盘扫描

MOV A,P1

CJNE A,#0FFH,SU_KEY ;判断键盘按下,跳到SU_KEY,若未按,继续扫描

NOP

LJMP SCAN

SU_KEY:

SU_KEY1:

JB P10,SU_KEY2 ;如果不是第1个键按下,转

MOV DPH,#0FCH

MOV DPL,#44H

SJMP PLAY

SU_KEY2:

JB P11,SU_KEY3 ;如果不是第2个键按下,转

MOV DPH,#0FCH

MOV DPL,#0ACH

SJMP PLAY

SU_KEY3:

JB P12,SU_KEY4 ;如果不是第3个键按下,转

MOV DPH,#0FDH

MOV DPL,#09H

SJMP PLAY

SU_KEY4:

JB P13,SU_KEY5 ;如果不是第4个键按下,转

MOV DPH,#0FDH

MOV DPL,#34H

SJMP PLAY

SU_KEY5:

JB P14,SU_KEY6 ;如果不是第5个键按下,转

MOV DPH,#0FDH

MOV DPL,#82H

SJMP PLAY

SU_KEY6:

JB P15,SU_KEY7 ;如果不是第6个键按下,转

MOV DPH,#0FDH

MOV DPL,#0C8H

SJMP PLAY

SU_KEY7:

JB P16,SU_KEY8 ;如果不是第7个键按下,转

MOV DPH,#0FEH

MOV DPL,#06H

SJMP PLAY

SU_KEY8:

JB P17,KEY1 ;如果不是第8个键按下,转

MOV DPH,#0FEH

MOV DPL,#22H

SJMP PLAY

PLAY:

MOV T0TH,DPH ;存高位字符

MOV T0TL,DPL ;存低位字符

MOV TH0,T0TH

MOV TL0,T0TL

SETB TR0 ;启动定时器0

MOV R2,#01B ;1/4拍

DJNZ R2,PLAY

LCALL DELAY

SJMP JUDGE

JUDGE:

JB P24,START ;按键未按下,则继续扫描,否则,开始放音乐

;选择按键播放音乐

KEY1:

JB P25,KEY2 ;第一个键(P25)按下,放音音乐1

MOV R2,#00H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB1

AJMP MUSIC

KEY2:

JB P26,KEY3 ;第二个键(P26)按下,放音乐2

MOV R2,#01H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB2

AJMP MUSIC

KEY3:

JB P27, NEXT_2 ;第三个键(P27)按下,放音乐3

MOV R2,#02H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB3

AJMP MUSIC

NEXT_2: LJMP START ;返回

MUSIC:

MOV TMOD,#01H

MOV IE,#82H ;允许T0中断

MOV R7,#00H

LOOP:

CLR A

MOVC A,@A+DPTR ;查表取代码

MOV R1,A ;定时器高八位存R1

INC DPTR

PUSH DPH ;保护现场

PUSH DPL

GECI1:

JB P25,GECI2 ;第一个键(P25)按下,显示歌词1

MOV DPTR,#GE1

AJMP GECI

GECI2:

JB P26,GECI3 ;第二个键(P26)按下,显示歌词2

MOV DPTR,#GE2

AJMP GECI

GECI3:

JB P27, TIAOCHU ;第三个键(P27)按下,显示歌词3

MOV DPTR,#GE3

AJMP GECI

TIAOCHU:LJMP START

GECI:

LCALL QINGCHU

MOV P0,#0C0H ;显示的位置

CALL ENABLE

XIANSHI1: MOV A,R7 ;查表取音乐汉语拼音显示

MOVC A,@A+DPTR

CALL WRITE2

INC R7

CJNE A,#00H,XIANSHI1

MOV P0,#00010000B ;将光标左移一位

CALL ENABLE

MOV P0,#00010000B ;将光标左移一位

CALL ENABLE

POP DPL

POP DPH

CLR A

MOVC A,@A+DPTR

MOV R0,A ;定时器低八位存R0

ORL A,R1

JZ NEXT0 ;相或结果全0为休止符

MOV A,R0

ANL A,R1

CJNE A,#0FFH,NEXT ;相与结果为0FFH表示乐曲结束

MOV P0,#01H ;清屏

CALL ENABLE

LJMP INITION ;从头开始演奏

NEXT: MOV T0TH,R1 ;装定时初值

MOV TH0,T0TH

MOV T0TL,R0

MOV TL0,T0TL

SETB TR0 ;启动定时器

SJMP NEXT1

NEXT0: CLR TR0 ;关闭定时器

NEXT1: CLR A

INC DPTR

MOVC A,@A+DPTR ;查延时常数

MOV R2,A

LOOP1:

ACALL D200

DJNZ R2,LOOP1 ;控制延时次数

INC DPTR

AJMP LOOP

D200: MOV R3,#81H ;延时程序

D200B: MOV A,#0FFH

D200A: DEC A

JNZ D200A

DEC R3

CJNE R3,#00H,D200B

RET

QINGCHU:MOV A,#00100000B

MOV P0,#0C0H ;将第二行的第一位置0

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第二位置0

MOV P0,#0C1H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第三位置0

MOV P0,#0C2H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第四位置0

MOV P0,#0C3H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第五位置0

MOV P0,#0C4H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第六位置0

MOV P0,#0C5H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第七位置0

MOV P0,#0C6H

LCALL ENABLE

LCALL WRITE2 ;将第二行的第三位置0

;以上等价程序如下

;GECI:MOV R3,#00H ;控制循环次数

;QINGCHU:

;MOV A,#00100000B ;置空格

;PUSH A

;MOV R4,#0C0H ;地址

;MOV A,R4

;MOV P0,A

;POP A

;INC R4

;DEC R3 ;控制循环次数

;CJNE R3,#00H,QINGCHU ;计满十次则执行转移

;

;定时器0中断子程序,定时音乐

;

T0INT: ;中断服务子程序

MOV TH0,T0TH

MOV TL0,T0TL

CPL P37 ;反相输出,演示音乐

RETI

;

;显示

;

MODD:

MOV P0,#8EH

LCALL ENABLE

MOV A,R2

MOV DPTR,#TABLE2

MOVC A,@A+DPTR

LCALL WRITE2

RET

TABLE2:DB 31H,32H,33H

GE1: db 'xin',00h,'nian',00h,'hao',00h,'ya',00h,'xin',00h,'nian',00h,'hao',00h,'ya',00h

db 'zhu',00h,'fu',00h,'da',00h,'jia',00h,'xin',00h,'nian',00h,'hao',00h

GE2: DB 'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'pao',00H,'de',00H,'kuai',00H

DB 'pao',00H,'de',00H,'kuai',00H,'yi',00H,'zhi',00H,'mei',00H,'you',00H,'yan',00H,'jing',00H,'yi',00H,'zhi',00H

DB 'mei',00H,'you',00H,'er',00h,'duo',00h,'zhen',00h,'qi',00h,'guai',00h,'zhen',00h,'qi',00h,'guai',00h

GE3: DB 'wo',00h,'ai',00h,'bei',00h,'jing',00h,'tian',00h,'an',00h,'men',00h,'tian',00h,'an',00h

;延时子程序

DELAY:MOV 30H,#100 ;延长时间等待,键盘消抖

D1:MOV R5,#200

D2:DJNZ R5,D2

DJNZ 30H,D1

RET

;新年好

MU_TAB1: DB 0FEH,25H,04H,0FEH,25H,04H

DB 0FEH,25H,06H,0FDH,80H,06H

DB 0FEH,84H,04H,0FEH,84H,04H

DB 0FEH,84H,06H,0FEH,25H,06H

DB 0FEH,25H,04H,0FEH,84H,04H

DB 0FEH,0C0H,04H,0FEH,84H,04H

DB 0FEH,98H,04H,0FEH,84H,04H

DB 0FEH,57H,06H

DB 0FFH,0FFH

;两只老虎

MU_TAB2: DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H

DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H

DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H

DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H

DB 0FBH,04H,04H,0FDH,0C8H,04H,0FBH,04H,04H,0FDH,34H,04H

DB 0FDH,09H,04H,0FCH,44H,04H,0FBH,04H,04H,0FDH,0C8H,04H

DB 0FBH,04H,04H,0FDH,34H,04H,0FDH,09H,04H,0FCH,44H,04H

DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H

DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H

DB 0FFH,0FFH

;我爱北京天安门

MU_TAB3: DB 0FDH,82H,06H,0FEH,22H,04H,0FDH,82H,04H,0FDH,34H,04H

DB 0FDH,09H,04H,0FCH,0ACH,04H,0FCH,44H,06H

DB 0FFH,0FFH,0FFH,0FFH

END

这段代码的关键指令其实就是片选指令。

MOV DPTR,# ;把外部接口的地址码传给指针DPTR,地址码通过外部译码器转

;换成片选信号

MOVX @DPTR,A ;把累加器A的值通过数据总线传递给DPTR指向的外部接口,在

;这段程序中即实现段选和位选功能。

你的这段程序只能显示数字“0”,下面详细给你解读这段程序:

ORG 0 ;程序代码段从地址0开始

MOV R0,#0 ;这句代码是控制你所要显示的数字的,它其实是TAB表中的偏移

;量,现在偏移量是0,即显示的是3FH,共阴数码管段选码表示数

;字“0”

LOOP:MOV DPTR,#8002H ;位码地址为8002H,指针指向位选的外部接口,选定一

;个数码管

MOV A,#1

MOVX @DPTR,A ;以上两句向位选接口传动数据1,其实是把第一个数码

;管置高电平,表示选通。

MOV A,R0 ;A=RO=0

MOV DPTR,#TAB ;DPTR =TAB表首地址

MOVC A,@A+DPTR ;把TAB+0地址上的数据传送给A,@TAB+N表示TAB表中第

;N+1个数据,在这里是A=3fh

MOV DPTR,#8004H ;段码地址为8004H,指针指向段选的外部接口

MOVX @DPTR,A ;把3fh传送给段选接口,实现显示“0”的功能

LJMP LOOP ;跳到LOOP处循环执行。

TAB:DB 3FH,06H,5BH,4FH,66H

DB 6DH,7DH,07H,7FH,6FH

这样解释,你应该会明白的。 o(∩_∩)o

你的补充问题也回答正确。

SERCHA:

MOV DPTR,#2000H

MOV R2,#100

LOOP:

MOVX A,@DPTR

CJNE A,#'A',LOOP1

PUSH DPH

PUSH DPL

MOV DPTR,#20A0H

POP ACC

MOVX @DPTR,A

INC DPTR

POP ACC

MOVX @DPTR,A

RET

LOOP1:

INC DPTR

DJNZ R2,LOOP

RET

以上就是关于MCS-51单片机查表程序的问题全部的内容,包括:MCS-51单片机查表程序的问题、4-5 用查表程序求0~8之间整数的立方。(用汇编语言)、微机原理实验箱的电子琴设计,利用8254,8255等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9520394.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存