分享

8*8全彩点阵的使用

 求知881 2019-01-20

最近用6块8*8全彩点阵做了一个16*24的全彩屏,每个点可以显示7种颜色,这个可以实现一些好玩的功能,比如俄罗斯方块。


一、原理

1. 点阵屏的16行使用2个74hc138组成4-16译码,之后用三极管9012驱动,用100的限流电阻

2. 点阵屏的24列使用9个74hc595驱动,第一个595驱动第一列8*8点阵的红led,第二个595驱动第一列8*8点阵的绿led,第三个595驱动第一列8*8点阵的蓝led,以此类推,使用100的限流电阻

3. GND与VCC之间接入104瓷片电容与470uF 16V电解电容,增加抗干扰能力

4. 使用74hc245驱动595,提高驱动能力,这样单片机的IO口通过245就可以一次驱动一行的9个595了

5. 点阵的行用高电位,列用低电位


二、接口

1. A、B、C、D为行选线

2. G为屏使能线,接在74hc138上

3. CLK、LATCH、DATA为595驱动线,分别为输入触发、输出触发、串行数据输入

4. GND、VCC


三、实物图



四、代码

1. 头文件

  1. #ifndef __RGBDZH_H__
  2. #define __RGBDZH_H__
  3. #include <reg51.h>
  4. #include <intrins.h>
  5. #define BLOCK_ROW_COUNT 2
  6. #define BLOCK_COL_COUNT 3
  7. #define PIXEL_ROW_COUNT (BLOCK_ROW_COUNT*8)
  8. #define PIXEL_COL_COUNT (BLOCK_COL_COUNT*8)
  9. /*颜色定义*/
  10. #define NONE 0x00
  11. #define RED 0x01
  12. #define GREEN 0x02
  13. #define BLUE 0x04
  14. #define YELLOW (RED|GREEN)
  15. #define PURPLE (RED|BLUE)
  16. #define LBLUE (GREEN|BLUE)
  17. #define WHITE (RED|GREEN|BLUE)
  18. // 端口定义
  19. /*行选*/
  20. sbit A_Port = P1^0;
  21. sbit B_Port = P1^1;
  22. sbit C_Port = P1^2;
  23. sbit D_Port = P1^3;
  24. /*使能*/
  25. sbit En_Port = P1^4;
  26. /*输入触发*/
  27. sbit Clk_Port = P1^5;
  28. /*输出触发*/
  29. sbit Latch_Port = P1^6;
  30. /*串口输入*/
  31. sbit Data_Port = P1^7;
  32. // 接口函数
  33. void Lcd_Init();
  34. void Lcd_Clear();
  35. void Lcd_Refresh();
  36. void Lcd_SetPixel( unsigned char x, unsigned char y, unsigned char color);
  37. unsigned char Lcd_GetPixel( unsigned char x, unsigned char y);
  38. #endif

