标题: 单片机+点阵显示汉字程序问题 为什么会整个点阵都亮了?而且闪烁的没有规律 [打印本页]

作者: 小小彩姬    时间: 2022-3-11 13:11
标题: 单片机+点阵显示汉字程序问题 为什么会整个点阵都亮了?而且闪烁的没有规律
想问一下为什么动态扫描点阵显示汉字的时候,为什么会整个点阵都亮了?而且闪烁的没有规律

单片机源程序如下:
  1. #include <reg51.h>
  2. #include "intrins.h"

  3. typedef unsigned int uint;
  4. typedef unsigned char uchar;

  5. sbit SRCLK = P3^6;  // 移位寄存器时钟
  6. sbit RCLK = P3^5;  //        控制存储寄存器的时钟
  7. sbit SER = P3^4; //串行数据输入

  8. uchar code ledduan[] = {
  9. /*--  文字:  普  --*/
  10. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  11. 0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,                          //从左往右从上往下依次扫描
  12. 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
  13. };

  14. uchar code ledwei[] = {
  15. 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  17. };


  18. void delay(uint z){
  19.         while (z--);
  20. }

  21. void hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4){
  22.         uint i;
  23.         SRCLK = 1;
  24.         RCLK = 1;
  25.         for (i = 0; i < 8; i++){
  26.                 SER = dat1 >> 7;
  27.                 dat1 <<= 1;

  28.                 SRCLK = 0;
  29.                 _nop_();                  
  30.         //        _nop_();
  31.                 SRCLK = 1;
  32.         }
  33.         for (i = 0; i < 8; i++){
  34.                 SER = dat2 >> 7;
  35.                 dat2 <<= 1;

  36.                 SRCLK = 0;
  37.                 _nop_();                  
  38.         //        _nop_();
  39.                 SRCLK = 1;
  40.         }
  41.         for (i = 0; i < 8; i++){
  42.                 SER = dat3 >> 7;
  43.                 dat3 <<= 1;

  44.                 SRCLK = 0;
  45.                 _nop_();                  
  46.         //        _nop_();
  47.                 SRCLK = 1;
  48.         }
  49.         for (i = 0; i < 8; i++){
  50.                 SER = dat4 >> 7;
  51.                 dat4 <<= 1;

  52.                 SRCLK = 0;
  53.                 _nop_();                  
  54.         //        _nop_();
  55.                 SRCLK = 1;
  56.         }
  57.         RCLK = 0;
  58.         _nop_();
  59.         //_nop_();
  60.         RCLK = 1;
  61. }

  62. void main() {
  63.         uchar i;
  64.         while(1){
  65.                 for (i = 0; i < 16; i++){
  66.                         hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan[i + 16],ledduan[i]);         //前两个控制列 后两个控制行         从右下角的点往左往上读           行连接了三极管的入口 列连接了三极管的出口
  67.                         delay(100);                                                              //例i=0;表示选中第一列,通过ledduan来选择哪几行亮
  68.                 }
  69.         }
  70. }
复制代码


作者: 名字不是重点    时间: 2022-3-11 13:39
595的控制接口,除了SER/SCK/RCK 外,还有一个OE。。没看到你的代码中有控制OE的地方。
作者: 小小彩姬    时间: 2022-3-11 15:40
名字不是重点 发表于 2022-3-11 13:39
595的控制接口,除了SER/SCK/RCK 外,还有一个OE。。没看到你的代码中有控制OE的地方。

OE这里好像是默认低电平
作者: 名字不是重点    时间: 2022-3-11 15:56
小小彩姬 发表于 2022-3-11 15:40
OE这里好像是默认低电平

默认低电平也可以,但你的代码要做消隐。
作者: 188610329    时间: 2022-3-11 16:03
这样改看看

void hc595SendByte(char dat1,char dat2,char dat3,char dat4){
        char i;
        for (i = 0; i < 8; i++)       {
                dat1 <<= 1;
                SER  = CY;
                SRCLK = 1;
                _nop_();                  
                SRCLK = 0;
        }


        for (i = 0; i < 8; i++)       {
                dat2 <<= 1;
                SER  = CY;
                SRCLK = 1;
                _nop_();                  
                SRCLK = 0;
        }

        for (i = 0; i < 8; i++)       {
                dat3 <<= 1;
                SER  = CY;
                SRCLK = 1;
                _nop_();                  
                SRCLK = 0;
        }

        for (i = 0; i < 8; i++)       {
                dat4 <<= 1;
                SER  = CY;
                SRCLK = 1;
                _nop_();                  
                SRCLK = 0;
        }

        RCLK = 1;
        RCLK = 0;
}

作者: 小小彩姬    时间: 2022-3-11 16:39
188610329 发表于 2022-3-11 16:03
这样改看看

void hc595SendByte(char dat1,char dat2,char dat3,char dat4){

还是闪的厉害,虽然能看出高光的字,但其他地方全都在闪
作者: 188610329    时间: 2022-3-11 17:27
小小彩姬 发表于 2022-3-11 16:39
还是闪的厉害,虽然能看出高光的字,但其他地方全都在闪

delay 改2000看看
作者: 小小彩姬    时间: 2022-3-11 17:30
188610329 发表于 2022-3-11 17:27
delay 改2000看看

没用。。几乎所有数字都试了一下
作者: 小小彩姬    时间: 2022-3-11 17:31
小小彩姬 发表于 2022-3-11 17:30
没用。。几乎所有数字都试了一下

是不是这板子上的这个模块坏了。。
作者: 188610329    时间: 2022-3-11 18:47
小小彩姬 发表于 2022-3-11 17:31
是不是这板子上的这个模块坏了。。

可能的话,上原理图吧,程序基本没有其他问题了,
然,HC595, 截至目前用了200多片,没有一片是坏的,也没有遇到过HC595比 屏幕先坏的。

从你说的现象分析,可能是2方面,
1)HC595 没有给100uf电容,而未选也没有用三极管驱动。
2)不知道你单片机具体型号,可能控制SRCLK, RLCK 这两个引脚的 IO驱动不够(毕竟要同时拉高4个芯片的电平),可能需要上拉或者用推挽输出。

看了原理图再说吧。
作者: xianfajushi    时间: 2022-3-11 19:00
看我帖子有荔枝
作者: 小小彩姬    时间: 2022-3-12 18:05
xianfajushi 发表于 2022-3-11 19:00
看我帖子有荔枝

但是我这个是16×16的,我不知道是不是我点阵的问题




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1