资源描述
. . . .
5.2 74HC595输出
简介:
SHCP:移位寄存器
STCP:存储器
DS:串行数据输入
先将需要显示的代码的第8位(最高位)发送到DS,接着,shcp来一次上跳沿操作。从高到低发送完8次以后,有一次stcp上跳沿操作,即完成数据发送。
注意:LED数码管显示采用共阴极显示。
1.简单显示
图5.2:74HC595显示(1)
(1)汇编:
ORG 0000H
MOV A,#6 //“1”LED模型共阴极显示
MOV R0,#8 //循环次数
MAIN:
RLC A //带进位左环移
MOV P2.1,C //赋值
CLR P2.0
NOP
NOP
SETB P2.0 //方波,上升沿有效
DJNZ R0,MAIN //减一不为零跳转
CLR P2.2
NOP
NOP
SETB P2.2 //方波,上升沿有效
END
(2)C语言:
#include<reg51.h> //51头文件
#include<intrins.h>//“空指令”头文件
sbit shcp=P2^0;
sbit ds=P2^1;
sbit stcp=P2^2; //管脚定义
void led()
{
int i,a=0x06;//a位显示模型,共阴极显示
for(i=0;i<8;i++)
{
ds=(a<<i)&0x80;//位
shcp=0;
_nop_();
_nop_();
shcp=1; //上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1; //上升沿有效
}
void main()
{
led();
while(1);
}
2.显示数字
图5.3:74HC595显示(2)
(1)汇编
ORG 0000H
//----主函数-------
MAIN:
CALL M1
CALL M2
CALL M3
CALL M4
SJMP MAIN
//--------显示1------
M1:
MOV A,#06H //赋值
CALL DISPLAY //调用显示子函数
CLR P3.4 //打开共阴极管脚
CALL DELAY //延时
SETB P3.4 //关闭该管脚
RET //返回
//-------显示2-------
M2:
MOV A,#5BH
CALL DISPLAY
CLR P3.5
CALL DELAY
SETB P3.5
RET
//---------显示3-----
M3:
MOV A,#4FH
CALL DISPLAY
CLR P3.6
CALL DELAY
SETB P3.6
RET
//------显示4--------
M4:
MOV A,#66H
CALL DISPLAY
CLR P3.7
CALL DELAY
SETB P3.7
RET
//------显示子函数--------
DISPLAY: //(共阴极显示)
MOV R1,#8 //循环次数
LOOP1:
RLC A //带进位左环移
MOV P2.1,C //赋值
CLR P2.0
NOP
NOP
SETB P2.0 //方波,上升沿有效
DJNZ R1,LOOP1 //减一不为零跳转
CLR P2.2
NOP
NOP
SETB P2.2 //方波,上升沿有效
RET
//-------延时子函数--------
DELAY:
MOV R2,#2 //(大调)修改R2值,改变延时长短
D2:
MOV R3,#10 //中等
D3:
MOV R4,#0 //微调延时大小
D4:
NOP
DJNZ R4,D4
DJNZ R3,D3
DJNZ R2,D2
RET
END
(2)C语言
#include<reg51.h> //51头文件
#include<intrins.h>//“空指令”头文件
sbit shcp=P2^0;
sbit ds=P2^1;
sbit stcp=P2^2; //管脚定义
sbit a=P3^4;
sbit b=P3^5;
sbit c=P3^6;
sbit d=P3^7;
//-----延时子程序------
void delay(int i) //延时大小与i有关
{
int j;
while(i--)
for(j=255;j>0;j--)
;
}
//-----LED显示子程序------
void led(int j) //共阴极显示
{
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int i;
for(i=0;i<8;i++)
{
ds=(num[j]<<i)&0x80;//位
shcp=0;
_nop_();
_nop_();
shcp=1; //上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1; //上升沿有效
}
//---主程序-------
void main()
{
int n=1234;//选择需要显示的数值
int n1,n2,n3,n4,i=0;
n1=n/1000;//千位
n2=n/100%10;//百位
n3=n/10%10; //十位
n4=n%10; //个位
while(1)
{
switch(i++)//选择
{
case 0:led(n1);a=0;break;//显示千位,打开控制
case 1:led(n2);b=0;break;//显示百位,打开控制
case 2:led(n3);c=0;break;//显示十位,打开控制
case 3:led(n4);d=0;break;//显示个位,打开控制
}
if(i==4)
i=0; //满四次后,从新扫描数码管
delay(1); //延时
a=b=c=d=1; //关闭全部管脚
}
}
3.循环显示
图5.4:74HC595显示(3)
图5.5:74HC595显示(4)
图5.6:74HC595显示(5)
循环显示0~F。
(1)汇编:
ORG 0000H
//----主函数-------
MAIN:
MOV R0,#16 //循环次数(显示16次:0~F)
MOV DPTR,#TAB
LOOP: //循环显示0~F
MOVC A,A+DPTR //查表
CALL DISPLAY
CALL DELAY
INC DPTR
CLR A //清空A容
DJNZ R0,LOOP //减一不为零跳转
SJMP MAIN
//------显示子函数--------
DISPLAY: //(共阴极显示)
MOV R1,#8 //循环次数
LOOP1:
RLC A //带进位左环移
MOV P2.1,C //赋值
CLR P2.0
NOP
NOP
SETB P2.0 //方波,上升沿有效
DJNZ R1,LOOP1 //减一不为零跳转
CLR P2.2
NOP
NOP
SETB P2.2 //方波,上升沿有效
RET
//-------延时子函数--------
DELAY:
MOV R2,#2 //(大调)修改R2值,改变延时长短
D2:
MOV R3,#0 //中等
D3:
MOV R4,#0 //微调延时大小
D4:
NOP
DJNZ R4,D4
DJNZ R3,D3
DJNZ R2,D2
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
(2)C语言
#include<reg51.h> //51头文件
#include<intrins.h>//“空指令”头文件
sbit shcp=P2^0;
sbit ds=P2^1;
sbit stcp=P2^2; //管脚定义
//-----延时子程序------
void delay(int i) //延时大小与i有关
{
int j;
while(i--)
for(j=255;j>0;j--)
;
}
//-----LED显示子程序------
void led()
{
int num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
static int j=0;
int i;
for(i=0;i<8;i++)
{
ds=(num[j]<<i)&0x80;//位
shcp=0;
_nop_();
_nop_();
shcp=1; //上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1; //上升沿有效
j++;
if(j==16)
j=0; //满16后,从新计次
}
//---主程序-------
void main()
{
while(1) //循环
{
led();
delay(100);
}
}
10 / 10
展开阅读全文