|
本帖最后由 bg9gas 于 2012-9-6 09:28 编辑
如题。
就是想把PLL的2AH 2BH 2CH 的三个值显示到1602LCD上,刚开始学习汇编,PLL驱动是别人帮我写的,自己加的1602驱动,只会把PLL 的值以16进制显示到LCD上。那位大侠有程序的话给小弟一份,谢谢!
附原代码
;设置参考时钟 单位 khz
MB1151_FOSC EQU 12800 ; EQU 赋值指令
;**********************
;设置通讯口
MB1511_DATA BIT P3.5 ; BIT 位地址定义伪指令
MB1511_CLOCK BIT P3.6
MB1511_LE BIT P3.7
;89C51引脚定义
LCD_RS BIT P1.0
LCD_RW BIT P1.1
LCD_E BIT P1.2
LCD_DATA EQU P0
;内部变量设置
;参数N
MB1151_N_H DATA 25H ; 指定内存 可位寻址内存
MB1151_N_L DATA 26H
;参数A
MB1151_A DATA 27H
;参数R
MB1151_R_H DATA 30H
MB1151_R_L DATA 31H
;参数M
MB1151_M DATA 24H
;VCO压控振荡器的频率 单位 KHZ
MB1151_FVCO_H DATA 2AH
MB1151_FVCO_M DATA 2BH
MB1151_FVCO_L DATA 2CH
;步进频率 单位KHZ
MB1151_FSTEPPER DATA 32H
;临时变量
BUFF_1 DATA 3AH
BUFF_2 DATA 3BH
BUFF_3 DATA 3CH
;H转换ASCII 临时变量缓冲
BUFF_4 DATA 4AH
BUFF_5 DATA 4BH
; MB1151_FOSC_H DATA 2DH
; MB1151_FOSC_L DATA 2EH
ORG 0000H ;主程序开始
AJMP STAR
ORG 0003H ;外中断0
RETI
ORG 000BH ;定时器0
RETI
ORG 0013H ;外中断1
RETI
ORG 001BH ;定时器1
RETI
ORG 0023H ;串口
RETI
ORG 002BH
RETI
ORG 0030H
STAR:
CLR EA
MOV SP,#50H
LCALL MB1511_INITIAL ;初始化MB1511
ACALL LCD_INITIAL
;改变频率并显示
ACALL DISP
SJMP $
;LCD 显示子程序 入口条件A
DISP:
LCALL CLS
CLR A
MOV A,#10000000B
LCALL WRITE_COM
MOV A,#41H
LCALL WRITE_DATA
;16进制数转10进制再转为ASCII码 发送AB到lcd。
MOV A,MB1151_FVCO_H
ACALL HASC
MOV A,BUFF_4
LCALL WRITE_DATA
MOV A,BUFF_5
ACALL WRITE_DATA
MOV A,MB1151_FVCO_M
ACALL HASC
MOV A,BUFF_4
LCALL WRITE_DATA
MOV A,BUFF_5
ACALL WRITE_DATA
MOV A,MB1151_FVCO_L
ACALL HASC
MOV A,BUFF_4
LCALL WRITE_DATA
MOV A,BUFF_5
ACALL WRITE_DATA
RET
;入口条件:待转换的单字节十六进制数在累加器A中。
;出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。
;影响资源:PSW、A、B 堆栈需求: 4字节
HASC: MOV B,A
LCALL HAS1
XCH A,B
SWAP A
HAS1: ANL A,#0FH
ADD A,#90H
DA A
ADDC A,#40H
DA A
MOV BUFF_4,A
MOV BUFF_5,B
RET
;****** 启动LCM子程序******
LCD_INITIAL: CLR A
MOV A,#00111000B
LCALL WRITE_COM
MOV A,#00001100B
LCALL WRITE_COM
MOV A,#00000110B
LCALL WRITE_COM
RET
;******查询忙碌标志信号子程序******
CHECK_BUSY: PUSH ACC
BUSY_LOOP: CLR LCD_E
SETB LCD_RW
CLR LCD_RS
SETB LCD_E
MOV A, LCD_DATA
CLR LCD_E
JB ACC.7,BUSY_LOOP
POP ACC
LCALL DEL
RET
;****** 写指令到LCM子程序******
WRITE_COM: LCALL CHECK_BUSY
CLR LCD_E
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
MOV LCD_DATA,A
CLR LCD_E
RET
;****** 写数据到LCM子程序******
WRITE_DATA: LCALL CHECK_BUSY
CLR LCD_E
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
MOV LCD_DATA,A
CLR LCD_E
RET
;*******清除LCM子程序*******
CLS: MOV A,#00000001B
LCALL WRITE_COM
RET
;****延时子程序****::::2.7ms
DEL: MOV R6,#5
L1: MOV R7,#248
DJNZ R7,$
DJNZ R6,L1
RET
;********************
;初始化MB1511
;初始频率150000khz ===换算147970-21.4=126570 为十六制1ee6a H;01 M;EE L;6A
;步进频率 1khz
;
MB1511_INITIAL:
CLR MB1511_CLOCK;
CLR MB1511_DATA;
CLR MB1511_LE;
;压控振荡器输出频率 khz 为单位
MOV MB1151_FVCO_H,#01H
MOV MB1151_FVCO_M,#0EEH
MOV MB1151_FVCO_L,#6AH
;步进频率 单位 khz
;要确保参考频率是步进频率的整数倍
;最大255 255khz
MOV MB1151_FSTEPPER,#1;
;预分配比例 64或128
MOV MB1151_M,#128;
LCALL SET_FVCO;
LCALL SET_STEPPER;
RET
;设置压控振荡器频率
;单位 khz
;接口参数
;MB1151_FVCO_H
;MB1151_FVCO_M
;MB1151_FVCO_L
SET_FVCO:
LCALL mb1511_calculate_n_a;计算频率数据
LCALL send_pd_data;将频率数据写入芯片
RET
;改变步进频率
;接口参数
;MB1151_FSTEPPER
;单位 khz
SET_STEPPER:
LCALL mb1511_calculate_r;计算步进频率
LCALL send_prd_data;写入步进频率
LCALL SET_FVCO ;改变步进后重新计算并写入频率
RET
;发送分频器数据到MB1151 A N
send_pd_data:
MOV BUFF_1,MB1151_N_H
MOV BUFF_2,MB1151_N_L
MOV R3,#5
SP1: CLR C
MOV A,BUFF_2
RLC A
MOV BUFF_2,A
MOV A,BUFF_1
RLC A
MOV BUFF_1,A
DJNZ R3,SP1;
MOV R3,#6
MOV R0,#0
MOV R1,MB1151_A
SP2: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
DJNZ R3,SP2;
;ORL R1,#0010000B;CONTROL BIT
MOV A,BUFF_2
ORL A,R0 ;SW 64
MOV BUFF_2,A
MOV BUFF_3,R1 ;SW 64
MOV R1,#19;要发送数据的长度 单位是位
MOV R0,#BUFF_1;要发送数据的地址
LCALL send_mb1511_data;
RET
;发送参考分频器数据到MB1151 R
send_prd_data:
MOV BUFF_1,MB1151_R_H
MOV BUFF_2,MB1151_R_L
MOV A,MB1151_M
CJNE A,#64,SPD1
ORL BUFF_1,#01000000B ;SW 64
SJMP SPD2
SPD1: ANL BUFF_1,#10111111B ;SW 128
SPD2:
CLR C
MOV A,BUFF_2;左移一位
RLC A
MOV BUFF_2,A
MOV A,BUFF_1
RLC A
MOV BUFF_1,A;加入控制位
ORL BUFF_2,#00000001B;CONTROL BIT
MOV R1,#16;要发送数据的长度 单位是位
MOV R0,#BUFF_1;要发送数据的地址
LCALL send_mb1511_data;
RET
;*******************************
;计算参考参考振荡器预分频比例 R
;根据参考振荡器频率和步进频率来计算
;参数
;R3 参考频率高
;R4 参考频率低
;R7 步进频率
;
mb1511_calculate_r:
;R = Fosc / FSTEPPER
MOV R2,#0;
MOV R3,#HIGH MB1151_FOSC
MOV R4,#LOW MB1151_FOSC
MOV R7,MB1151_FSTEPPER;
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
LCALL NDIV31;
MOV MB1151_R_H,R3;
MOV MB1151_R_L,R4;
RET
;计算可编程分频器 N 和吸收脉冲分配器 A
;根据与分频比例 M
;参考参考振荡器预分频比例 R
;压控振荡器输出频率 Fvco
;计算出 N 和 A
mb1511_calculate_n_a:
;X = Fvco/(fosc/R)
MOV R2,MB1151_FVCO_H;
MOV R3,MB1151_FVCO_M;
MOV R4,MB1151_FVCO_L;
MOV R5,#0;
MOV R7,MB1151_FSTEPPER;FSTEPPER = (fosc/R)
MOV R6,#0;
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
LCALL NDIV31;
MOV BUFF_1,R2
MOV BUFF_2,R3
MOV BUFF_3,R4
;************************
;N = X / M
MOV R7,MB1151_M;
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
LCALL NDIV31;
;************************
;M * N
MOV MB1151_N_H,R3;
MOV MB1151_N_L,R4;
MOV R7,MB1151_M;
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
LCALL NMUL21;
;************************
;A = X - M*N
MOV A,R2;
MOV R5,A;
MOV A,R3;
MOV R6,A;
MOV A,R4;
MOV R7,A;
MOV R2,BUFF_1
MOV R3,BUFF_2
MOV R4,BUFF_3
;三字节无符号数减法程序 (R2R3R4-R5R6R7)=(R2R3R4)
LCALL NSUB3;
MOV MB1151_A,R4;
RET;
;***********************************
;串行发送数据到MB1511
;接口参数
;发送数据的长度 R1 以bit为单位
;发送数据的地址 @R0 向上增长
;使用了 A,B,R1,R0,R5,R6,R4
;***********************************
send_mb1511_data:
CLR MB1511_CLOCK;时钟引脚低
CLR MB1511_LE;锁定引脚低
MOV A,R1;//因为每次最多发送一字节数据所以将长度分解成 字节+剩下的位数
MOV B,#8;
DIV AB;
MOV R5,A;R5存放字节数
MOV R6,B;R6存放剩下的位数
JZ SMD1;如果要发送的数据少于一字节则跳转到SMD1处
SMD_LOOP1: MOV A,@R0;//循环发送R5个字节的数据
MOV R4,#8;
LCALL send_byte;
INC R0;
DJNZ R5,SMD_LOOP1;
SMD1: MOV A,R6;//判断是否有剩下的位要发送,没有则跳转
JZ SMD2;
MOV R4,A;//发送剩下的位
MOV A,@R0;
LCALL send_byte;
SMD2: SETB MB1511_LE;//产生锁定上跳变
NOP
NOP
NOP
NOP
CLR MB1511_LE;
RET;
;**********************************
;串行发送一字节数据 可以少与一字节
;从高位开始发送
;R4 要发送多少位
;A 要发送的数据
;**********************************
send_byte:
CLR C
SB_LOOP1:
RLC A; 右移数据
MOV MB1511_DATA,C;
NOP
NOP
NOP
NOP
SETB MB1511_CLOCK;时钟引脚产生上跳变
NOP
NOP
NOP
NOP
CLR MB1511_CLOCK;
DJNZ R4,SB_LOOP1;判断数据是否发送完成,不完成则跳到SB_LOOP1处发送下一位
RET;
;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
;入口: R2,R3,R4,R7
;占用资源: ACC,B,F0
;堆栈需求: 3字节
;出口: (R2),R3,R4,R7,OV
NDIV31 : MOV A,R2
MOV B,R7
DIV AB
PUSH ACC;
MOV R2,B
MOV B,#10H
NDV311 : CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,R7
JB F0,NDV312
JC NDV313
NDV312 : MOV R2,A
INC R4
NDV313 : DJNZ B,NDV311
POP ACC;
CLR OV
JZ NDV314
SETB OV
NDV314 : XCH A,R2
MOV R7,A
RET
;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口: R3,R4,R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R2,R3,R4
NMUL21 : MOV A,R4
MOV B,R7
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
CLR OV
RET
;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;占用资源: ACC
;堆栈需求: 2字节
;出口: R3,R4
NSUB : MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
RET
;三字节无符号数减法程序 (R2R3R4-R5R6R7)=(R2R3R4)
;入口: R2,R3,R4,R5,R6,R7
;占用资源: ACC
;堆栈需求: 2字节
;出口: R2,R3,R4
NSUB3 : MOV A,R4
CLR C
SUBB A,R7
MOV R4,A
MOV A,R3
SUBB A,R6
MOV R3,A
MOV A,R2
SUBB A,R5
MOV R2,A
RET
END |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|