单片机编程题: 程序存储2000H存0至9平方,用两种查表法求9的平方

如题所述

第1个回答  2011-06-11
;八个二极管是共阳极接在p1口上,晶振的频率是12MHZ。
;要使二极管亮对应的端口为低电平即0。
;将所有二极管的亮灭情况用十六进制数表示出来放在rom中的02ch开始的八个字节中。
;通过T0延时0.1s,然后在中断服务子程序中设置第二层循环次数为10来增加延时。
;R0:R0的值赋给P1口,然后P1口上的相应的二极管被点亮
;R1:定时标志位。R1=xH表示还有x个0.1s才到1s。
;R2:查表子程序中的相对偏移量。
;C:延时标志位。C=1表示预定的时间到(这里预定的是1s,这里的1s与C=1那个1不是同一个1)。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP IT0P ;中断服务子程序
ORG 002CH
TAB: DB 0FAH,0F5H,0AFH,05FH,0AAH,055H,0FFH
MAIN: LCALL INITIALIZE ;调用main函数的初始化子程序
NEXT: CJNE R3,#1H,$ ;延时1S
MOV R3,#0H
LCALL SEARCH ;查表
MOV A,R0
MOV P1,A ;点亮二极管
CJNE R0,#0FFH,NEXT ;是否完成一轮
MOV R3,#0H ;延时1s
LJMP MAIN ;重复下一轮
;函数INITIALIZE的功能是:初始化
INITIALIZE: MOV SP,#30H ;保护工作寄存器组
MOV TMOD,#01H ;只使用T0,T0工作在方式1,T0用作定时器,定时0.1S
LCALL IT0IN ;初始化T0
MOV R3,#0H
MOV R1,#0AH
MOV R2,#0H
RET
;函数IT0IN的功能是:T0的初始化子程序
IT0IN: MOV TL0,#0B0H
MOV TH0,#03CH ;给T0赋初值
SETB TR0 ;启动T0
SETB ET0 ;允许T0中断
SETB EA ;cpu开中断
RET
;函数IT0P是中断服务子程序
IT0P: MOV TL0,#0B0H
MOV TH0,#03CH ;给T0赋初值
DJNZ R1,RETIT0P
MOV R1,#0AH
MOV R3,#1H
RETIT0P: RETI
;函数SEARCH是查表函数
SEARCH: MOV DPTR,#TAB
MOV A,R2
MOVC A,@A+DPTR
MOV R0,A ;改变R0
INC R2
RET
END

第二个版本(其实这个在2007年都有了,我添上了注释)
;8个二极管接在P1口上,共阴解法。
;R0:查表中的相对偏移量
;R1:延时标志位。R1=0则说明预定的延时到了。
ORG 0000H
AJMP START
ORG 001BH
AJMP INT_T1
ORG 0100H
START:
MOV SP,#60H ;保护工作寄存器区
MOV TMOD,#10H ;只用T1,T1工作在方式1
MOV TL1,#0B0H
MOV TH1,#3CH ;给T1赋初值,T1=03CB0H
MOV R0,#00H
MOV R1,#20
SETB TR1
SETB ET1
SETB EA
SJMP $
INT_T1:
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1 ;关闭定时器T1
MOV TL1,#0B0H
MOV TH1,#3CH ;给T1赋初值,T1=03CB0H
SETB TR1 ;开启定时器T1
DJNZ R1,EXIT
MOV R1,#20
MOV DPTR,#DATAA
MOV A,R0
MOVC A,@A+DPTR ;查表
MOV P1,A ;点亮二极管
INC R0 ;相对偏移量R0向后移动
ANL 00,#07H
EXIT:
POP DPH
POP DPL
POP PSW
POP ACC
RETI
DATAA: DB 05H,0AH,50H,0A0H,55H,0AAH,0FFH,00H
END
这个程序参考了:

追问

我问的是两种查表法,你什么啊?

本回答被提问者采纳
相似回答