找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7215|回复: 1
收起左侧

74HC595+51单片机16*16点阵滚动显示(任意数字和字母)的仿真和源码

[复制链接]
ID:295789 发表于 2018-3-23 08:58 | 显示全部楼层 |阅读模式
使用51单片机编写的简单的16*16点阵显示器,能显示任意数字和字母。希望对感兴趣的同学们有一定的帮助!
0.png 0.png 0.png

单片机源程序如下:
  1. /*****************************
  2. 16*16点阵显示任意数字和字母
  3. 移动显示和闪屏显示
  4. 用5个74HC595控制
  5. 制作人:秦龙标
  6. DATE:2014.3.9
  7. 如果您引用了该代码请注明作者和出处,作者保留所有权
  8. ******************************/
  9. #include <stc/stc12c5a60s2.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define xian_gs  25                         //要显示数字的个数(实际数为xian_gs-1;因为加了一个空白数在前面)
  13. #define huancun  33                         //显存区大小
  14. sbit clk=P1^0;
  15. sbit di=P1^1;
  16. sbit cr=P1^2;
  17. uchar code SZ_ZM[]={0x0,0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,/*"0",0*/
  18.                                      …………
  19. …………限于本文篇幅 余下代码请从51黑下载附件…………
  20.                                          0xF7,0xFB,0xEF,0xE3,0xEF,0x9B,0xEF,0x7B,0xEC,0xFB,0xE3,0xFB,0xEF,0xE7,0xFF,0xFF};/*"Z",61*/
  21.                                          
  22. uchar code duanx[]={0x0,0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};  //扫描
  23. uchar code xian_shu[]={"1aB2c3DABCDEFGHIJKLMNOPQRSTUVWXYZ"};                        //要显示的数字和大小写字母
  24. //uchar code yima[]={"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
  25. uchar weis=1;                                                //数字移动位置
  26. bit fa=0;                                                        //两种显示方式的转换标志
  27. uchar xiancun[huancun];                         //显示缓存区
  28. uchar SN;                                            //显示时的第几个数字数

  29. void delay(uchar x)
  30. {uchar a,b;
  31.   for(a=x;a<0;a--)
  32.    for(b=1000;b<0;b--);
  33. }
  34. void send_byte(uchar num)                //595发送数据函数
  35. {uchar a;
  36. for(a=0;a<8;a++)
  37.   {
  38.    clk=0;
  39.    di=num&0x80;
  40.    num<<=1;
  41.    clk=1;
  42.   }
  43. }
  44. /*uint yimas(uchar ma)
  45. {uchar a;
  46. uint temp;
  47.   for(a=0;a<62;a++)
  48.   {
  49.    if(xian_shu[ma]==yima[a])
  50.    {
  51.            temp=a*16;
  52.    }
  53.   }
  54.   return temp;
  55. }*/
  56. uint yimas(uchar shu)                                         //用于判断数字和大小字母重新译码并算出在SZ_ZM[]里的地址位置
  57. {uint sm;

  58. if((xian_shu[shu]>=0x30)&(xian_shu[shu]<=0x39))                        //数字判断 重新译码号:0-9 ; 数字的编码是(0x30-0x39)
  59.   {
  60.   sm=(xian_shu[shu]-0x30)*16;                                                   //乘以16就是数字在SZ_ZM[]里的地址位置
  61.   }
  62. if((xian_shu[shu]>=0x41)&(xian_shu[shu]<=0x5a))                   //大写字母判断 重新译码号:36-61        ; 大写字母的编码是(0x41-0x5a)
  63.   {
  64.   sm=(xian_shu[shu]-0x41+36)*16;
  65.   }
  66. if((xian_shu[shu]>=0x61)&(xian_shu[shu]<=0x7a))                  //小写字母判断  重新译码号:10-35         ;小写字母的编码是(0x61-0x7a)
  67.   {
  68.   sm=(xian_shu[shu]-0x61+10)*16;
  69.   }
  70. return sm;
  71. }
  72. void zhuan_byte(uint shu,uint shu1)                //2个数字数据放进显存
  73. {uchar a;
  74.   for(a=1;a<17;a++)
  75.   {
  76.    xiancun[a]=SZ_ZM[shu+a];
  77.    xiancun[16+a]=SZ_ZM[shu1+a];
  78.   }
  79. }
  80. void display()                                   //显示函数显示显存里面的数据(16byte)
  81. {uchar a;
  82.   for(a=1;a<9;a++)
  83.    {
  84.    cr=0;
  85.    send_byte(xiancun[a*2-1]);
  86.    send_byte(xiancun[a*2]);
  87.    send_byte(xiancun[16+a*2-1]);
  88.    send_byte(xiancun[16+a*2]);
  89.    send_byte(duanx[a]);
  90.    cr=1;
  91.    delay(1);
  92.    }
  93. }

  94. void yidond_diplay()                                //用向左流动显示
  95. {uchar a,b;
  96. uchar a1=1;
  97.    for(a=weis;a<17;a++)                                //要显示第一个数字的存入显存
  98.            {
  99.            xiancun[a1]=SZ_ZM[yimas(SN)+a1+weis-1];          //要显示的数字乘以16就是该数的的数据地址
  100.            xiancun[16+a1]=SZ_ZM[yimas(SN+1)+a1+weis-1];
  101.            a1++;
  102.            }
  103.                                                               
  104.    for(b=1;b<weis;b++)                                //第一个数字显示移动后要追加第二个要显示的数字数据存入显存
  105.            {
  106.            xiancun[a1]=SZ_ZM[yimas(SN+1)+b];
  107.            xiancun[16+a1]=SZ_ZM[yimas(SN+2)+b];
  108.            a1++;
  109.            }

  110.    if(SN==xian_gs-1)                                  //消除最后一个数时显示的乱码
  111.    {
  112.            for(a=0;a<huancun;a++)
  113.         xiancun[a]=0xff;                                  //清空缓存区
  114.    }

  115.    weis+=2;
  116.    if(weis>=17)
  117.            {
  118.            weis=1;
  119.            SN++;
  120.            if(SN==xian_gs)
  121.                    {
  122.                    SN=0;fa=!fa;
  123.                    }
  124.            }
  125. }
  126. void shan_display()                                 //闪屏显示
  127. {uchar a;
  128. for(a=0;a<150;a++)
  129. zhuan_byte(yimas(SN),yimas(SN+1));
  130. SN+=2;if(SN>=xian_gs){SN=0;fa=!fa;}
  131. }
  132. void main()
  133. {
  134. while(1)
  135. {uchar a;
  136.   if(fa==0)
  137.   shan_display();
  138.   if(fa)
  139.   yidond_diplay();
  140.   for(a=0;a<30;a++)
  141.   {
  142.   display();
  143.   }
  144. }
  145. }

复制代码
0.png
所有资料51hei提供下载:
16 16点阵显示(任意数字和字母).rar (80.29 KB, 下载次数: 100)

评分

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

查看全部评分

回复

使用道具 举报

ID:83626 发表于 2019-1-30 06:36 | 显示全部楼层
16行点阵能分屏显示2行数字吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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