找回密码
 立即注册

QQ登录

只需一步,快速开始

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

16*16的点阵 我想让它闪烁隔一秒显示一下,用的是4个595和2个138驱动

[复制链接]
跳转到指定楼层
楼主
各位大神些,本人小白一个,请教一个问题。我买了一块16*16的点阵,用的是4个595和2个138驱动。现在的程序能正确显示图形。但我想让它闪烁隔一秒显示一下。要怎么才能闪烁呢?
  1. /*-----------------------------------------------
  2.   名称:595控制4汉字点阵屏
  3.   内容:屏+5V、GND连接电源5V
  4.         P0.0-P0.3分别连接A、B、C、D,用于控制16行,通过2路HC138控制
  5.         SCK时钟连接P2.5
  6.         LATCH锁存连接P2.6
  7.         R1红色数据信号连接至P0.4
  8.         G1绿色数据信号连接至P2.4,如果使用单红色屏此信号无需连接
  9.         OE使能端一般接GND,可以用IO引脚PWM控制亮度
  10.         或者使用此引脚控制拖尾现象。
  11.   现象:使用普通速度51系列单片机。屏幕出现笑脸图标
  12. ------------------------------------------------*/
  13. #include<reg52.h>
  14. #include <intrins.h>  
  15. #define uchar unsigned char  
  16. #define uint  unsigned int


  17. sbit Key1=P1^0;   //定义单片机P1口的第0位(即P1.0)为输入
  18. sbit Key2=P1^1;   //定义单片机P1口的第0位(即P1.1)为输入
  19. sbit Key3=P1^2;   //定义单片机P1口的第0位(即P1.2)为输入


  20. sbit T_STR = P2^6;       //锁存引脚,屏上标识位STR
  21. sbit R1    = P0^4;       //数据引脚,屏上标识R1
  22. sbit G1    = P2^4;       //数据引脚,屏上标识G1
  23. sbit T_CLK = P2^5;       //时钟引脚,屏上标识位CLK
  24. sbit OE    = P2^1;       //使能引脚,屏上标识EN/OE

  25. unsigned char tab[8];
  26. unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行数据

  27. /*-----------------------------------------------
  28.              16x16汉字取模数据
  29. ------------------------------------------------*/
  30. unsigned char code hztest[][32]=    //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
  31. {
  32. /*--  调入了一幅图像:K:\C51\汉字 取模程序\前行16.bmp  --*/
  33. /*--  宽度x高度=16x16  --*/
  34. 0x80,0x01,0xC0,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0xDE,0x7B,0xCF,0xF3,
  35. 0xC7,0xE3,0xC3,0xC3,0xC1,0x83,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,



  36. /*--  调入了一幅图像:K:\C51\汉字 取模程序\左转16.bmp  --*/
  37. /*--  宽度x高度=16x16  --*/
  38. 0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0x78,0x00,0x3C,0x00,0xFE,0xFF,0xFF,0xFF,
  39. 0xFF,0xFF,0xFE,0xFF,0x3C,0x00,0x78,0x00,0xF0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,



  40. /*--  调入了一幅图像:K:\C51\汉字 取模程序\右转16.bmp  --*/
  41. /*--  宽度x高度=16x16  --*/
  42. 0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1E,0x00,0x3C,0xFF,0x7F,0xFF,0xFF,
  43. 0xFF,0xFF,0xFF,0x7F,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,

  44. };
  45. /*-----------------------------------------------
  46.              向595写入一个字节 单红色
  47. ------------------------------------------------*/
  48. void InputByte( uchar DataR1) //写一个字节
  49. {
  50. uchar i;
  51. for(i=8; i>0; i--)
  52. {
  53. R1 = !(DataR1&0x01);                  
  54. T_CLK = 0;
  55. T_CLK = 1;
  56. DataR1 = DataR1 >> 1;
  57. }
  58. }
  59. /*-----------------------------------------------
  60.              向595写入两个字节 双色
  61. ------------------------------------------------*/
  62. void Input2Byte( uchar DataR1,uchar DataG1) //写一个字节
  63. {
  64. uchar i;
  65. for(i=8; i>0; i--)
  66. {
  67. R1 = !(DataR1&0x01);   
  68. G1 = !(DataG1&0x01);               
  69. T_CLK = 0;
  70. T_CLK = 1;
  71. DataR1 = DataR1 >> 1;
  72. DataG1 = DataG1 >> 1;
  73. }
  74. }



  75. void Write_A(uint k) //写一个字符
  76. {
  77. static uchar count,j;
  78. uchar i;

  79. T_STR=0;       //锁存释放
  80.    
  81. for(j=0;j<1;j++) //取每个汉字的前2个字节,数据传输完成后锁存输出即可 j表示汉字个数,如果是3个汉字屏就可以修改成3
  82.         {
  83.     InputByte(hztest[j][k]);
  84.     InputByte(hztest[j][k+1]);
  85.         }
  86. OE=1;  //暂时关闭屏幕,防止出现鬼影,如果没有使用该引脚控制则会出现拖影现象。
  87. T_STR=1;      //锁存有效,此时一行的数据显示到屏上
  88. P0=DIS[15-count]|0xf0;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描其他15行
  89. OE=0;//使能
  90. count++;
  91. i+=2;              //累加调用下一行数据
  92. if(count==16)
  93.     count=0;
  94. if(i==32)
  95.     i=0;
  96. }

  97. //--------------------------------------------
  98. /*n毫秒的延时程序*/  
  99. void Delay_xms(uint x)  
  100. {  
  101. uint i,j;  
  102. for(i=0;i<x;i++)  
  103.   for(j=0;j<112;j++);  
  104. }



  105. /*-----------------------------------------------
  106.                       主程序
  107. ------------------------------------------------*/
  108. main()
  109. {


  110. while(1)
  111. {

  112.   Write_A(1);
  113.   Delay_xms(2000);//这名出错,一加上就不能正确显示;



  114. }
  115. }
