74HC595编程与PROTEUS仿真.docx
《74HC595编程与PROTEUS仿真.docx》由会员分享,可在线阅读,更多相关《74HC595编程与PROTEUS仿真.docx(13页珍藏版)》请在冰豆网上搜索。
74HC595编程与PROTEUS仿真
5.274HC595输出
简介:
SHCP:
移位寄存器
STCP:
存储器
DS:
串行数据输入
先将需要显示的代码的第8位(最高位)发送到DS,接着,shcp来一次上跳沿操作。
从高到低发送完8次以后,有一次stcp上跳沿操作,即完成数据发送。
注意:
LED数码管显示采用共阴极显示。
1.简单显示
图5.2:
74HC595显示
(1)
(1)汇编:
ORG0000H
MOVA,#6//“1”LED模型共阴极显示
MOVR0,#8//循环次数
MAIN:
RLCA//带进位左环移
MOVP2.1,C//赋值
CLRP2.0
NOP
NOP
SETBP2.0//方波,上升沿有效
DJNZR0,MAIN//减一不为零跳转
CLRP2.2
NOP
NOP
SETBP2.2//方波,上升沿有效
END
(2)C语言:
#include//51头文件
#include//“空指令”头文件
sbitshcp=P2^0;
sbitds=P2^1;
sbitstcp=P2^2;//管脚定义
voidled()
{
inti,a=0x06;//a位显示模型,共阴极显示
for(i=0;i<8;i++)
{
ds=(a<
shcp=0;
_nop_();
_nop_();
shcp=1;//上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1;//上升沿有效
}
voidmain()
{
led();
while
(1);
}
2.显示数字
图5.3:
74HC595显示
(2)
(1)汇编
ORG0000H
//----主函数-------
MAIN:
CALLM1
CALLM2
CALLM3
CALLM4
SJMPMAIN
//--------显示1------
M1:
MOVA,#06H//赋值
CALLDISPLAY//调用显示子函数
CLRP3.4//打开共阴极管脚
CALLDELAY//延时
SETBP3.4//关闭该管脚
RET//返回
//-------显示2-------
M2:
MOVA,#5BH
CALLDISPLAY
CLRP3.5
CALLDELAY
SETBP3.5
RET
//---------显示3-----
M3:
MOVA,#4FH
CALLDISPLAY
CLRP3.6
CALLDELAY
SETBP3.6
RET
//------显示4--------
M4:
MOVA,#66H
CALLDISPLAY
CLRP3.7
CALLDELAY
SETBP3.7
RET
//------显示子函数--------
DISPLAY:
//(共阴极显示)
MOVR1,#8//循环次数
LOOP1:
RLCA//带进位左环移
MOVP2.1,C//赋值
CLRP2.0
NOP
NOP
SETBP2.0//方波,上升沿有效
DJNZR1,LOOP1//减一不为零跳转
CLRP2.2
NOP
NOP
SETBP2.2//方波,上升沿有效
RET
//-------延时子函数--------
DELAY:
MOVR2,#2//(大调)修改R2值,改变延时长短
D2:
MOVR3,#10//中等
D3:
MOVR4,#0//微调延时大小
D4:
NOP
DJNZR4,D4
DJNZR3,D3
DJNZR2,D2
RET
END
(2)C语言
#include//51头文件
#include//“空指令”头文件
sbitshcp=P2^0;
sbitds=P2^1;
sbitstcp=P2^2;//管脚定义
sbita=P3^4;
sbitb=P3^5;
sbitc=P3^6;
sbitd=P3^7;
//-----延时子程序------
voiddelay(inti)//延时大小与i有关
{
intj;
while(i--)
for(j=255;j>0;j--)
;
}
//-----LED显示子程序------
voidled(intj)//共阴极显示
{
intnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
inti;
for(i=0;i<8;i++)
{
ds=(num[j]<
shcp=0;
_nop_();
_nop_();
shcp=1;//上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1;//上升沿有效
}
//---主程序-------
voidmain()
{
intn=1234;//选择需要显示的数值
intn1,n2,n3,n4,i=0;
n1=n/1000;//千位
n2=n/100%10;//百位
n3=n/10%10;//十位
n4=n%10;//个位
while
(1)
{
switch(i++)//选择
{
case0:
led(n1);a=0;break;//显示千位,打开控制
case1:
led(n2);b=0;break;//显示百位,打开控制
case2:
led(n3);c=0;break;//显示十位,打开控制
case3:
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)汇编:
ORG0000H
//----主函数-------
MAIN:
MOVR0,#16//循环次数(显示16次:
0~F)
MOVDPTR,#TAB
LOOP:
//循环显示0~F
MOVCA,@A+DPTR//查表
CALLDISPLAY
CALLDELAY
INCDPTR
CLRA//清空A内容
DJNZR0,LOOP//减一不为零跳转
SJMPMAIN
//------显示子函数--------
DISPLAY:
//(共阴极显示)
MOVR1,#8//循环次数
LOOP1:
RLCA//带进位左环移
MOVP2.1,C//赋值
CLRP2.0
NOP
NOP
SETBP2.0//方波,上升沿有效
DJNZR1,LOOP1//减一不为零跳转
CLRP2.2
NOP
NOP
SETBP2.2//方波,上升沿有效
RET
//-------延时子函数--------
DELAY:
MOVR2,#2//(大调)修改R2值,改变延时长短
D2:
MOVR3,#0//中等
D3:
MOVR4,#0//微调延时大小
D4:
NOP
DJNZR4,D4
DJNZR3,D3
DJNZR2,D2
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
(2)C语言
#include//51头文件
#include//“空指令”头文件
sbitshcp=P2^0;
sbitds=P2^1;
sbitstcp=P2^2;//管脚定义
//-----延时子程序------
voiddelay(inti)//延时大小与i有关
{
intj;
while(i--)
for(j=255;j>0;j--)
;
}
//-----LED显示子程序------
voidled()
{
intnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
staticintj=0;
inti;
for(i=0;i<8;i++)
{
ds=(num[j]<
shcp=0;
_nop_();
_nop_();
shcp=1;//上升沿有效
}
stcp=0;
_nop_();
_nop_();
stcp=1;//上升沿有效
j++;
if(j==16)
j=0;//满16后,从新计次
}
//---主程序-------
voidmain()
{
while
(1)//循环
{
led();
delay(100);
}
}