找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+LED点阵显示字幕不全怎么解决?

[复制链接]
跳转到指定楼层
楼主
本帖最后由 大智慧152 于 2020-6-12 13:06 编辑

如图两个字模是相同的,主要参考https://blog.csdn.net/zh_j_wei/article/details/104192813所写但是最终显示字模不完全
附上源代码
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define  GPIO_KEY P1  //独立键盘用P1口

  4. //--重定义函数变量--//
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. #define ulong unsigned long

  8. unsigned char Key_Scan();
  9. void Delay10ms(uint z);
  10. void translation();
  11. void twinkle1();
  12. void twinkle2();
  13. uint k,i,j,ms;
  14. uchar keyNum;

  15. //--定义SPI要使用的 IO--//
  16. sbit MOSIO = P3^4;
  17. sbit R_CLK = P3^5;
  18. sbit S_CLK = P3^6;

  19. //通过74HC595发送四个字节的数据
  20. void HC595SendData(uchar BT3, uchar BT2,uchar BT1,uchar BT0)
  21. {  
  22.         uchar i;
  23.         
  24.         //--发送第一个字节--//
  25.         for(i=0;i<8;i++)
  26.         {
  27.                 MOSIO = BT3 >> 7;            //从高位到低位
  28.                 BT3 <<= 1;              //左移一位
  29.                 S_CLK = 0;                                
  30.                 S_CLK = 1;                                
  31.         }

  32.         //--发送第二个字节--//
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 MOSIO = BT2 >> 7;                //从高位到低位
  36.                 BT2 <<= 1;
  37.                 S_CLK = 0;
  38.                 S_CLK = 1;        
  39.         }

  40.         //--发送第三个字节--//
  41.         for(i=0;i<8;i++)
  42.         {
  43.                 MOSIO = BT1 >> 7;                //从高位到低位
  44.                 BT1 <<= 1;
  45.                 S_CLK = 0;
  46.                 S_CLK = 1;        
  47.         }

  48.         //--发送第四个字节--//
  49.         for(i=0;i<8;i++)
  50.         {
  51.                 MOSIO = BT0 >> 7;                //从高位到低位
  52.                 BT0 <<= 1;
  53.                 S_CLK = 0;
  54.                 S_CLK = 1;
  55.         }

  56.         //--输出--//
  57.         R_CLK = 0; //set dataline low
  58.         R_CLK = 1; //片选
  59.         R_CLK = 0; //set dataline low
  60. }

  61. //点阵显示数组
  62. uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
  63.                                          0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
  64.                                          0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
  65.                                          0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
  66. //--张--//
  67. uchar code tab1[] = {128,1,191,49,176,49,176,25,176,13,190,7,134,1,230,255,134,7,190,13,176,13,176,25,176,49,176,103,158,195,140,1};        
  68. //--李--//
  69. uchar code tab2[] = {128,0,128,0,254,63,160,2,144,4,136,8,6,48,240,3,0,1,128,0,254,63,128,0,128,0,224,0,0,0,0,0};                        
  70. //--王--//
  71. uchar code tab3[] = {0,0,252,31,128,0,128,0,128,0,128,0,128,0,248,15,128,0,128,0,128,0,128,0,128,0,254,63,0,0,0,0};
  72. //--任--//
  73. uchar code tab4[] = {16,0,16,28,208,3,8,2,8,2,12,2,10,2,232,63,8,2,8,2,8,2,8,2,8,2,200,31,0,0,0,0};
  74. //--徐-//
  75. uchar code tab5[] = {16,2,16,2,8,5,132,8,82,16,176,47,8,2,12,2,202,31,8,2,72,18,72,34,40,34,136,3,0,0,0,0};
  76. //--五角星--//
  77. uchar code char1[] = {128,1,128,1,192,3,192,3,192,3,96,6,127,254,6,96,28,56,48,12,48,12,152,27,248,30,56,28,12,48,0,0};
  78. //--圆--//
  79. uchar code char2[] = {0,0,224,7,120,30,28,56,28,56,14,112,14,112,14,112,14,112,14,112,28,56,28,56,120,30,224,7,0,0,0,0};
  80. //--三角--//
  81. uchar code char3[] = {0,0,128,1,128,1,192,3,192,3,96,6,96,6,48,12,48,12,24,24,24,24,12,48,12,48,254,127,0,0,0,0};
  82. //--菱形--//
  83. uchar code char4[] = {128,0,64,1,32,2,16,4,8,8,4,16,2,32,1,64,2,32,4,16,8,8,16,4,32,2,64,1,128,0,0,0};
  84. //--箭头--//
  85. uchar code char5[] = {0,0,0,0,0,0,0,2,0,4,0,8,0,16,0,32,126,64,0,32,0,16,0,8,0,4,0,2,0,0,0,0};

  86. uchar *p[] = {tab1, tab2, tab3, tab4, tab5};        
  87. uchar *c[] = {char1, char2, char3, char4,char5};        


  88. void main(void)
  89. {
  90.    while(1)//死循环
  91.    {
  92.                  HC595SendData(0xff,0xff,0,0);        //清屏        
  93.                  keyNum=Key_Scan();                  //读取键值
  94.                  switch (keyNum)         
  95.                 {
  96.                         case(0xFE) :          //返回按键K1的数据
  97.                                 translation();//文字从上到下平移
  98.                                 break;
  99.                         case(0xFD) :          //返回按键K2的数据
  100.                                 twinkle1();                //文字闪烁
  101.                                 break;
  102.                         case(0xFB) :          //返回按键K3的数据
  103.                                 twinkle2();                //符号闪烁
  104.                                 break;
  105.                         case(0x7F) :          //返回按键K0的数据
  106.                                 HC595SendData(0xff,0xff,0,0);                                //清屏
  107.                                 break;
  108.                         default:
  109.                                 break;
  110.                 }                        
  111.    }
  112. }

  113. unsigned char Key_Scan()
  114. {
  115.         unsigned char keyValue = 0 , i; //保存键值

  116.         //--检测按键1--//
  117.         if (GPIO_KEY != 0xFF)                //检测按键K1是否按下
  118.         {
  119.                 Delay10ms(5);        //消除抖动

  120.                 if (GPIO_KEY != 0xFF)        //再次检测按键是否按下
  121.                 {
  122.                         keyValue = GPIO_KEY;
  123.                         i = 0;
  124.                         while ((i<50) && (GPIO_KEY != 0xFF))         //检测按键是否松开
  125.                         {
  126.                                 Delay10ms(5);
  127.                                 i++;
  128.                         }
  129.                 }
  130.         }

  131.         return keyValue;   //将读取到键值的值返回
  132. }

  133. //消除抖动(延时)
  134. void Delay10ms(uint z)
  135. {
  136.         uint j;
  137.         while(z--)
  138.         {
  139.                 j=5000;
  140.                 while(j--);
  141.         }
  142. }

  143. //文字由上而下平移
  144. void translation()
  145. {
  146.         j=0;
  147.         while(keyNum!=0x7F)
  148.         {
  149.                 for(ms = 10; ms > 0; ms--)        //移动定格时间设置
  150.                 {
  151.                         for(k = 0; k < 16; k++)        //显示一个字
  152.                         {                                                         
  153.                                 HC595SendData(~(*(p[0] + 2*(k+j) + 1)),~(*(p[0] + 2*(k+j) )),
  154.                                 tab0[2*k],tab0[2*k + 1]);
  155.                                 //因为字模软件取的数组是高电平有效,所以列要取反         
  156.                                 keyNum=Key_Scan();
  157.                                         if(keyNum==0x7F)
  158.                                                 break;
  159.                         }                        
  160.                         HC595SendData(0xff,0xff,0,0);                                                                                   //清屏        
  161.                         if(keyNum==0x7F)
  162.                                 break;                        
  163.                 }         
  164.                 j++;
  165.                 if(j == (10*15) )
  166.                 {
  167.                         j = 0;
  168.                 }
  169.         }
  170. }
  171. //文字闪烁
  172. void twinkle1()
  173. {
  174.         while(keyNum!=0x7F)
  175.         {
  176.                 for(i = 0; i < 5; i++)                //总共5个字
  177.                 {
  178.                         for(ms = 50; ms > 0; ms--)        //显示50次,即肉眼可识别的停留时间
  179.                         {
  180.                                 for(k = 0; k < 16; k++)                        //显示一个字
  181.                                 {                                                         
  182.                                         //--因为字模软件取的数组是高电平有效,所以列要取反--//
  183.                                         HC595SendData(~(*(p[i] + 2*k + 1)),~(*(p[i] + 2*k )),
  184.                                                                                                  tab0[2*k],tab0[2*k + 1]);
  185.                                         keyNum=Key_Scan();
  186.                                         if(keyNum==0x7F)
  187.                                                 break;
  188.                                 }
  189.                                 HC595SendData(0xff,0xff,0,0);                                //清屏        
  190.                                 if(keyNum==0x7F)
  191.                                         break;                                
  192.                         }
  193.                         if(keyNum==0x7F)
  194.                                                 break;
  195.                 }
  196.         }
  197. }

  198. //符号闪烁
  199. void twinkle2()
  200. {
  201.         while(keyNum!=0x7F)
  202.         {
  203.                 for(i = 0; i <5; i++)                //总共5个符号
  204.                 {
  205.                         for(ms = 50; ms > 0; ms--)        //显示50次,即肉眼可识别的停留时间
  206.                         {
  207.                                 for(k = 0; k < 16; k++)                        //显示一个字
  208.                                 {                                                         
  209.                                         //--因为字模软件取的数组是高电平有效,所以列要取反--//
  210.                                         HC595SendData(~(*(c[i] + 2*k + 1)),~(*(c[i] + 2*k )),
  211.                                                                                                  tab0[2*k],tab0[2*k + 1]);
  212.                                         keyNum=Key_Scan();
  213.                                         if(keyNum==0x7F)
  214.                                                 break;
  215.                                 }
  216.                                 HC595SendData(0xff,0xff,0,0);                                //清屏
  217.                                 if(keyNum==0x7F)
  218.                                                 break;
  219.                         }
  220.                         if(keyNum==0x7F)
  221.                                                 break;
  222.                 }
  223.         }
  224. }
复制代码


proteus和https://blog.csdn.net/zh_j_wei/article/details/104192813上的图是一致的

2.png (13.42 KB, 下载次数: 64)

完整字模图

完整字模图

1.png (10.36 KB, 下载次数: 60)

缺陷字模图

缺陷字模图

3.png (261.23 KB, 下载次数: 65)

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

使用道具 举报

沙发
ID:739545 发表于 2020-6-12 10:59 | 只看该作者
整体是对的,应该是某个连线有问题或者缺失
回复

使用道具 举报

板凳
ID:774521 发表于 2020-6-12 13:06 | 只看该作者
lovezjf234 发表于 2020-6-12 10:59
整体是对的,应该是某个连线有问题或者缺失

我把连线也发出来了 可以帮我看看哪里连错了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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