找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1191|回复: 4
收起左侧

4个16*16点阵led显示半幅偏移 各位单片机大佬求帮助

[复制链接]
ID:892657 发表于 2021-3-17 22:24 | 显示全部楼层 |阅读模式
51hei图片20210317222206.png
附件有原理图

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char            
  4. #define uint  unsigned int
  5. uchar code num[4][32]={   {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
  6. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",0*/

  7. {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  8. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},/*"二",1*/

  9. {0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
  10. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00},/*"三",2*/

  11. {0x00,0x00,0x00,0x00,0x7F,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,
  12. 0x48,0x44,0x48,0x3C,0x50,0x04,0x60,0x04,0x40,0x04,0x7F,0xFC,0x40,0x04,0x00,0x00},/*"四",3*/
  13. };
  14. uchar idata num_temp[16][8];   //数据缓存,用于移位                                                                                          
  15. uchar b[8];                   //16*16点阵,每次发送1个字节。用b[8]保存
  16. int n1=0;
  17. uchar zuoyou=0;
  18. uchar hanzi;
  19. sbit EN=P1^0;                                         //74hc154的使能端
  20. sbit A_R=P2^0;                 //A B C D每位数据对应于74hc154的4个数据口
  21. sbit B_R=P2^1;                                         
  22. sbit C_R=P2^2;                                       
  23. sbit D_R=P2^3;

  24. sbit RST_C=P1^1;                             //74hc595的复位口                                       
  25. sbit DATA_C=P3^2;                                 //串行数据口
  26. sbit SRC_C=P3^3;                            //74hc595的寄存器时钟线
  27. sbit SLC_C=P3^4;                             //74hc595的锁存器的时钟线

  28. /*************************************
  29.   函数功能:延时程序
  30. **************************************/
  31. void delay(int i)
  32. {            
  33.   inta;
  34. for(a=0;a<i;a++);
  35. }
  36. /**************************************************************
  37.   函数功能: 595在SLC上升沿的时候并行输出到寄存器下的8位数据
  38.   入口参数:无
  39.   返回值  :无
  40. **************************************************************/
  41. void SLC_595()
  42. {  
  43.   SLC_C=0;
  44.   SLC_C=1;
  45.   SLC_C=0;   
  46. }
  47. /**************************************************************
  48. 函数功能:往num_temp[16][8]暂存器下存储数据  16对应着16个字节   
  49. *************************************************************/
  50. void hanziku()
  51. {
  52.   int i,j=0,k;
  53.   for(i=0;i<16;i++){
  54.    b[0]=num[0][j];b[2]=num[1][j];b[4]=num[2][j];b[6]=num[3][j];
  55.        j++;
  56.        b[1]=num[0][j];b[3]=num[1][j];b[5]=num[2][j];b[7]=num[3][j];
  57.        j++;
  58.        for(k=7;k>=0;k--){
  59.          num_temp[k]=b[k];
  60.     }
  61.   }
  62. }

  63. /*******************************************************************
  64.   函数功能: 595输出列向的数据64个(8位为一字节,那就是8字节的数据)
  65.   入口参数:无
  66.   返回值  : 无
  67. *******************************************************************/
  68. //右移
  69. void column_zuoyi(int n)         
  70. {
  71.   inti,j,e=0,f;
  72. uchar a1,b1;
  73. for(i=7;i>=0;i--){
  74.      f=e;
  75.          e=num_temp[n]&0x80;
  76.          num_temp[n]<<=1;
  77.          if(f){
  78.            num_temp[n]=num_temp[n]+0x01;
  79.          }                             
  80.      b1=num_temp[n];
  81.          for(j=0;j<8;j++){
  82.            a1=0x01;
  83.               SRC_C=0;
  84.            DATA_C=b1&a1;
  85.               b1>>=1;
  86.               SRC_C=1;
  87.          }
  88.    }
  89. }

  90. //左移
  91. void column_youyi(int n)         
  92. {
  93.    int i,j,e=0,f;
  94. uchar a1,b1;
  95. for(i=7;i>=0;i--){
  96.          if(i!=0)
  97.          {
  98.        f=num_temp[n][i-1]&0x01;
  99.          }
  100.          else
  101.          {
  102.            f=0;
  103.          }
  104.          num_temp[n]>>=1;
  105.          if(f)
  106.          {
  107.            num_temp[n]=num_temp[n]+0x80;
  108.          }               
  109.      b1=num_temp[n];
  110.          for(j=0;j<8;j++){
  111.            a1=0x01;
  112.               SRC_C=0;
  113.            DATA_C=b1&a1;
  114.               b1>>=1;
  115.               SRC_C=1;
  116.          }
  117.    }
  118. }
  119. //静止
  120. void column_stop(int n)           
  121. {
  122.   inti,j;
  123. uchar a1,b1;
  124.   
  125. for(i=7;i>=0;i--){              
  126.      b1=num_temp[n];
  127.          for(j=0;j<8;j++){
  128.            a1=0x01;
  129.               SRC_C=0;
  130.            DATA_C=b1&a1;
  131.               b1>>=1;
  132.               SRC_C=1;
  133.          }
  134.    }
  135. }
  136. /**********************************************
  137. 函数功能:行扫描程序,16次为1个周期,利用154的译码器
  138. 入口参数:无
  139. 返回值: 无
  140. ***********************************************/
  141. void column_16()
  142. {
  143.   inti,j=0;
  144. char temp=0x00;
  145.                                                //这里输入行数据en打开
  146. n1++;
  147.                                //对应16行数据
  148. for(i=0;i<16;i++)
  149.   {   
  150.          switch(zuoyou)
  151.   {
  152.    case 0:
  153.         if(hanzi==0)
  154.           {
  155.              hanziku();
  156.           }
  157.           hanzi++;
  158.           column_stop[i];
  159.           break;
  160.         case 1:
  161.           column_zuoyi[i];
  162.           hanzi=0;
  163.           break;
  164.         case 2:
  165.           if(hanzi==0)
  166.           {
  167.              hanziku();
  168.           }
  169.           hanzi++;
  170.           column_stop[i];
  171.           break;
  172.         case 3:
  173.           column_youyi[i];
  174.           hanzi=0;
  175.           break;
  176.   }
  177.   if(n1==70)
  178.   {
  179.    n1=0;
  180.        zuoyou++;
  181.        if(zuoyou==4)
  182.        {
  183.          zuoyou=0;
  184.        }
  185.   }  
  186. EN=0;   
  187.    //每一行的数据
  188.    P2=temp++;          //P2从0000开始到1111
  189.    SLC_595();  
  190.   }
  191. }  
  192. int main()
  193. {
  194.   inti=0;
  195. EN=1;              //154使能端关上
  196. SRC_C=0;               //595初始化
  197. SLC_C=0;
  198. hanziku();            //初始化汉字库
  199. while(1){
  200.   column_16();
  201.   delay(5);
  202.   EN=1;                       
  203.   }
  204. }
复制代码


新建文件夹.zip

52.64 KB, 下载次数: 7

回复

使用道具 举报

ID:892657 发表于 2021-3-17 22:26 | 显示全部楼层
我是代码有什么问题么  有没有大佬帮忙改一下
回复

使用道具 举报

ID:100826 发表于 2021-3-18 08:06 | 显示全部楼层
带仿真的 希望能帮到你

点阵多种移动模式.zip

255.33 KB, 下载次数: 21

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:390416 发表于 2021-3-18 09:46 | 显示全部楼层
LED16x16点阵 89单片机+四个74HC595的 程序源码原理图 http://www.51hei.com/bbs/dpj-200961-1.html
回复

使用道具 举报

ID:89515 发表于 2021-3-18 15:14 来自手机 | 显示全部楼层
反正是仿真,你改第四块电路看看啊,排除法嘛。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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