标题:
74hc595+数码管 单片机源程序Proteus仿真(剩用端口)
[打印本页]
作者:
七禾页
时间:
2020-8-25 15:29
标题:
74hc595+数码管 单片机源程序Proteus仿真(剩用端口)
代码+仿真
图片1.png
(75.49 KB, 下载次数: 83)
下载附件
2020-8-25 15:28 上传
单片机源程序如下:
#include <REGX51.H>
sbit SH_CP = P0^0;// 移位寄存器的时钟控制
sbit DS = P0^1; // 数据传输线
sbit ST_CP = P0^2;//数据输出寄存器的时钟控制
unsigned int a[]={
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
};
//延时函数
void delayms(unsigned int m)
{
unsigned int i, j;
for(i=0; i<m; i++)
for(j=0; j<100; j++);
}
/****************************************************************
第一步:取出最高位 temp = value & 0x80; //取最高位的值
第二步:判断最高位是0还是1 if(temp)
第三步:向595发送最高位的值 DS = 1或0; 向595的移位寄存器发送一个1或0
第四步:向移位寄存器中发送数据,将数据产生移位
只需给移位寄存器上升沿工作时钟 SH_CP = 0; SH_CP = 1;
第五步:将要传输的数据进行移位,目的是将最高位去掉,
将次高位变为最高位 value = value <<1;/
第六步:一个字节有8位数据,每次只能发送一位数据,
所以我们发送8次,用for循环
第七步:八个数据全部发送到移位寄存器之后,就要将移位寄存器的数据发送到数据输出寄存器中,
只需要给数据输出寄存器一个上升沿工作时钟即可ST_CP = 0; ST_CP = 1;
***************************************************************/
void hc595(unsigned int value)
{
bit temp;//位变量,temp的值为0或者1
unsigned char i;
for(i=0; i<8; i++)
{
temp = value &0x80; // 取value的最高位 0000 0001 &1000 0000
if(temp == 1) DS = 1;//如果最高位为1,那么就向595发送一个1
else DS =0; //否则就向595发送一个0
SH_CP = 0;
SH_CP = 1;//移位寄存器产生一个上升沿,将数据发送到移位寄存器中,使移位寄存器的数据产生移位
value = value <<1;//将最高位去掉,将此高位变成最高位,为下一次发送最高位做准备
}
ST_CP = 0;
ST_CP = 1;//产生一个上升沿,将移位寄存器的数据发送给数据输出寄存器
}
/*************************
显示函数
动态扫描:先写位码,再写段码,最后补一个延时
*/
void display(void)
{
unsigned char n,x;
for(n=0; n<100; n++)
{
for(x=0; x<50; x++)// 当前数字刷新的次数,起到延时的作用 每一消耗的时间20ms x 50 =1s
{
P3 = 0x01;//0000 0001 个位工作 位码
hc595(a[n%10]);//显示0
delayms(10);
P3 = 0x02;//0000 0010 十位工作,位码
hc595(a[n/10]);//显示1
delayms(10);
}
}
}
void main(void)
{
while(1)
{
display();
}
}
复制代码
下载:
595-双数码--0~99.rar
(41 KB, 下载次数: 62)
2020-8-25 15:28 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
川人在柳
时间:
2020-9-5 13:55
void hc595(unsigned int value)
这个函数给了我另外一种发送数据给595的思路,谢谢!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1