代码+仿真
单片机源程序如下:- #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, 下载次数: 61)
|