找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
ID:1007138 发表于 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. }
复制代码

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

使用道具 举报

沙发
ID:824490 发表于 2022-3-11 13:39 | 只看该作者
595的控制接口,除了SER/SCK/RCK 外,还有一个OE。。没看到你的代码中有控制OE的地方。
回复

使用道具 举报

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

OE这里好像是默认低电平
回复

使用道具 举报

地板
ID:824490 发表于 2022-3-11 15:56 | 只看该作者
小小彩姬 发表于 2022-3-11 15:40
OE这里好像是默认低电平

默认低电平也可以,但你的代码要做消隐。
回复

使用道具 举报

5#
ID:624769 发表于 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;
}
回复

使用道具 举报

6#
ID:1007138 发表于 2022-3-11 16:39 | 只看该作者
188610329 发表于 2022-3-11 16:03
这样改看看

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

还是闪的厉害,虽然能看出高光的字,但其他地方全都在闪
回复

使用道具 举报

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

delay 改2000看看
回复

使用道具 举报

8#
ID:1007138 发表于 2022-3-11 17:30 | 只看该作者

没用。。几乎所有数字都试了一下
回复

使用道具 举报

9#
ID:1007138 发表于 2022-3-11 17:31 | 只看该作者
小小彩姬 发表于 2022-3-11 17:30
没用。。几乎所有数字都试了一下

是不是这板子上的这个模块坏了。。
回复

使用道具 举报

10#
ID:624769 发表于 2022-3-11 18:47 | 只看该作者
小小彩姬 发表于 2022-3-11 17:31
是不是这板子上的这个模块坏了。。

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

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

看了原理图再说吧。
回复

使用道具 举报

11#
ID:332444 发表于 2022-3-11 19:00 | 只看该作者
看我帖子有荔枝
回复

使用道具 举报

12#
ID:1007138 发表于 2022-3-12 18:05 | 只看该作者

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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