找回密码
 立即注册
查看: 409|回复: 0

STC89C52RC 驱动16x64LED点阵模块驱动记录(二)左移实现

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-07 08:04:39

17

主题

65

回帖

1674

积分

金牌会员

积分
1674
发表于 2023-11-24 21:44:25 | 显示全部楼层 |阅读模式
一、循环左移源码
  1. #include <STC89C5xRC.H>
  2. #include<intrins.h>
  3. sbit SH_CP = P1^5;
  4. sbit DS = P2^7;
  5. sbit ST_CP = P1^6;
  6. //PCtoLCD2002
  7. //
  8. unsigned char code Table_row[] = {
  9. //阳码,顺向,逐行式,C51,左右反转
  10. 0xFE,0xFF,0xFD,0xFB,0xFD,0xF7,0xC0,0x17,0xF7,0xFF,0xF7,0xBF,0xFB,0x70,0xFA,0xF7,
  11. 0xFD,0xF7,0xFA,0xF7,0xF7,0x77,0xEF,0xB7,0xEF,0xD7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"这",1*/
  12. 0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xC0,0x01,0xFF,0xDF,0xFF,0x6F,0xFF,0x77,0xFF,0x7B,
  13. 0xE0,0x03,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xFF,0x5F,0xFF,0xBF,/*"东",2*/
  14. 0xFF,0xFF,0x80,0x00,0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xE0,0x03,0xED,0xDB,0xED,0xDB,
  15. 0xED,0xDB,0xED,0xDB,0xE3,0xEB,0xEF,0xF3,0xEF,0xFB,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,/*"西",3*/
  16. 0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,
  17. 0xFE,0xBF,0xFE,0xBF,0xFD,0xDF,0xFD,0xDF,0xFB,0xAF,0xF7,0x77,0xEF,0x7B,0x9F,0xFC,/*"太",4*/
  18. 0xFE,0xFB,0xFE,0xFB,0xC2,0xFB,0xFC,0x3B,0xF5,0xEA,0xDB,0xF2,0xD4,0xFA,0xCF,0x3A,
  19. 0xFF,0xFB,0x80,0x1B,0xF6,0xFB,0xF6,0xFB,0xB7,0x75,0xB7,0x6D,0x8F,0xBD,0xFF,0xDE,/*"烧",5*/
  20. 0xFD,0xFF,0xFB,0xE1,0xFB,0xED,0x80,0x0D,0xFF,0xED,0xFF,0xE1,0xF6,0xED,0xD5,0xAD,
  21. 0xDB,0xAD,0xDB,0xA1,0xD5,0xAD,0xD6,0xAD,0xDF,0xAD,0xDF,0xAD,0xC0,0x2D,0xDF,0xE6,/*"脑",6*/
  22. };
  23. /*
  24. void delayms(unsigned int m)
  25. {
  26.         int i,j;
  27.         for(i=0; i<m; i++)
  28.                 for(j=0; j<120; j++);
  29. }
  30. */
  31. void HC595(unsigned char dat)
  32. {
  33.         unsigned char j;
  34.         for(j=0;j<8;j++)
  35.         {
  36.                 SH_CP = 0;        //为移位准备
  37.                 DS = dat & 0x01;        //先低位
  38.                 dat=dat>>1;
  39.                 SH_CP =1;          //上升沿,移位
  40.         }
  41. }
  42. void Matrix16x16(unsigned char num)
  43. {
  44.         unsigned int k,i,t,y,t1;
  45.         unsigned int m,n;
  46.         unsigned int Char_num=num*32;
  47.        
  48.         for(m=0;m<Char_num;m++)    //动起来吧
  49.         {
  50.                 t=m/8;                //位移除以8取整数部分
  51.                 t1=m/16;    //位移除以16取整数部分
  52.                 y=m%8;                                        //位移除以8取余部分
  53.                 for(n=0;n<1;n++)//控制显示速度,防止闪烁,设成1了,提高速度,闪烁严重,可以把STEP 设置大一些,如n+=2,一次迈2步,显示速度会提高
  54.                 {
  55.                         for(k=0;k<16;k++)        //行扫描
  56.                         {
  57.                                 //P1=0xff;
  58.                                
  59.                                 for(i=0;i<num;i++)   //控制第几个字
  60.                                 {
  61.                                        
  62.                                         //HC595(Table_row[(32*i+2*k+1)]);                //
  63.                                         //HC595(Table_row[(32*i+2*k+0)]);                //
  64.                                                 if(t%2==0){
  65.                                                         HC595(Table_row[(32*(i+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+t1)+2*k+0)%Char_num]<<(8-y));
  66.                                                         HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
  67.                                                 }
  68.                                                 else
  69.                                                 {
  70.                                                         HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
  71.                                                         HC595(Table_row[(32*(i+1+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+0)%Char_num]<<(8-y));
  72.                                                 }
  73.                             }
  74.                             ST_CP = 0;
  75.                             ST_CP = 1; //并行输出
  76.                             
  77.                       P1=16-k;    //从左往右显示,P1低4位为74HC154输入,高4位未使用
  78.                                         //_nop_();
  79.                                         //_nop_();
  80.                                         //_nop_();
  81.                                         //_nop_();
  82.                                 //delayms(2);  //所有的延时都关了,速度还有点欠缺,晃眼
  83.                         }
  84.                 }
  85.         }
  86. }
  87. void main(){
  88.         while(1){
  89.                 Matrix16x16(4);
  90.         }
  91. }
复制代码
二、左移不循环源码
  1. #include <STC89C5xRC.H>
  2. #include<intrins.h>
  3. sbit SH_CP = P1^5;
  4. sbit DS = P2^7;
  5. sbit ST_CP = P1^6;
  6. //PCtoLCD2002
  7. //
  8. unsigned char code Table_row[] = {
  9. //这个调了好久,现在贴的不知道是不是实际跑的字模了
  10. //阳码,顺向,逐行式,C51,左右反转
  11.         /*
  12. 0xFE,0xFF,0xFE,0xFF,0xFE,0xC0,0xC0,0xDF,0xDF,0x5F,0xEF,0x6D,0xFD,0xAB,0xFD,0xD7,
  13. 0xFD,0xF7,0xFA,0xEB,0xFA,0xDB,0xF7,0x5D,0xF7,0x7E,0xEF,0xBF,0xDF,0xDF,0xBF,0xEF,
  14. 0xFF,0xFF,0xFE,0xFB,0xC3,0x37,0xDB,0xB7,0xDB,0xBF,0xDB,0xBF,0xDB,0xB0,0xDB,0xB7,
  15. 0xDB,0xB7,0xD2,0xB7,0xEB,0x37,0xFB,0xB7,0xFB,0xF7,0xFB,0xEB,0x80,0x1D,0xFF,0xFF,
  16. 0xFF,0x7F,0xEF,0x7B,0xEF,0x77,0xF7,0x6F,0xFB,0x6F,0xFF,0x7F,0x80,0x00,0xFD,0xDF,
  17. 0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xBD,0xEF,0xBD,0xEF,0xBD,0xF7,0x83,0xFB,0xFF,0xFC,
  18. 0xFE,0xEF,0xFE,0xEF,0xFE,0xEF,0x80,0x6D,0xFD,0x6D,0xFB,0xAD,0xFB,0xCD,0xFF,0xED,
  19. 0xC0,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xC0,0x6F,0xDF,0x6F,0xFF,0xEF,
  20. */
  21. 0xFE,0xFF,0xFD,0xFB,0xFD,0xF7,0xC0,0x17,0xF7,0xFF,0xF7,0xBF,0xFB,0x70,0xFA,0xF7,
  22. 0xFD,0xF7,0xFA,0xF7,0xF7,0x77,0xEF,0xB7,0xEF,0xD7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"这",1*/
  23. 0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xC0,0x01,0xFF,0xDF,0xFF,0x6F,0xFF,0x77,0xFF,0x7B,
  24. 0xE0,0x03,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xFF,0x5F,0xFF,0xBF,/*"东",2*/
  25. 0xFF,0xFF,0x80,0x00,0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xE0,0x03,0xED,0xDB,0xED,0xDB,
  26. 0xED,0xDB,0xED,0xDB,0xE3,0xEB,0xEF,0xF3,0xEF,0xFB,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,/*"西",3*/
  27. 0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,
  28. 0xFE,0xBF,0xFE,0xBF,0xFD,0xDF,0xFD,0xDF,0xFB,0xAF,0xF7,0x77,0xEF,0x7B,0x9F,0xFC,/*"太",4*/
  29. 0xFE,0xFB,0xFE,0xFB,0xC2,0xFB,0xFC,0x3B,0xF5,0xEA,0xDB,0xF2,0xD4,0xFA,0xCF,0x3A,
  30. 0xFF,0xFB,0x80,0x1B,0xF6,0xFB,0xF6,0xFB,0xB7,0x75,0xB7,0x6D,0x8F,0xBD,0xFF,0xDE,/*"烧",5*/
  31. 0xFD,0xFF,0xFB,0xE1,0xFB,0xED,0x80,0x0D,0xFF,0xED,0xFF,0xE1,0xF6,0xED,0xD5,0xAD,
  32. 0xDB,0xAD,0xDB,0xA1,0xD5,0xAD,0xD6,0xAD,0xDF,0xAD,0xDF,0xAD,0xC0,0x2D,0xDF,0xE6,/*"脑",6*/
  33. 0xFD,0xFB,0x81,0x83,0xF6,0xED,0xFF,0xFE,0xE0,0x03,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,
  34. 0xE0,0x03,0xEF,0xFB,0xE0,0x03,0xFB,0xEF,0x80,0x00,0xFB,0xEF,0xFB,0xF7,0xFB,0xFB,/*"算",0*/
  35. 0xFD,0xFF,0xFD,0xFB,0xFD,0xF7,0xFD,0xF7,0xC0,0x1E,0xFD,0xFD,0xFD,0xFD,0xFD,0xF7,
  36. 0x80,0x07,0xFD,0xFB,0xFE,0xF8,0xFF,0x7B,0xF7,0xBB,0xEF,0xDB,0xC0,0x0B,0xDF,0xDF,/*"法",1*/
  37. 0xFE,0xFF,0xFE,0xFB,0xFE,0xFB,0xDE,0xFB,0xEE,0xFB,0xF6,0xFB,0xFA,0x83,0xFC,0xFB,
  38. 0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,0xBE,0xFB,0xBE,0x9B,0xBE,0xE3,0x81,0xFB,0xFF,0xFF,/*"比",2*/
  39. 0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0x80,0x40,0xFF,0xFD,0xEE,0xF5,0xDF,0x76,0xBF,0x80,
  40. 0xEE,0xF7,0xEE,0xF7,0xF5,0xC7,0xF5,0xF0,0xFB,0xF5,0xF5,0xF7,0xEE,0xF7,0x9F,0x37,/*"较",3*/
  41. 0xFE,0xF7,0xFD,0xF7,0xFD,0xF7,0xFF,0xF7,0xC0,0x37,0xFF,0xC0,0xEF,0xF7,0xEF,0x77,
  42. 0xEF,0x77,0xF6,0xF7,0xF6,0xF7,0xF6,0xC7,0xFA,0xF8,0xFB,0xFD,0x80,0x1F,0xFF,0xFF,/*"垃",4*/
  43. 0xFF,0xF7,0xE0,0x17,0xEF,0x77,0xF7,0x77,0xF7,0x77,0xFB,0x40,0xC3,0x77,0xDF,0x77,
  44. 0xDF,0x77,0xEE,0xB7,0xEE,0x87,0xF5,0xB8,0xFB,0xDD,0xF5,0xDF,0xEE,0xEF,0x9F,0x3F,/*"圾",5*/
  45. 0xFD,0xFF,0xFD,0xFB,0xC0,0x17,0xFD,0xF7,0xE0,0x3F,0xED,0xBF,0xED,0xB0,0xE0,0x37,
  46. 0xF8,0xF7,0xF5,0x77,0xED,0xB7,0xDD,0xD7,0xFD,0xF7,0xFF,0xEB,0x80,0x1D,0xFF,0xFF,/*"速",6*/
  47. 0xFF,0x7F,0xFE,0xFF,0x80,0x03,0xFB,0xBB,0xFB,0xBB,0xC0,0x03,0xFB,0xBB,0xFB,0xBB,
  48. 0xF8,0x3B,0xFF,0xFB,0xF0,0x0B,0xF7,0xDB,0xFB,0xBD,0xFC,0x7D,0xF3,0x9E,0x8F,0xE3,/*"度",7*/
  49. 0xE0,0xFF,0xFF,0x01,0xFF,0x7F,0xE0,0x03,0xFF,0xBF,0x80,0x00,0xFF,0xDF,0xFF,0xEF,
  50. 0xF0,0x07,0xF7,0xEB,0xF0,0x0D,0xF7,0xEE,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,/*"看",0*/
  51. 0xE0,0xFF,0xFF,0x01,0xFF,0x7F,0xE0,0x03,0xFF,0xBF,0x80,0x00,0xFF,0xDF,0xFF,0xEF,
  52. 0xF0,0x07,0xF7,0xEB,0xF0,0x0D,0xF7,0xEE,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,/*"看",1*/
  53. 0xFF,0xFF,0x80,0x01,0xF7,0xFF,0xF7,0xFF,0xF7,0x07,0xF7,0x77,0xF7,0x77,0xF7,0x77,
  54. 0xF7,0x77,0xF7,0x77,0xF7,0x07,0xF7,0x77,0xF7,0xFF,0xF7,0xFF,0xF5,0xFF,0xFB,0xFF,/*"可",2*/
  55. 0xF7,0xFF,0xF7,0xDF,0xF7,0xBB,0xF7,0x7B,0xF7,0x7B,0xF7,0xFB,0xF7,0xFB,0xFB,0xFB,
  56. 0xFB,0xFB,0xFB,0xFB,0xFD,0xDB,0xF5,0xEB,0xEE,0xF3,0xDF,0x7B,0xBF,0xBF,0xBF,0xDF,/*"以",3*/
  57. 0xFF,0xFF,0xF0,0x07,0xF7,0xF7,0xF7,0xF7,0xF0,0x07,0xF7,0xF7,0xF7,0xF7,0xF0,0x07,
  58. 0xFD,0xDF,0xDD,0xDD,0xDD,0xDB,0xED,0xD7,0xF5,0xD7,0xFD,0xDF,0x80,0x00,0xFF,0xFF,/*"显",4*/
  59. 0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0xFF,0x7F,
  60. 0xFF,0x7F,0xF7,0x77,0xEF,0x77,0xDF,0x7B,0xBF,0x7D,0xBF,0x7E,0xFF,0x5F,0xFF,0xBF,/*"示",5*/
  61. 0xFF,0xFF,0xF8,0x0F,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,
  62. 0xFB,0xEF,0xFB,0xEF,0xFB,0xF7,0xBB,0xF7,0xBB,0xFB,0xBB,0xFB,0x87,0xFD,0xFF,0xFE,/*"几",6*/
  63. 0xFF,0x7F,0xFF,0x7F,0xFE,0xBF,0xFD,0xDF,0xFB,0xEF,0xF7,0xF7,0xEF,0x7B,0x9F,0x7C,
  64. 0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,/*"个",7*/
  65. 0xFF,0xBF,0xFF,0x7F,0x80,0x01,0xBF,0xFD,0xDF,0xFE,0xF8,0x07,0xFD,0xFF,0xFE,0xFF,
  66. 0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,/*"字",8*/
  67. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  68. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"OxFF",8*/
  69. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  70. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"OxFF",8*/
  71. };
  72. /*
  73. void delayms(unsigned int m)
  74. {
  75.         int i,j;
  76.         for(i=0; i<m; i++)
  77.                 for(j=0; j<120; j++);
  78. }
  79. */
  80. void HC595(unsigned char dat)
  81. {
  82.         unsigned char j;
  83.         for(j=0;j<8;j++)
  84.         {
  85.                 SH_CP = 0;        //为移位准备
  86.                 DS = dat & 0x01;        //先低位
  87.                 dat=dat>>1;
  88.                 SH_CP =1;          //上升沿,移位
  89.         }
  90. }
  91. void Matrix16x16(unsigned char num)
  92. {
  93.         unsigned int k,i,t,y,t1;
  94.         unsigned int m,n;
  95.         unsigned int Char_num=num*32;
  96.        
  97.         for(m=0;m<Char_num;m++)    //为移动预留
  98.         {
  99.                 t=m/8;                //位移除以8取整数部分
  100.                 t1=m/16;
  101.                 y=m%8;                                        //位移除以8取余部分
  102.                 for(n=0;n<1;n++)//控制显示速度,防止闪烁
  103.                 {
  104.                         for(k=0;k<16;k++)        //行扫描
  105.                         {
  106.                                 //P1=0xff;
  107.                                
  108.                                 //for(i=0;i<num;i++)   //控制第几个字
  109.                                 for(i=0;i<4;i++)   //控制第几个字
  110.                                
  111.                                 {
  112.                                        
  113.                                         //HC595(Table_row[(32*i+2*k+1)]);                //
  114.                                         //HC595(Table_row[(32*i+2*k+0)]);                //
  115.                                                 if(t%2==0){
  116.                                                         //HC595(Table_row[(32*(i+t1)+2*k+1)%Char_num]>>y|Table_row[(32*(i+t1)+2*k+0)%Char_num]<<(8-y));
  117.                                                         //HC595(Table_row[(32*(i+t1)+2*k+0)%Char_num]>>y|Table_row[(32*(i+1+t1)+2*k+1)%Char_num]<<(8-y));
  118.                                                         if ((32*(i+t1)+2*k)<sizeof(Table_row)-1&&(32*(i+t1+1)+2*k+1)<sizeof(Table_row)-1&&(32*(i+t1)+2*k+1)<sizeof(Table_row)-1)
  119.                                                         {
  120.                                                                 HC595(Table_row[(32*(i+t1)+2*k+1)]>>y|Table_row[(32*(i+t1)+2*k+0)]<<(8-y));
  121.                                                                 HC595(Table_row[(32*(i+t1)+2*k+0)]>>y|Table_row[(32*(i+1+t1)+2*k+1)]<<(8-y));
  122.                                                         }
  123.                                                         else
  124.                                                         {
  125.                                                                 HC595(0xff);
  126.                                                                 HC595(0xff);
  127.                                                         }
  128.                                                 }
  129.                                                 else
  130.                                                 {
  131.                                                         if ((32*(i+1+t1)+2*k+1)<sizeof(Table_row)-1&&(32*(i+t1)+2*k+0)<sizeof(Table_row)-1&&(32*(i+1+t1)+2*k+0)<sizeof(Table_row)-1)
  132.                                                         {
  133.                                                                 HC595(Table_row[(32*(i+t1)+2*k+0)]>>y|Table_row[(32*(i+1+t1)+2*k+1)]<<(8-y));
  134.                                                                 HC595(Table_row[(32*(i+1+t1)+2*k+1)]>>y|Table_row[(32*(i+1+t1)+2*k+0)]<<(8-y));
  135.                                                         }
  136.                                                         else
  137.                                                         {
  138.                                                                 HC595(0xff);
  139.                                                                 HC595(0xff);
  140.                                                         }
  141.                                                 }
  142.                             }
  143.                             ST_CP = 0;
  144.                             ST_CP = 1; //并行输出
  145.                             
  146.           P1=16-k;    //从左往右显示,P1低4位为74HC154输入,高4位未使用
  147.                                         //_nop_();
  148.                                         //_nop_();
  149.                                         //_nop_();
  150.                                         //_nop_();
  151.                             //delayms(2);//可以不用delay,89C52已经够慢了
  152.                         }
  153.                 }
  154.         }
  155. }
  156. void main(){
  157.         while(1){
  158.                
  159.                 Matrix16x16(23);
  160.         }
  161. }
复制代码
三、总结


     最有效的提高移动速度的方法是:

     1、烧录时,使能6T,可以提高一倍速度;

        2、for(n=0;n<1;n++),那句可以改成for(n=0;n<16;n+=2),显示可以清楚一些,步子大了,显示速度也快了,并且人眼几乎看不出和一步一步走的差别。

          这个算法数据本身没有动,通过取值来控制输出。但就像牛屎芯片一样,自己都看不懂到底是个啥。
8925011822d047ef8b94175b61ff3d52.jpg

文章内容成文于半年前,先发于个人blog。
听说发文可以得芯愿,换MCU,^-^




回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 13:38 , Processed in 0.121893 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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