二、实际应用 8位数码管循环移位显示 电路图如上:Q1~Q7接数码管段 b...b
二、实际应用
8位数码管循环移位显示
电路图如上:Q1~Q7接数码管段码 、P0.0
接SER 、P0.1接SCK、P0.2接RCK、P0.3
接/G
;===============================================================
SDATA_595 EQU P0.0 ;串行数据输
入
SCLK_595 EQU P0.1 ;移位时钟脉
冲
RCK_595 EQU P0.2 ;输出锁存器
控制脉冲
LS138_G1 EQU P0.3 ;使能端
LS138_A EQU P0.4 ;
LS138_B EQU P0.5 ;
LS138_C EQU P0.6 ;
;=====================================================
ORG 0000H
LJMP MAIN
ORG 0030H
;=====================================================
MAIN:
MOV SP,#60H
MOV P0,#00H
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R0,#30H ;初始化寄
存器
MOV R1,#00H
MOV R2,#00H
MOV 30H,#01H ;显示数据
MOV 31H,#02H
MOV 32H,#03H
MOV 33H,#04H
MOV 34H,#05H
MOV 35H,#06H
MOV 36H,#07H
MOV 37H,#08H
CLR LS138_G1 ;禁止
74LS138使能
MOV R5,#7FH MAIN1:
LCALL DISPLAY
DJNZ R5,MAIN1
MOV A,30H ;数据交换
XCH A,31H
XCH A,32H
XCH A,33H
XCH A,34H
XCH A,35H
XCH A,36H
XCH A,37H
XCH A,30H
MOV R5,#7FH
JMP MAIN1
;=============================================================
;显示子程序
;=============================================================
DISPLAY:
MOV A,@R0 ;查表取
显示数据
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
LCALL WR_595 ;移位
寄存器接收数据
CLR LS138_G1 ;关闭显
示
LCALL OUT_595 ;将数
据送到输出锁存器
NOP
NOP
MOV A,P0 ;读P0状态
ANL A,#0FH ;维持低4
位状态
ADD A,R2 ;确定显示
位
MOV P0,A ;送显示位
SETB LS138_G1 ;开显示
INC R0 ;取下一位显
示数据
INC R1 ;
MOV A,R1 ;修改显示
位
SWAP A ;高、低四位
数据交换
MOV R2,A ;确定下一
个显示位
LCALL DELAY ;延时
CJNE R1,#09H,DISPLAY ;8
个数码管是否显示完毕,
MOV R0,#30H ;重新初
始化寄存器
MOV R1,#00H
MOV R2,#00H
RET
;=============================================================
;输出锁存器输出数据子程序
;============================================================= OUT_595:
CLR RCK_595
NOP
NOP
SETB RCK_595 ;上升沿将数
据送到输出锁存器
NOP
NOP
NOP
CLR RCK_595
RET
;=============================================================
;移位寄存器接收数据子程序
;============================================================= WR_595:
MOV R4,#08H
OOP: WR_L
RLC A
MOV SDATA_595,C
SETB SCLK_595 ;上升沿发生
移位
NOP
NOP
CLR SCLK_595
DJNZ R4,WR_LOOP
RET
;=============================================================
;延时子程序
;=============================================================
DELAY:
MOV R6,#02H
DEL1:
MOV R7,#200
DJNZ R7,$
DJNZ R6,DEL1
RET
;=============================================================
TAB_NU:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
;=============================================================
END
74HC595 数码管显示程序
,i nclude
#define uchar unsigned char
uchar code seg[10]={0xC0,0xf9,0xa4,0xb
0,0x99,0x92,0x82,0xf8,0x80,0x90}; sbit SER=P0^4; //595串行数据输入 sbit SCK=P0^5; //595移位时钟 sbit RCK=P0^7; //595数据输出脉冲 sbit SQH=P0^6; //595串行数据输出 sbit gewei=P2^7; //595数码管个位选通 sbit shiwei=P2^6; //595数码管十位选通
sbit power=P1^7; //
void IN595(uchar segdata) //输入一字节数码管数据进595
{
uchar i,temp;
temp=seg[segdata];
RCK=0;
for(i=0;i<8;i++) //循环移入8位数据,
{
SCK=0;
SER=temp&0x80; // 取数码的最高位
temp=temp<<1;
SCK=1; //上升沿把一位数据移入595
}
//由于电路不是我的,有点不合理,这时在最低位QA的对应的是数码管右下角的点的管脚,所以需要再移一位,以使数码管右下角的点能正确显示
//
SCK=0;
SER=seg[segdata]&0x80;
SCK=1;
RCK=1; //上升沿把8位数据并行输出 }
void show(uchar showdata)
{
uchar i,j;
i=showdata/10;
j=showdata%10;
IN595(i); //移入十位数据
gewei=1; //关个位
shiwei=0; //选通十位数码管
//delay(); //不用加延时了,因为显示数据串入595已经要一段的时间了
IN595(j); //移入个位数据
shiwei=1; //关十位
gewei=0; //选通个位数码管 }
void main() //测试。。。。。。。。。。。。。。。。 {
power=1; //
while(1)
{
show(58);
}
}