复制代码


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

使用道具 举报

沙发
ID:111634 发表于 2016-10-20 21:42 | 只看该作者
本帖最后由 zl2168 于 2016-10-21 09:09 编辑

实例66  LED 16×16点阵扫描显示汉字
电路设计

该案例技术要求与你的完全相同,且比你的更简洁有效。
595与164同属串入并出移位寄存器,区别是595有输出控制,移位完毕再输出;164是边移边输出。因此用2片164有16机器周期的显示混乱期,而595没有。不过对于显示来讲,人眼根本不能察觉。若晶振为12MHz,16机器周期只有16us,人眼能察觉的至少20ms以上,20ms=20000us>>16us。而且,595输出控制要多花费一个I/O引脚。你要用4片595?怎么用?
154可顶2片138。154是4-16译码器,138是3-8译码器,控制列扫描一片154就够了。
至于秒闪烁,只需在每次显示0.5s后,164置CLR=0或595置OE=0,停显示0.5s,就行。
汉字编码
汉字编码概述   …
汉字点阵显示代码   …
汉字点阵取模软件   
程序设计   
Keil调试   
Proteus仿真
Proteus仿真一下,确认有效。
实例66a LED 16×16点阵汉字显示.rar (48.21 KB, 下载次数: 17)



以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解













































































回复

使用道具 举报

板凳
ID:123289 发表于 2016-10-20 22:06 | 只看该作者
做一个标记位(如:B_FLASH),
做一个0.5秒定时器(可利用中断,每0.5秒置标记,如:B_05S)
当0.5秒到时(如:B_05S=1时),将B_FLASH求反(B_FLASH=~B_FLASH,当然记得复位B_05S)。
在你现有的输出数据动作前,增加“插入”一个动作,就是将输出数据与B_FLASH“与”一下再输出。
回复

使用道具 举报

地板
ID:123289 发表于 2016-10-20 22:08 | 只看该作者
凡是需要闪的数据位,就与B_FLASH“与”一下再送出,不需要闪的,不与。
回复

使用道具 举报

5#
ID:111634 发表于 2016-10-21 09:20 | 只看该作者
实例66  LED 16×16点阵扫描显示汉字
该案例技术要求与你的完全相同,且比你的更简洁有效。
595与164同属串入并出移位寄存器,区别是595有输出控制,移位完毕再输出;164是边移边输出。因此用2片164有16机器周期的显示混乱期,而595没有。不过对于显示来讲,人眼根本不能察觉。若晶振为12MHz,16机器周期只有16us,人眼能察觉的至少20ms以上,20ms=20000us>>16us。而且,595输出控制要多花费一个I/O引脚。你要用4片595?怎么用?
154可顶2片138。154是4-16译码器,138是3-8译码器,控制列扫描一片154就够了。
至于秒闪烁,只需在每次显示0.5s后,164置CLR=0或595置OE=0,停显示0.5s,就行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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