74HC595的C语言程序,求详细注释。

74HC595的C语言程序,求详细注释。,第1张

#include<reg51.h>

#include<INTRINS.H>

sbit SCLK=P1^0  //定义P1^0端口为595的频率

sbit DAT=P1^1   //定义P1^1端口为595的数据

sbit SLCK=P1^2////定义P1^2端口为595的输出频率

unsigned char code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}//0-9,-,全灭

void sendbyte(unsigned char a)//单位数据发送函数

{  unsigned char i//定义一个无字符串变量

   for(i=0i<8i++)   //for 循环,循环8次,把一个数变成二进制发送出去

        {

         SCLK=0// 把595 SCLK频率置低电平

         DAT=a&0x80//把数据与0X80后发送出去

         a=a<<1 把数据a左移一位

         SCLK=1 把595频率置高

         }

}

void out595(void)  //595输出函数

{

        SLCK=0

        _nop_()//延时函数,系统自带

        SLCK=1

}

main() //主函数

{ unsigned char i  //定义一个无符号局部变量I

  unsigned int  f=60000 //赋值

    while(1)//进循环

    {for(i=0i<9i++) //进FOR循环

     

      {

        sendbyte(tab[i])//调用发送函数 发送I数据道595 比如第一次循环的时候 i  数为0    tab[0] 那么发送的数就是0x3f

        out595() //数据输出函数,现在数据在595内面,现在这个就是输出到数码管

         while(f--) //延时

      }

    }

}

void shift_out(uchar g) //移位输出

{

uchar i

uchar dly=5

uchar tmp=g

for(i=0i<8i++)

{

if((tmp&0x80)==0x80)

{

DS_out=1

}

else

{

DS_out=0

}

SHCLK=0 //移位

dly=2

while(dly--)

SHCLK=1

dly=2

while(dly--)

tmp=tmp<<1

}

STCLK=0 //锁存

dly=5

while(dly--)

STCLK=1

}

看电路图,行驱动直接接在单片机I/O口上,有问题吧,单片机I/O不管是输入还是输出,都承受不了32LED灯。所以在I/O口上要加放大电路。这个不是小程序,只能说思路。先要明白汉字显示就是点阵显示。根据电路一次最多只能2个汉字,再多就只能滚动或刷屏。所以以2个汉字为基础开始编程。将第一行的点阵(32个位),顺序写入595,输出595. 控制第一行的I/O驱动,点亮第一行。延时5ms将第二行的点阵(32个位),顺序写入595,关第一行,输出595. 控制第二行的I/O驱动,点亮第二行。延时5ms同理,顺序点亮16行。一屏扫描完毕,重复循环,汉字就显示出来了。必须重复循环,否则没显示。 显示滚动效果。滚动效果其实就是控制行点阵的内容,将每行的32个位,右移一位,再写入595,就是滚动效果了。每扫描一屏,移位一个,位扫描多屏,移动一个,可以控制滚动的速度


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11330488.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存