找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机16*16点阵滚动显示Proteus仿真+代码

[复制链接]
跳转到指定楼层
楼主
16*16点阵滚动显示制作出来的实物图如下:


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


单片机源程序如下:
  1. //宏定义
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define zishu 10        //汉字数,两个字符是一个汉字,如果有单个字符,那么就加0.5

  5. //包含头文件
  6. #include <reg51.h>
  7. #include <intrins.h>

  8. //管脚定义
  9. //154
  10. sbit A_=P0^0;                   //74HC154的A
  11. sbit B_=P0^1;                   //74HC154的B
  12. sbit C_=P0^2;                   //74HC154的C
  13. sbit D_=P0^3;                   //74HC154的D
  14. sbit G2=P0^7;                //74HC154的使能        低电平有效
  15. //595
  16. sbit SI=P0^6;//数据脚
  17. sbit SCK=P0^5;//上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变
  18. sbit RCK=P0^4;//上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将
  19.                                   //RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我
  20.                                   //通常都选微秒级),更新显示数据。

  21. //函数声明
  22. void Init595();
  23. void Write_byte595(uchar temp);
  24. void WriteS(uchar data1,uchar data2);
  25. void Wei_154(uchar W);
  26. void delay(uint z);

  27. //汉字数组
  28. uchar code HanZi[]=
  29. {
  30. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",0*/

  31. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",1*/         //这两行不要动改字时保留

  32. 0xFF,0xFF,0x80,0x00,0xBF,0xFF,0xB7,0xFF,0xB6,0x07,0xB6,0xEF,0xB6,0xEF,0xB6,0xEF,
  33. 0xB6,0xEF,0xB6,0xEF,0xB6,0x07,0xB7,0xFD,0xBF,0xFE,0x80,0x01,0xFF,0xFF,0xFF,0xFF,/*"同",0*/

  34. 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
  35. 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,/*"一",1*/

  36. 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xCF,0xFF,0x38,0x01,
  37. 0xDF,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xF9,0xFF,0xFC,0xFF,0xFD,0xFF,0xFF,0xFF,/*"个",2*/

  38. 0xFB,0xFF,0xFB,0xFF,0xFB,0xFF,0x80,0x03,0xFB,0xFB,0xFB,0xFB,0x80,0x1B,0xFB,0xBB,
  39. 0xFB,0xBB,0xFB,0xBB,0xFB,0xBB,0x80,0x1B,0xFB,0xF3,0xFB,0xFB,0xFB,0xFF,0xFF,0xFF,/*"世",3*/

  40. 0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0x00,0xDE,0x6D,0xDD,0x6D,0xBB,0x6D,0x47,0x00,0xFF,
  41. 0x6C,0xFF,0x6D,0x40,0x6D,0xBF,0x6D,0xBF,0x00,0xDF,0xFF,0xCF,0xFF,0xDF,0xFF,0xFF,/*"界",4*/

  42. 0xFF,0xFF,0x80,0x00,0xBF,0xFF,0xB7,0xFF,0xB6,0x07,0xB6,0xEF,0xB6,0xEF,0xB6,0xEF,
  43. 0xB6,0xEF,0xB6,0xEF,0xB6,0x07,0xB7,0xFD,0xBF,0xFE,0x80,0x01,0xFF,0xFF,0xFF,0xFF,/*"同",5*/

  44. 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
  45. 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,/*"一",6*/

  46. 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xCF,0xFF,0x38,0x01,
  47. 0xDF,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xF9,0xFF,0xFC,0xFF,0xFD,0xFF,0xFF,0xFF,/*"个",7*/

  48. 0xFD,0xFF,0xDD,0xFE,0xDB,0xEE,0xD7,0xEE,0x00,0x9D,0xD6,0x5D,0xD9,0x6B,0xFD,0x73,
  49. 0xDB,0x77,0xD7,0x6F,0x00,0x5F,0xCF,0x3F,0xD3,0x7F,0xD9,0xFF,0xDB,0xFF,0xFF,0xFF,/*"梦",8*/

  50. 0xEF,0x7F,0xEC,0xFD,0xE3,0xF1,0x00,0x7F,0xE7,0xE3,0xE9,0xFD,0xEF,0xFD,0xFF,0xDD,
  51. 0x80,0x65,0xAB,0x7D,0xAB,0x7D,0xAB,0x79,0xAB,0x7F,0x80,0x6F,0xFF,0xF3,0xFF,0xFF,/*"想",9*/

  52. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",10*/

  53. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",11*/                //这两行不要动改字时保留
  54. };
  55. //主函数
  56. void main()
  57. {
  58.         uchar i=1,j=0;
  59.         uint X=0;
  60.         //595c初始化
  61.         Init595();
  62.         //循环演示
  63.         while(1)          //循环
  64.         {
  65.                 for(j=0;j<10;j++)                                                                                        //更改j<10为j<5,可以加速
  66.                 {
  67.                         for(i=1;i<17;i++)                                                                                 //一个for循环,分别选中16个列
  68.                         {
  69.                                 WriteS(0xff,0xff);                                                                        //消影
  70.                                 Wei_154(i);                                                                                        //选中列数据
  71.                                 WriteS(HanZi[i*2-2+2*X],HanZi[i*2-1+2*X]);                        //显示内容
  72.                                 Wei_154(i);                                                                                        //再选中列数据
  73.                                 delay(7);                                                                                        //延时的时间就是显示的时间
  74.                                 G2=0;                                                                                                //打开列选
  75.                         }
  76.                 }
  77.                 X++;                                                                                                                //显示左移
  78.                 if(X==8*((zishu+1)*2))                                                                                                        //左移到最后一个字--更改字时,8*n中的n的取值为:字符数+2(一个汉字=两个字符,字母数字为1个字符)
  79.                         X=0;                                                                                                        //重头开始
  80.         }
  81. }

  82. //初始化595
  83. void Init595()
  84. {
  85.         SI=1;
  86.         SCK=0;
  87.         RCK=0;
  88. }

  89. void Write_byte595(uchar temp)                //写数据到595
  90. {
  91.         uchar i,data_=temp;
  92.         G2=1;                                                        //关闭列选
  93.         for(i=0;i<8;i++)                                //传值8位
  94.         {
  95.                 if(data_&0x01==0x01)                //判断低位为1
  96.                 {
  97.                         SI=1;                                        //数据脚就写入1
  98.                 }
  99.                 else                                                 //判断低位为0
  100.                 {
  101.                         SI=0;                                        //数据脚写入0
  102.                 }
  103.                 //产生一个上升沿
  104.                 SCK=0;
  105.                 SCK=1;
  106.                 SCK=0;
  107.                 data_>>=1;                                        //将要写入的数据右移一位
  108.         }
  109.         RCK=0;//显示数据
  110.         RCK=1;
  111.         RCK=0;
  112. }

  113. //595写入一行的字节
  114. void WriteS(uchar data1,uchar data2)
  115. {
  116.         Write_byte595(data2);                        //写入高8位数据
  117.         Write_byte595(data1);                        //写入低8位数据                 一共是一行16个数据
  118. }

  119. //154位选驱动
  120. void Wei_154(uchar W)
  121. {
  122.         G2=0;//使能
  123.         switch(W)                //判断W的值,选中不同的列线
  124.         {
  125.                 case 16:        //如果W=16
  126.                 {
  127.                         A_=1;
  128.                         B_=1;
  129.                         C_=1;
  130.                         D_=1;        //1111:选中第16列
  131.                         break;               
  132.                 }
  133.                 case 15:
  134.                 {
  135.                         A_=0;
  136.                         B_=1;
  137.                         C_=1;
  138.                         D_=1;        //1110:选中第15列
  139.                         break;               
  140.                 }
  141.                 case 14:
  142.                 {
  143.                         A_=1;
  144.                         B_=0;
  145.                         C_=1;
  146.                         D_=1;        //1101:选中第14列       
  147.                         break;               
  148.                 }
  149.                 case 13:
  150.                 {
  151.                         A_=0;
  152.                         B_=0;
  153.                         C_=1;
  154.                         D_=1;        //1100:选中第13列       
  155.                         break;               
  156.                 }
  157.                 case 12:
  158.                 {
  159.                         A_=1;
  160.                         B_=1;
  161.                         C_=0;
  162.                         D_=1;        //1011:选中第12列       
  163.                         break;               
  164.                 }
  165.                 case 11:
  166.                 {
  167.                         A_=0;
  168.                         B_=1;
  169.                         C_=0;
  170.                         D_=1;        //1010:选中第11列       
  171.                         break;               
  172.                 }
  173.                 case 10:
  174.                 {
  175.                         A_=1;
  176.                         B_=0;
  177.                         C_=0;
  178.                         D_=1;        //1001:选中第10列       
  179.                         break;               
  180.                 }
  181.                 case 9:
  182.                 {
  183.                         A_=0;
  184.                         B_=0;
  185.                         C_=0;
  186.                         D_=1;        //1000:选中第9列       
  187.                         break;               
  188.                 }
  189.                 case 8:
  190.                 {
  191.                         A_=1;
  192.                         B_=1;
  193.                         C_=1;
  194.                         D_=0;        //0111:选中第8列       
  195.                         break;               
  196.                 }
  197.                 case 7:
  198.                 {
  199.                         A_=0;
  200.                         B_=1;
  201.                         C_=1;
  202.                         D_=0;        //0110:选中第7列       
  203.                         break;               
  204.                 }
  205.                 case 6:
  206.                 {
  207.                         A_=1;
  208.                         B_=0;
  209.                         C_=1;
  210.                         D_=0;        //0101:选中第6列       
  211.                         break;               
  212.                 }
  213.                 case 5:
  214.                 {
  215.                         A_=0;
  216.                         B_=0;
  217.                         C_=1;
  218.                         D_=0;        //0100:选中第5列       
  219.                         break;               
  220.                 }
  221.                 case 4:
  222.                 {
  223.                         A_=1;
  224.                         B_=1;
  225.                         C_=0;
  226.                         D_=0;        //0011:选中第4列       
  227.                         break;               
  228.                 }
  229.                 case 3:
  230.                 {
  231. ……………………

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

所有资料51hei提供下载:
42-16乘16点阵滚动显示.7z (1.04 MB, 下载次数: 70)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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