找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2488|回复: 1
打印 上一主题 下一主题
收起左侧

74hc595+数码管 单片机源程序Proteus仿真(剩用端口)

[复制链接]
跳转到指定楼层
楼主
代码+仿真


单片机源程序如下:
  1. #include <REGX51.H>
  2. sbit SH_CP = P0^0;// 移位寄存器的时钟控制
  3. sbit DS = P0^1; // 数据传输线
  4. sbit ST_CP = P0^2;//数据输出寄存器的时钟控制
  5. unsigned int a[]={
  6.         0x3F,/*0*/
  7.         0x06,/*1*/
  8.         0x5B,/*2*/
  9.         0x4F,/*3*/
  10.         0x66,/*4*/
  11.         0x6D,/*5*/
  12.         0x7D,/*6*/
  13.         0x07,/*7*/
  14.         0x7F,/*8*/
  15.         0x6F,/*9*/

  16. };
  17. //延时函数
  18. void delayms(unsigned int m)
  19. {
  20.         unsigned int i, j;
  21.         for(i=0; i<m; i++)
  22.                 for(j=0; j<100; j++);
  23. }


  24. /****************************************************************
  25. 第一步:取出最高位   temp = value & 0x80;  //取最高位的值
  26. 第二步:判断最高位是0还是1 if(temp)
  27. 第三步:向595发送最高位的值          DS = 1或0; 向595的移位寄存器发送一个1或0
  28. 第四步:向移位寄存器中发送数据,将数据产生移位
  29.         只需给移位寄存器上升沿工作时钟 SH_CP = 0; SH_CP = 1;
  30. 第五步:将要传输的数据进行移位,目的是将最高位去掉,
  31.         将次高位变为最高位 value = value <<1;/
  32. 第六步:一个字节有8位数据,每次只能发送一位数据,
  33.         所以我们发送8次,用for循环
  34. 第七步:八个数据全部发送到移位寄存器之后,就要将移位寄存器的数据发送到数据输出寄存器中,
  35.                 只需要给数据输出寄存器一个上升沿工作时钟即可ST_CP = 0; ST_CP = 1;
  36. ***************************************************************/
  37. void hc595(unsigned int value)
  38. {
  39.         bit temp;//位变量,temp的值为0或者1
  40.         unsigned char i;
  41.         for(i=0; i<8; i++)
  42.         {
  43.                 temp = value &0x80; // 取value的最高位  0000 0001  &1000 0000
  44.                 if(temp == 1) DS = 1;//如果最高位为1,那么就向595发送一个1
  45.                 else  DS =0; //否则就向595发送一个0
  46.                 SH_CP = 0;
  47.                 SH_CP = 1;//移位寄存器产生一个上升沿,将数据发送到移位寄存器中,使移位寄存器的数据产生移位
  48.                 value = value <<1;//将最高位去掉,将此高位变成最高位,为下一次发送最高位做准备               
  49.         }
  50.         ST_CP = 0;
  51.         ST_CP = 1;//产生一个上升沿,将移位寄存器的数据发送给数据输出寄存器
  52. }
  53. /*************************
  54. 显示函数
  55. 动态扫描:先写位码,再写段码,最后补一个延时
  56. */         
  57. void display(void)
  58. {
  59.         unsigned char n,x;
  60.         for(n=0; n<100; n++)
  61.         {
  62.                 for(x=0; x<50; x++)// 当前数字刷新的次数,起到延时的作用 每一消耗的时间20ms x  50 =1s
  63.                 {
  64.                  P3 = 0x01;//0000 0001   个位工作 位码
  65.                   hc595(a[n%10]);//显示0
  66.                   delayms(10);

  67.                   P3 = 0x02;//0000 0010  十位工作,位码
  68.                   hc595(a[n/10]);//显示1
  69.                   delayms(10);
  70.                 }        
  71.         }
  72.    
  73. }

  74. void  main(void)
  75. {
  76.         while(1)
  77.         {
  78.                 display();        
  79.         }
  80. }
复制代码

下载: 595-双数码--0~99.rar (41 KB, 下载次数: 61)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:284050 发表于 2020-9-5 13:55 | 只看该作者
void hc595(unsigned int value)

这个函数给了我另外一种发送数据给595的思路,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表