找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制74HC595驱动点阵PCB+仿真+代码

  [复制链接]
跳转到指定楼层
楼主
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. void Input595(uchar f);// 寄存到595芯片的输出口
  6. void Output595(); //输出到点阵
  7. sbit sclk=P2^0;     //数码管HC595第11脚,串行时钟输入端
  8. sbit sdat=P2^1;     //数码管HC595第14脚,串行数据输入端
  9. sbit cpla=P2^2;     //数码管HC595第12脚,输出锁存脉冲输入端
  10. sbit SHCP_595=P2^3;        //点阵HC595第11脚,串行时钟输入端
  11. sbit DS_595=P2^4;        //点阵HC595第14脚,串行数据输入端
  12. sbit STCP_595=P2^5;        //点阵HC595第12脚,输出锁存脉冲输入端
  13. sbit key1=P1^0;     //按键控制数码管加数
  14. sbit key2=P1^1;     //按键控制数码管减数
  15. sbit key3=P1^2;//控制点阵的显示切换
  16. unsigned char dis[]={0,1,2,3,4};   //定义显示缓冲区4个单元
  17. unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  18. unsigned char code wei[]={0x01,0x02,0x04,0x08};
  19. char g=0;
  20. char s=0;
  21. char b=0;
  22. char q=0;
  23. int flog;
  24. void keya();//数码管按键
  25. void keyb();//点阵按键
  26. void delay(uint i)   //延时子程序
  27.   {
  28.    while(i--) ;
  29.   }
  30. void hc595_in(unsigned char Data)
  31. {
  32. unsigned char b;       
  33.         for(b=0;b<8;b++)
  34.    {               
  35.           sdat=Data&0x80;
  36.                 Data<<=1;
  37.     sclk=0;                 
  38.                 sclk=1;
  39.      _nop_();

  40.          }       
  41. }
  42. void hc595_out(void)
  43. {
  44.          cpla=0;
  45.          _nop_();
  46.          _nop_();
  47.          cpla=1;
  48.         }

  49. void keya()
  50. {
  51.    if(key1==0)              //如果按键按下
  52.          {         
  53.             delay(10000);             //消抖
  54.                         if(key1==0)
  55.                         {
  56.                 g++;         //个位加一
  57.                 if(g>9)      //判断是否向十位进位
  58.                 {
  59.                  s++;
  60.                  g=0;
  61.                 }
  62.             
  63.                 if(s>9)    //判断是否向百位进位   
  64.                 {
  65.                  b++;
  66.                  s=0;
  67.                 }
  68.                                  if(b>9)    //判断是否向百位进位   
  69.                 {
  70.                  q++;
  71.                  b=0;
  72.              }
  73.                    }
  74.                         }
  75.                 if(key2==0)              //如果按键按下
  76.          {         
  77.             delay(10000);     //消抖
  78.                         if(key2==0) {
  79.                 g--;         //个位减一
  80.                 if(g<0)      //判断是否向十位进位
  81.                 {                                                                         
  82.                  s--;
  83.                  g=9;
  84.                                         if(s<0)    //判断是否向百位进位   
  85.                         {
  86.                          b--;
  87.                          s=9;
  88.                                                   if(b<0)    //判断是否向百位进位   
  89.                                         {
  90.                                          q--;
  91.                                          b=9;
  92.                               
  93.                                         }
  94.                                                  }
  95.                         }
  96.                 }
  97. }
  98. }
  99. uchar code dz0[]={
  100. /*--  文字:  撸  --*/
  101. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  102. 0x84,0x00,0xC4,0x0F,0x24,0x08,0xF4,0x3F,0x2F,0x22,0xE4,0x3F,0x24,0x22,0xE4,0x3F,
  103. 0x0C,0x00,0xF7,0x7F,0x04,0x00,0xC4,0x1F,0x44,0x10,0xC4,0x1F,0x45,0x10,0xC2,0x1F,

  104. /*--  文字:  起  --*/
  105. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  106. 0x10,0x00,0x10,0x00,0x10,0x1F,0x7E,0x10,0x10,0x10,0x10,0x10,0x7F,0x1F,0x10,0x11,
  107. 0x14,0x01,0x14,0x01,0x74,0x21,0x14,0x21,0x14,0x3E,0x1A,0x00,0xF2,0x7F,0x01,0x00,

  108. /*--  文字:  袖  --*/
  109. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  110. 0x04,0x04,0x08,0x04,0x00,0x04,0x3F,0x04,0x90,0x3F,0x88,0x24,0x88,0x24,0xAC,0x24,
  111. 0x9A,0x24,0xA9,0x3F,0xA8,0x24,0x88,0x24,0x88,0x24,0x88,0x24,0x88,0x3F,0x88,0x20,

  112. /*--  文字:  子  --*/
  113. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  114. 0x00,0x00,0xFE,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x80,0x01,0x80,0x00,0xFF,0x7F,
  115. 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,

  116. /*--  文字:  加  --*/
  117. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  118. 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x3E,0x7F,0x22,0x48,0x22,0x48,0x22,0x48,0x22,
  119. 0x48,0x22,0x48,0x22,0x48,0x22,0x48,0x22,0x44,0x22,0x44,0x3E,0x52,0x22,0x21,0x00,

  120. /*--  文字:  油  --*/
  121. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  122. 0x00,0x02,0x04,0x02,0x08,0x02,0x08,0x02,0xE1,0x3F,0x22,0x22,0x22,0x22,0x28,0x22,
  123. 0x28,0x22,0xE4,0x3F,0x27,0x22,0x24,0x22,0x24,0x22,0x24,0x22,0xE4,0x3F,0x20,0x20,

  124. /*--  文字:  干  --*/
  125. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  126. 0x00,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,
  127. 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,

  128. /*--  文字:  ↑  --*/
  129. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  130. 0x80,0x00,0x80,0x00,0xC0,0x01,0xC0,0x01,0xE0,0x03,0xA0,0x02,0x90,0x04,0x80,0x00,
  131. 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,

  132. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  133. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  134. };//列代码
  135. uchar code hdz[32]={0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
  136. 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80
  137. };//行代码

  138. uchar code dz1[]={
  139. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  140. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  141. /*--  文字:  努  --*/
  142. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  143. 0x08,0x00,0x08,0x00,0x7F,0x3F,0x44,0x21,0x22,0x11,0x14,0x0A,0x08,0x04,0x14,0x1A,
  144. 0xA3,0x61,0x40,0x00,0x40,0x00,0xFE,0x1F,0x20,0x10,0x10,0x10,0x08,0x0A,0x06,0x04,

  145. /*--  文字:  力  --*/
  146. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  147. 0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x1F,0x40,0x10,0x40,0x10,0x40,0x10,
  148. 0x40,0x10,0x20,0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x08,0x11,0x04,0x0A,0x02,0x04,

  149. /*--  文字:  努  --*/
  150. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  151. 0x08,0x00,0x08,0x00,0x7F,0x3F,0x44,0x21,0x22,0x11,0x14,0x0A,0x08,0x04,0x14,0x1A,
  152. 0xA3,0x61,0x40,0x00,0x40,0x00,0xFE,0x1F,0x20,0x10,0x10,0x10,0x08,0x0A,0x06,0x04,

  153. /*--  文字:  力  --*/
  154. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  155. 0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x1F,0x40,0x10,0x40,0x10,0x40,0x10,
  156. 0x40,0x10,0x20,0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x08,0x11,0x04,0x0A,0x02,0x04,

  157. /*--  文字:  再  --*/
  158. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  159. 0x00,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0xFC,0x1F,
  160. 0x84,0x10,0x84,0x10,0xFF,0x7F,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x14,0x04,0x08,

  161. /*--  文字:  努  --*/
  162. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  163. 0x08,0x00,0x08,0x00,0x7F,0x3F,0x44,0x21,0x22,0x11,0x14,0x0A,0x08,0x04,0x14,0x1A,
  164. 0xA3,0x61,0x40,0x00,0x40,0x00,0xFE,0x1F,0x20,0x10,0x10,0x10,0x08,0x0A,0x06,0x04,

  165. /*--  文字:  力  --*/
  166. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  167. 0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xFE,0x1F,0x40,0x10,0x40,0x10,0x40,0x10,
  168. 0x40,0x10,0x20,0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x08,0x11,0x04,0x0A,0x02,0x04,                                                          

  169. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  170. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  171. };//列代码


  172. void Input595(uchar f)
  173. {
  174. uchar i;
  175.    for (i=0; i<8; i++)
  176.    {
  177.      DS_595 = f>>7 ;
  178.     f <<= 1;
  179.     SHCP_595=0;
  180.     _nop_();
  181.     SHCP_595=1;
  182.     }
  183. }
  184. void Output595()
  185.   {
  186.    STCP_595 = 0;
  187.    _nop_();
  188.    STCP_595 = 1;
  189.    STCP_595 = 0;
  190.    }
  191. void keyb()
  192. {
  193.     if(key3==0)
  194.         {
  195.         delay(250);
  196.         if(key3==0)
  197.           {
  198.            flog++;
  199.                 if(flog==2)
  200.                 {
  201.                  flog=0;
  202.                 }
  203.            }
  204.            while(!key3);
  205.           }
  206.         }
  207. //主函数
  208. void main()
  209. {
  210.     unsigned char e;
  211.         unsigned char p;
  212.    uint a,i,j,n;
  213.    while(1)
  214.    {
  215.    a=0;
  216.    for(j=0;j<128;j++)//总共需要128屏
  217.     {       
  218.      n=a;
  219.       for(i=0;i<16;i++)//输出1屏                
  220.            {
  221.             for(e=0;e<4;e++)
  222.         {
  223.         keya();
  224.         switch(e)
  225.         {
  226.           case 0:p=q;break;
  227.           case 1:p=b;break;
  228.           case 2:p=s;break;
  229.           case 3:p=g;break;
  230.         }
  231.          hc595_in(wei[e]);
  232. ……………………

  233. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
项目三.7z (710.37 KB, 下载次数: 114)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:152957 发表于 2019-5-5 11:08 | 只看该作者
仿真是哪个版本的?我的打不开!!
回复

使用道具 举报

板凳
ID:654847 发表于 2019-12-12 19:18 | 只看该作者
15277158896 发表于 2019-5-5 11:08
仿真是哪个版本的?我的打不开!!

我也打不开
回复

使用道具 举报

地板
ID:990146 发表于 2021-12-9 16:24 | 只看该作者
楼主威武,我参考一下,就可以直接用了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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