9.1 6位静态显示模块与原理图

9.2 静态模块显示原理
根据CD4094驱动原理,我们用一个CD4094驱动一个LED,然后串联起来,如果显示6个数据,我们先一次性发送6个数据给CD4094,然后置位显示即可。
9.3 静态模块显示头文件DIS.h
//----------------------------------------------------------
//启蒙电子:http://www.51c51.net
//QQ:501501561 502502562
//E-Mail:atc51@163.com 501501561@163.com
//----------------------------------------------------------
//程序设计:豆豆
//适用型号:DG3000综合开发试验仪
//----------------------------------------------------------
//----------------------------------------------------------
//程序作用:静态显示头文件DIS.h
//----------------------------------------------------------
//----------------------------------------------------------
#ifndef _display_
#define _display_
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//显示与单片机接口
sbit DIS_STB=P2^5;
sbit DIS_CLK=P2^7;
sbit DIS_SDA=P2^6;
//关闭显示
#define shut_dis() DIS_STB=1;
#define shut_bit() 0xff;
//0~9
unsigned char code led[18]={0x81,0xb7,0xc2,0x92,0xb4,0x98,0x88,0xb3,0x80,0x90,
0xa0,0x8c,0xc9,0x86,0xc8,0xe8};//abcdef
/*子程序*/
void delay(unsigned int k); //延时子程序
void send(unsigned char a); //串入并出子程序
void display(uchar display_buffer[4]); //数码管显示子程序
//延时程序
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<100;j++);
}
//串入并出发送数据子程序
void send(unsigned char a)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(_crol_(a,i)&0x80)
DIS_SDA=1;
else
DIS_SDA=0;
DIS_CLK=0;
DIS_CLK=1;
}
}
//----------------------------------------------------------
//启蒙电子:http://www.51c51.net
//QQ:501501561 502502562
//E-Mail:atc51@163.com 501501561@163.com
//----------------------------------------------------------
//数码管显示子程序
void display(uchar display_buffer[6])
{ uchar i,k;
DIS_STB=0;
for(i=0;i<6;i++)
{
k=led[display_buffer[i]];
send(k);
delay(0x01);
}
DIS_STB=1;
}
#endif
9.4静态模块显示程序012345 (C51)
//6 bit 数码管静态驱动显示程序:012345
#include<REG52.h>
#include<DIS.h>
main()
{
unsigned char rt[6]={0x00,0x01,0x02,0x03,0x04,0x05};//显示数据缓冲区
while(1)
{
display(rt);
}
9.4静态模块显示程序012345 (汇编)
;----------------------------------------------------------
;程序作用:6位数码管静态显示012345(汇编)
;----------------------------------------------------------
DSTB BIT P2.5;CD4094与单片机的接口
DCLK BIT P2.7
DDATA BIT P2.6
DBUF DATA 40H ;显示缓冲区首址
;------------------------------------------------------
ORG 0000H
JMP MAIN
;------------------------------------------------------
MAIN: MOV SP,#60H
MOV R0,#0FFH;单元清零
RES1: MOV @R0,#0
DJNZ R0,RES1
MOV DBUF,#00H;要显示的数据
MOV DBUF+1,#01H
MOV DBUF+2,#02H
MOV DBUF+3,#03H
MOV DBUF+4,#04H
MOV DBUF+5,#05H
LOOP1:
CALL DIRS
JMP LOOP1
DELAY: ;延时R5×10MS
MOV R6,#50
DELAY1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
DJNZ R5,DELAY
RET
;-----------------------------------------------------
KEYTABLE:
DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码
DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9,
DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E,
DB 077H,0FFH ;F 0FF为结束码
;-----------------------------------------------------
;键值显示子程序
;使用一个数码管显示
;-----------------------------------------------------
DIRS:
CLR DSTB
;开始送数据
MOV A,DBUF
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
MOV A,DBUF+1
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
MOV A,DBUF+2
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
MOV A,DBUF+3
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
MOV A,DBUF+4
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
MOV A,DBUF+5
MOV DPTR,#DISPLAY_CODE
MOVC A,@A+DPTR
LCALL TRT
SETB DSTB
RET
DISPLAY_CODE:
DB 81H,0B7H,0C2H,92H ;0,1,2.3
DB 0B4H,98H,88H,0B3H ;4,5,6,7
DB 80H,90H,0A0H,08Ch ;8,9,a,b
DB 0C9H,86H,0C8h,0E8h ;c,d,e,f
RET
;----------------------------------------
TRT:
MOV R3,#08H
TRT1: CLR DCLK
RLC A
MOV DDATA,C
LCALL MS30
SETB DCLK
LCALL MS30
DJNZ R3,TRT1
LCALL MS30
RET
;-------------------------
;延时
;------------------------
MS30: MOV R7,#0FH
MS31: MOV R6,#0FH;
MS32: DJNZ R6,MS32
DJNZ R7,MS31
RET
;-----------------------------
END
|