第4章 系统软件设计
MOV A,#11 MOV @R0,A DEC R0
DJNZ R2,LOOP_CLR
;==================================== ;取表找相应显示代码 DISCD:
MOV R0,#DATA_ADDR;
MOV R1,#DISPLAY_DATA_ADDR; MOV R2,#6; MOV DPTR,#TAB
DILP: MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A INC R0 INC R1 DJNZ R2,DILP
;=======================================
;重新计数 CLR A
MOV TIMES_50MS,A MOV COUNTER_BUF_L,A MOV COUNTER_BUF_H,A
28
第4章 系统软件设计
JMP MAIN
TAB: ;/显示码码表/
DB 3FH,06H,5BH,4FH,66H; DB 6DH,7DH,07H,7FH,6FH,0FFH;
2、数码转化程序:在本次设计中,单片机计数器所计得的数是二进制,以十六进制数的形式存放在寄存器中,而我们需要显示的是十进制数的频率,因此需要进行转化才能显示。
数码转化程序设计的原理:本次设计的单片机数码转换是通过单片机的移位乘二特性和单片机的十进制调整功能来实现的。先把双字节的十六进制数转换为8421BCD码,在控制显示的时候通过位调整就可以得到计数所得频率的十进制数据,供给显示。其具体的转换程序如下。?5?
;****************************************************************** ; ------------------------------- 16进制转10进制 ---------------------------------------- ;****************************************************************** ;双字节十六进制整数转换成双字节BCD码整数 ;入口条件:待转换的双字节十六进制整数在R6、R7中。 ;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。 ;影响资源:PSW、A、R2~R7 堆栈需求: 2字节 CHANGE16_10:
CLR A ;BCD码初始化 MOV R3, A MOV R4, A MOV R5, A
MOV R2, #10H ;转换双字节十六进制整数
29
第4章 系统软件设计
CHANG_1:
MOV A, R7 ;从高端移出待转换数的一位到CY中 RLC A MOV R7, A MOV A, R6 RLC A MOV R6, A
MOV A, R5 ;BCD码带进位自身相加,相当于乘2 ADDC A, R5
DA A ;十进制调整 MOV R5, A MOV A, R4 ADDC A, R4 DA A MOV R4, A MOV A, R3 ADDC A, R3
MOV R3, A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2, CHANG_1 ;处理完16bit RET
3、数码显示程序:单片机控制其内部计数器得到的数据要送到8位数码显示管中显示出来,才能被我们所看到,直接得到我们所测量的频率。?6?
我们本次设计所采用的是数码管静态显示,所以我们要把数据循环的送入数
30
第4章 系统软件设计
码管显示。因为我们经过转换程序把所得的数据存储在40H~45H中,因此,数码显示的基本原理就是把40H~45H中的数据分时的通过P1口送到数码管,再通过74LS138来控制各个数码管的亮和灭。对于控制,我们在控制软件里。其流程图如图4-3所示。
返回主程序 否 否 判断显示位数是否大于6 是 把显示位数清零 计算当前要显示的位数,取得地址 灭LED灯 是 判断显示位数是否为6 开始 取数显示
图4-2 数码显示流程图
由此,可以写出显示程序如下:
;****************************************************************** ; ------------------------------- 显示子程序 -------------------------------
;**************************************************************** DISPLAY0:
MOV A,COUNTER_DISPLAY;
31
第4章 系统软件设计
CJNE A,#6,DISPLAY1
JMP DISPLAY2;/当前显示位数等于6/ DISPLAY1:
JNC DISPLAY2;/当前显示位数大于6/ JMP DISPLAY3 DISPLAY2: CLR A
MOV COUNTER_DISPLAY,A;/当前显示位数大于等于6,清零/ DISPLAY3:
MOV A,#0FFH
MOV PORT_LED,A;/变换数据前先灭LED,以消除闪动/
MOV A,COUNTER_DISPLAY MOV PORT_LED_138,A
MOV R1,#DISPLAY_DATA_ADDR
ADD A,#DISPLAY_DATA_ADDR;/计算当前要显示数据的地址,初始地址+相应位数/
MOV R1,A
MOV A,@R1;/取出要显示的相应位的数据/ MOV PORT_LED,A;/送出显示数据/ MOV A,COUNTER_DISPLAY INC A
MOV COUNTER_DISPLAY,A;/显示位加1/ RETI
32