当前位置:   article > 正文

使用74HC595完成16*16led矩阵广告牌(51单片机软件仿真)_74hc595点阵仿真

74hc595点阵仿真

目录

74HC595简介(个人理解)与模块代码

软件仿真和代码 


74HC595简介(个人理解)与模块代码

SHCP是写入595芯片数据的配置

STCP是发送595芯片内信息的配置

DS是数据配置的区域

595芯片有9个输出引脚,最后一个是供给下一块串联的595使用的,下一块串联的595stcp和shcp与上一块连接的引脚一致,下一块的DS与上一块的第9个引脚相连。

实现了3位引脚当8位使用的功能,节省引脚。

595串联的数据流动规则:倘若堆了16位数据进来,前八位会被推送到第二块串联的595芯片之中,后八位放在第一块595芯片内

通用配置:

定义引脚

  1. sbit DS=P2^1;
  2. sbit shcp=P2^0;
  3. sbit stcp=P2^2;

写数值

  1. unsigned char i;
  2. for(i=0; i<8; i++)
  3. {
  4. DS = Data_row & (0x80 >> i); // 从高到低遍历写入数据
  5. shcp = 0;
  6. _nop_(); // 软件仿真处理速度较慢,故做此延迟
  7. _nop_();
  8. shcp = 1;
  9. }

发送数值

  1. stcp = 0;
  2. _nop_();
  3. _nop_();
  4. stcp = 1;

软件仿真和代码 

用的pctolcd2002生成字模,这个可以设置的东西有很多,相较于其他的软件,这个更好用。

本次实验中使用的字模显示逻辑是

红色代表第一次刷新的字模;橙色代表第二次刷新的字模;蓝色代表第三次刷新的字模;绿色代表第四次刷新的字模。

