借问一下,关于这个程序怎么实现点阵的移动

2019-07-15 15:49发布

  1. /*-----------------------------------------------
  2.   名称:双 {MOD}点阵
  3.   论坛:www.doflye.net
  4.   编写:shifang
  5.   修改:无
  6.   内容:使用hc595驱动双 {MOD}点阵
  7. ------------------------------------------------*/
  8. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  9. #include <intrins.h>


  10. unsigned char  segout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //8列
  11. unsigned char code tab[96]={
  12.                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
  13.                         0x00,0x7E,0xFF,0xC3,0xC3,0xFF,0x7E,0x00, //字符0
  14.                         0x00,0x00,0x43,0xFF,0xFF,0x03,0x00,0x00, //字符1
  15.                         0x00,0x63,0xC7,0xCF,0xDB,0xF3,0x63,0x00, //字符2
  16.                         0x00,0x42,0xDB,0xDB,0xDB,0xFF,0x66,0x00, //字符3
  17.                         0x00,0x3E,0x46,0xFF,0xFF,0x06,0x06,0x00, //字符4
  18.                         0x00,0xF6,0xF7,0xD3,0xD3,0xDF,0xDE,0x00, //字符5
  19.                         0x00,0x7E,0xFF,0xDB,0xDB,0xDF,0x4E,0x00, //字符6
  20.                         0x00,0xC0,0xC0,0xC7,0xFF,0xF8,0xC0,0x00, //字符7
  21.                         0x00,0xFF,0xFF,0xDB,0xDB,0xFF,0xFF,0x00, //字符8
  22.                         0x00,0x72,0xFB,0xDB,0xDB,0xFF,0x7E,0x00, //字符9
  23.                         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00   //空格
  24.                         };
  25. /*------------------------------------------------
  26.                 硬件端口定义
  27. ------------------------------------------------*/
  28. sbit LATCH = P1^0;
  29. sbit SRCLK= P1^1;
  30. sbit SER  = P1^2;


  31. sbit LATCH_B = P2^2;
  32. sbit SRCLK_B= P2^1;
  33. sbit SER_B= P2^0;


  34. /*------------------------------------------------
  35. uS延时函数,含有输入参数 unsigned char t,无返回值
  36. unsigned char 是定义无符号字符变量,其值的范围是
  37. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  38. 长度如下 T=tx2+5 uS
  39. ------------------------------------------------*/
  40. void DelayUs2x(unsigned char t)
  41. {   
  42. while(--t);
  43. }
  44. /*------------------------------------------------
  45. mS延时函数,含有输入参数 unsigned char t,无返回值
  46. unsigned char 是定义无符号字符变量,其值的范围是
  47. 0~255 这里使用晶振12M,精确延时请使用汇编
  48. ------------------------------------------------*/
  49. void DelayMs(unsigned char t)
  50. {
  51.      
  52. while(t--)
  53. {
  54.      //大致延时1mS
  55.      DelayUs2x(245);
  56.          DelayUs2x(245);
  57. }
  58. }
  59. /*------------------------------------------------
  60.                 发送字节程序
  61.            带有方向参数,可以选择从高位节写入或者低位写入
  62. ------------------------------------------------*/
  63. void SendByte(unsigned char dat,bit direction)
  64. {   
  65.   unsigned char i,temp;
  66.    if(direction==0)
  67.      temp=0x80;
  68.    else
  69.      temp=0x01;

  70.    for(i=0;i<8;i++)
  71.         {
  72.          SRCLK=0;
  73.          SER=dat&temp;
  74.          if(direction==0)
  75.          dat<<=1;
  76.          else
  77.              dat>>=1;
  78.          SRCLK=1;
  79.          }
  80.          
  81. }
  82. /*------------------------------------------------
  83.                 发送双字节程序
  84. ------------------------------------------------*/
  85. void Send2Byte(unsigned char dat1,unsigned char dat2,bit direction)
  86. {   
  87.    SendByte(dat1,direction);
  88.    SendByte(dat2,direction);      
  89. }
  90. /*------------------------------------------------
  91.                    595锁存程序
  92. ------------------------------------------------*/
  93. void Out595(void)
  94. {
  95.         LATCH=0;
  96.         _nop_();
  97.         LATCH=1;
  98. }

  99. /*------------------------------------------------
  100.                 发送位码字节程序
  101.                使用另外一片单独595
  102. ------------------------------------------------*/
  103. void SendSeg(unsigned char dat)
  104. {   
  105.   unsigned char i;
  106.         
  107.    for(i=0;i<8;i++)  //发送字节
  108.         {
  109.          SRCLK_B=0;
  110.          SER_B=dat&0x80;
  111.          dat<<=1;
  112.          SRCLK_B=1;
  113.          }
  114.       LATCH_B=0;    //锁存
  115.       _nop_();
  116.       LATCH_B=1;
  117.          
  118. }
  119. /*------------------------------------------------
  120.                    主程序
  121. ------------------------------------------------*/
  122. void main()
  123. {
  124. unsigned char i,k,l;
  125. while(1)
  126. {
  127.        for(k=0;k<=88;k++)     //所有的字符个数
  128.          for(l=20;l>0;l--)    //延时长度,改变此值可以改变流动速度
  129.             for(i=0;i<=7;i++) //8列显示
  130.                   {
  131.                      SendSeg(segout[i]);
  132.                                          Send2Byte(~(*(tab+i+k)),0xff,0);
  133.                                          Out595();
  134.                      DelayMs(1);
  135.                                          Send2Byte(0xff,0xff,0);//delay(10); //防止重影
  136.                                          Out595();
  137.                   }


  138.           for(k=0;k<=88;k++)     //所有的字符个数
  139.          for(l=20;l>0;l--)    //延时长度,改变此值可以改变流动速度
  140.             for(i=0;i<=7;i++) //8列显示
  141.                   {
  142.                      SendSeg(segout[7-i]);
  143.                                          Send2Byte(0xff,~(*(tab+i+k)),1); //写入字节方向改变
  144.                                          Out595();
  145.                      DelayMs(1);
  146.                                          Send2Byte(0xff,0xff,0);//delay(10); //防止重影
  147.                                          Out595();
  148.                   }
  149.          }
  150. }
复制代码
这程序看不懂的就是它是怎么实现移动的功能的,里面我看不懂的只有这个表达式的含义,~(*(tab+i+k))以及 for(l=20;l>0;l--) 这个循环的意义,那个式子好像是指针类型,可前面又没有申明指针变量。。有谁能帮忙解答一下,小弟在此谢过了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
xx995014364
1楼-- · 2019-07-15 20:12
for(l=20;l>0;l--)这个循环其实就相当于是延时,因为点阵要不断刷新显示,for(i=0;i<=7;i++)扫描一次的时间*变量l也就是延时的时间(移动一次的时间)。

~(*(tab+i+k))这表达式等价于~tab[i+k],如果在程序中引用tab[i]的话,系统会按*(tab+i)处理,先计算括号里面的地址再指向该地址单元的内容。 最佳答案
呵呵哒哒哒你妹
2楼-- · 2019-07-15 22:42
xx995014364 发表于 2015-10-27 10:20
for(l=20;l>0;l--)这个循环其实就相当于是延时,因为点阵要不断刷新显示,for(i=0;i

还是不怎么理解,如果~(*(tab+i+k))这表达式等价于~tab[i+k],那么他岂不是跟以前点阵静态显示程序的式子一样,也就是说,这个程序它是如何实现点阵移动的功能的?
呵呵哒哒哒你妹
3楼-- · 2019-07-16 00:40
再结合你的答案思考一下程序,突然就豁然开朗了

一周热门 更多>