2. 源文件

  1. #include "RGBDZh.h"
  2. // 开启:一次扫描1*24
  3. // 关闭:一次扫描1*8, 一行分三次扫描
  4. #define ENABLE_ROW_SCAN
  5. #define COLOR_BASE_COUNT 3
  6. #define CACHE_DATA_SIZE (PIXEL_ROW_COUNT*BLOCK_COL_COUNT*COLOR_BASE_COUNT)
  7. static unsigned char xdata cache_data[CACHE_DATA_SIZE];
  8. static unsigned char xdata cur_row = 0;
  9. #ifndef ENABLE_ROW_SCAN
  10. static unsigned char xdata cur_block = 0;
  11. #endif
  12. void Lcd_Init()
  13. {
  14. Lcd_Clear();
  15. }
  16. void Lcd_Clear()
  17. {
  18. unsigned int i;
  19. for( i = 0; i < CACHE_DATA_SIZE; i ++)
  20. cache_data[i] = 0xff;
  21. cur_row = 0;
  22. #ifndef ENABLE_ROW_SCAN
  23. cur_block = 0;
  24. #endif
  25. }
  26. void Lcd_Refresh()
  27. {
  28. char i, j;
  29. /*74HC595*/
  30. /*串入数据*/
  31. for( i = BLOCK_COL_COUNT * COLOR_BASE_COUNT - 1; i >= 0; i --)
  32. {
  33. unsigned char buff = cache_data[BLOCK_COL_COUNT * COLOR_BASE_COUNT * cur_row + i];
  34. for( j = 0; j < 8; j ++)
  35. {
  36. #ifndef ENABLE_ROW_SCAN
  37. if( i / COLOR_BASE_COUNT != cur_block)
  38. Data_Port = 1;
  39. else
  40. #endif
  41. if(( buff & 0x01) == 0x01)
  42. Data_Port = 1;
  43. else
  44. Data_Port = 0;
  45. Clk_Port = 0;
  46. _nop_();
  47. _nop_();
  48. Clk_Port = 1;
  49. _nop_();
  50. _nop_();
  51. buff >>= 1;
  52. }
  53. }
  54. /*并出数据*/
  55. Latch_Port = 0;
  56. _nop_();
  57. _nop_();
  58. Latch_Port = 1;
  59. _nop_();
  60. _nop_();
  61. Latch_Port = 0;
  62. _nop_();
  63. _nop_();
  64. /*74HC138*/
  65. /*显示数据*/
  66. En_Port = 1;
  67. A_Port = cur_row & 0x01;
  68. B_Port = ( cur_row >> 1) & 0x01;
  69. C_Port = ( cur_row >> 2) & 0x01;
  70. D_Port = ( cur_row >> 3) & 0x01;
  71. En_Port = 0;
  72. #ifndef ENABLE_ROW_SCAN
  73. cur_block ++;
  74. if( cur_block >= BLOCK_COL_COUNT)
  75. {
  76. #endif
  77. cur_row ++;
  78. if( cur_row >= PIXEL_ROW_COUNT)
  79. cur_row = 0;
  80. #ifndef ENABLE_ROW_SCAN
  81. cur_block = 0;
  82. }
  83. #endif
  84. }
  85. void Lcd_SetPixel( unsigned char x, unsigned char y, unsigned char color)
  86. {
  87. unsigned int offset;
  88. unsigned char mask;
  89. if( x >= PIXEL_COL_COUNT || y >= PIXEL_ROW_COUNT)
  90. return;
  91. offset = BLOCK_COL_COUNT * COLOR_BASE_COUNT * y + x / 8 * COLOR_BASE_COUNT;
  92. mask = 0x01 << ( 7 - x % 8);
  93. // Red
  94. cache_data[offset] |= mask;
  95. if( color & RED)
  96. cache_data[offset] &= ~mask;
  97. // Green
  98. cache_data[offset + 1] |= mask;
  99. if( color & GREEN)
  100. cache_data[offset + 1] &= ~mask;
  101. // Blue
  102. cache_data[offset + 2] |= mask;
  103. if( color & BLUE)
  104. cache_data[offset + 2] &= ~mask;
  105. }
  106. unsigned char Lcd_GetPixel( unsigned char x, unsigned char y)
  107. {
  108. unsigned char r = NONE;
  109. unsigned int offset;
  110. unsigned char mask;
  111. if( x >= PIXEL_COL_COUNT || y >= PIXEL_ROW_COUNT)
  112. return r;
  113. offset = BLOCK_COL_COUNT * COLOR_BASE_COUNT * y + x / 8 * COLOR_BASE_COUNT;
  114. mask = 0x01 << ( 7 - x % 8);
  115. // Red
  116. if(( cache_data[offset] & mask) == 0x00)
  117. r |= RED;
  118. // Green
  119. if(( cache_data[offset + 1] & mask) == 0x00)
  120. r |= GREEN;
  121. // Blue
  122. if(( cache_data[offset + 2] & mask) == 0x00)
  123. r |= BLUE;
  124. return r;
  125. }

五、测试代码

  1. #include "RGBDZh.h"
  2. int main()
  3. {
  4. unsigned char index = 0;
  5. Lcd_Init();
  6. TMOD = 0x01;
  7. TH0 = 0xfc;
  8. TL0 = 0x66;
  9. TR0 = 1;
  10. EA = 1;
  11. ET0 = 1;
  12. while(1)
  13. {
  14. unsigned char colors[7] = { RED, GREEN, BLUE, YELLOW, PURPLE, LBLUE, WHITE};
  15. unsigned int i;
  16. for( i = 0; i < 16 * 24; i ++)
  17. {
  18. Lcd_SetPixel( i % 24, i / 24, colors[index++]);
  19. if( index >= 7)
  20. index = 0;
  21. {
  22. unsigned int j;
  23. for(j=0;j<5000;j++);
  24. }
  25. }
  26. Lcd_Clear();
  27. }
  28. return 0;
  29. }
  30. void disp() interrupt 1 using 3
  31. {
  32. TH0 = 0xfc;
  33. TL0 = 0x66;
  34. Lcd_Refresh();
  35. }


请移步www.yintju03.com/blog

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多