显示流动刷新逻辑——一个简单的定时器输出给灯亮的那部分代码即可

  1. 主函数部分
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include "Delay.h"
  5. #include "timer0.h"
  6. #include "matrixled.h"
  7. // 定义常量
  8. #define TOTAL_ROWS 16
  9. #define SHIFT_INTERVAL 100 // 定义0.1s的间隔为100
  10. // 定义变量
  11. unsigned char offset = 0; // 显示上升变量
  12. // “我是龟甲”字模数组
  13. unsigned code MatrixLed_Code[128] = {
  14. 0x04, 0x40, 0x0E, 0x50, 0x78, 0x48, 0x08, 0x48, 0x08, 0x40,
  15. 0xFF, 0xFE, 0x08, 0x40, 0x08, 0x44, 0x0A, 0x44, 0x0C, 0x48,
  16. 0x18, 0x30, 0x68, 0x22, 0x08, 0x52, 0x08, 0x8A, 0x2B, 0x06,
  17. 0x10, 0x02, 0x1F, 0xF0, 0x10, 0x10, 0x10, 0x10, 0x1F, 0xF0,
  18. 0x10, 0x10, 0x10, 0x10, 0x1F, 0xF0, 0x00, 0x00, 0xFF, 0xFE,
  19. 0x01, 0x00, 0x11, 0x00, 0x11, 0xF8, 0x11, 0x00, 0x29, 0x00,
  20. 0x45, 0x00, 0x83, 0xFE, 0x04, 0x00, 0x04, 0x00, 0x0F, 0xE0,
  21. 0x10, 0x20, 0x20, 0x40, 0x7F, 0xF8, 0xA1, 0x08, 0x21, 0x08,
  22. 0x3F, 0xF8, 0x21, 0x08, 0x21, 0x08, 0x3F, 0xF8, 0x21, 0x08,
  23. 0x01, 0x02, 0x01, 0x02, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0xF8,
  24. 0x21, 0x08, 0x21, 0x08, 0x21, 0x08, 0x3F, 0xF8, 0x21, 0x08,
  25. 0x21, 0x08, 0x21, 0x08, 0x3F, 0xF8, 0x21, 0x08, 0x01, 0x00,
  26. 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00
  27. };
  28. // 扫描矩阵LED
  29. void main(void)
  30. {
  31. Timer0_Init(); // 定时器初始化
  32. while(1)
  33. {
  34. static unsigned char i = 0;
  35. // 输入两组八位的行选数据,选择十六行的其中一行点亮
  36. if(i < 8)
  37. {
  38. HC595_write_row(0x00);
  39. HC595_write_row(0x01 << i);
  40. HC595_Latch_row();
  41. }
  42. else // i >= 8
  43. {
  44. HC595_write_row(0x01 << i - 8);
  45. HC595_write_row(0x00);
  46. HC595_Latch_row();
  47. }
  48. // 列选灯亮,输入两组数据,左半边一个,右半边一个
  49. HC595_write_column(~MatrixLed_Code[2 * (i + offset) + 1]);
  50. HC595_Latch_column();
  51. HC595_write_column(~MatrixLed_Code[2 * (i + offset)]);
  52. HC595_Latch_column();
  53. Delay(1);
  54. // 消影操作,但效果很奇怪,故注释掉了
  55. // HC595_write_row(0x00);
  56. // HC595_write_row(0x00);
  57. // HC595_Latch_row();
  58. i++;
  59. if(i == TOTAL_ROWS)
  60. i = 0;
  61. }
  62. }
  63. // 定时器0中断服务函数
  64. void Timer0_Routine() interrupt 1
  65. {
  66. static unsigned char count = 0;
  67. TL0 = 0x66; // 设置定时初始值,1ms
  68. TH0 = 0xFC;
  69. count++;
  70. // 每隔0.1s,显示就往下移一行
  71. if(count == SHIFT_INTERVAL)
  72. {
  73. count = 0;
  74. offset++;
  75. if(offset == 64)
  76. offset = 0;
  77. }
  78. }
  79. 74HC595控制点阵屏显示模块
  80. #include<reg51.h>
  81. #include<intrins.h>
  82. #include "Delay.h"
  83. // 定义引脚
  84. sbit DS=P2^1; // 普通的是行选的74HC595
  85. sbit shcp=P2^0;
  86. sbit stcp=P2^2;
  87. sbit DS1=P2^4; // 带数字1的是行选灯亮的74HC595
  88. sbit shcp1=P2^3;
  89. sbit stcp1=P2^5;
  90. // 向595芯片写行数据
  91. void HC595_write_row(unsigned char Data_row)
  92. {
  93. unsigned char i;
  94. for(i=0; i<8; i++)
  95. {
  96. DS = Data_row & (0x80 >> i); // 从高到低遍历写入八位行选数据
  97. shcp = 0;
  98. _nop_(); // 软件仿真处理速度较慢,故做此延迟
  99. _nop_();
  100. shcp = 1;
  101. }
  102. }
  103. // 向595芯片写列数据
  104. void HC595_write_column(unsigned char Data_column)
  105. {
  106. unsigned char i;
  107. for(i=0; i<8; i++)
  108. {
  109. DS1 = Data_column & (0x80 >> i); // 从高到低遍历写入八位行选灯亮的(列)数据
  110. shcp1 = 0;
  111. _nop_();
  112. _nop_();
  113. shcp1 = 1;
  114. }
  115. }
  116. // 触发595的行锁存
  117. void HC595_Latch_row(void)
  118. {
  119. stcp = 0;
  120. _nop_();
  121. _nop_();
  122. stcp = 1;
  123. }
  124. // 触发595的列锁存
  125. void HC595_Latch_column(void)
  126. {
  127. stcp1 = 0;
  128. _nop_();
  129. _nop_();
  130. stcp1 = 1;
  131. }
  132. 定时器模块
  133. #include <REGX52.H>
  134. /**
  135. * @brief 定时器0初始化,1毫秒@11.0592MHz
  136. * @param 无
  137. * @retval无
  138. */
  139. void Timer0_Init()//创建精确的时间延时或进行时间相关的任务
  140. {
  141. TMOD &= 0xF0; //设置定时器模式
  142. TMOD |= 0x01; //设置定时器模式
  143. TL0 = 0x66; //设置定时初始值
  144. TH0 = 0xFC; //设置定时初始值
  145. TF0 = 0; //清除TF0标志
  146. TR0 = 1; //定时器0开始计时
  147. ET0=1;//允许中断
  148. EA=1;//允许总中断
  149. PT0=0;//配置优先级
  150. }
  151. Delay延时模块
  152. #include <intrins.h>
  153. void Delay(unsigned int xms)
  154. {
  155. unsigned char data i, j;
  156. while(xms--)
  157. {
  158. _nop_();
  159. i = 2;
  160. j = 239;
  161. do
  162. {
  163. while (--j);
  164. } while (--i);
  165. }
  166. }

软件仿真

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/791267
推荐阅读
相关标签
  

闽ICP备14008679号