找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1848|回复: 5
打印 上一主题 下一主题
收起左侧

单片机16*64的点阵屏程序 为什么滚动显示的时候会有重影 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:892657 发表于 2021-4-13 06:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char        
  4. #define uint  unsigned int
  5. uchar code num[4][32]={  {0xFE,0xFF,0xFE,0xFB,0x00,0x01,0xFE,0xFF,0xFD,0xFF,0xC0,0x03,0xDB,0xDB,0xDD,0xBB,0xD0,0x0B,0xDE,0xFB,0xC0,                                                                            0x03,0xDE,0xFB,0xDE,0xFB,0xDE,0xEB,0xDE,0xF7,0xFF,0xFF},/*"南",0*/
  6.                         {0xFD,0xFF,0xFE,0xF7,0x80,0x03,0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xFE,0xFF,0xF6,                                                                             0xCF,0xE6,0xE7,0xCE,0xF3,0xBE,0xF7,0xFA,0xFF,0xFD,0xFF},/*"京",1*/
  7.                          {0xFF,0xFF,0xC0,0x03,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,                                                                           0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFF,0xFF,0xFF,0xFF},/*"工",2*/


  8.                          {0xF2,0x07,0x8E,0xF7,0xEE,0xF7,0xEE,0xF7,0x02,0xF7,0xEE,0x07,0xCF,0xFF,0xC4,0x03,0xAB,0xBF,0xAF,0xBF,0x6C,                                                                       0x03,0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xE8,0x01,0xEF,0xFF}/*"程",3*/
  9. };
  10. uchar idatanum_temp[16][8];   //数据缓存,用于移位                                                                           
  11. uchar b[8];                   //16*16点阵,每次发送1个字节。用b[8]保存
  12. int n1=0;
  13. uchar zuoyou=0;
  14. uchar hanzi;
  15. sbit EN=P1^0;                   //74hc154的使能端
  16. sbit A_R=P2^0;                 //A B C D每位数据对应于74hc154的4个数据口
  17. sbit B_R=P2^1;                     
  18. sbit C_R=P2^2;                     
  19. sbit D_R=P2^3;


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


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


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


  86. //左移
  87. void column_youyi(int n)      
  88. {
  89.     int i,j,e=0,f;
  90.   uchar a1,b1;
  91.   for(i=7;i>=0;i--){
  92.       if(i!=0)
  93.       {
  94.         f=num_temp[n][i-1]&0x01;
  95.       }
  96.       else
  97.       {
  98.         f=0;
  99.       }
  100.       num_temp[n][i]>>=1;[/i][i]
  101.       if(f)
  102.       {
  103.        num_temp[n][i]=num_temp[n][i]+0x80;[/i][/i][i][i]
  104.       }         
  105.       b1=num_temp[n][i];[/i][i]
  106.       for(j=0;j<8;j++){
  107.         a1=0x01;
  108.        SRC_C=0;
  109.         DATA_C=b1&a1;
  110.        b1>>=1;
  111.        SRC_C=1;
  112.       }
  113.    }
  114. }
  115. //静止
  116. void column_stop(int n)        
  117. {
  118.   int i,j;
  119.   uchar a1,b1;


  120.   for(i=7;i>=0;i--){      
  121.       b1=num_temp[n][i];[/i][i]
  122.       for(j=0;j<8;j++){
  123.         a1=0x01;
  124.        SRC_C=0;
  125.         DATA_C=b1&a1;
  126.        b1>>=1;
  127.        SRC_C=1;
  128.       }
  129.    }
  130. }
  131. /**********************************************
  132. 函数功能:行扫描程序,16次为1个周期,利用154的译码器
  133. 入口参数:无
  134. 返回值:  无
  135. ***********************************************/
  136. void column_16()
  137. {
  138.   int i,j=0;
  139.   char temp=0x00;
  140.                                 //这里输入行数据en打开
  141.   n1++;
  142.                                //对应16行数据
  143.   for(i=0;i<16;i++)
  144.   {   
  145.       switch(zuoyou)
  146.   {
  147.     case 0:
  148.      if(hanzi==0)
  149.        {
  150.           hanziku();
  151.        }
  152.        hanzi++;
  153.        column_stop(i);
  154.        break;
  155.      case 1:
  156.        column_zuoyi(i);
  157.        hanzi=0;
  158.        break;
  159.      case 2:
  160.        if(hanzi==0)
  161.        {
  162.           hanziku();
  163.        }
  164.        hanzi++;
  165.        column_stop(i);
  166.        break;
  167.      case 3:
  168.        column_youyi(i);
  169.        hanzi=0;
  170.        break;
  171.   }
  172.    if(n1==70)
  173.   {
  174.     n1=0;
  175.     zuoyou++;
  176.     if(zuoyou==4)
  177.     {
  178.       zuoyou=0;
  179.     }
  180.   }
  181. EN=0;  
  182.    //每一行的数据
  183.     P2=temp++;          //P2从0000开始到1111
  184.     SLC_595();
  185.   }
  186. }  
  187. int main()
  188. {
  189.   int i=0;
  190.   EN=1;              //154使能端关上
  191.   SRC_C=0;          //595初始化
  192.   SLC_C=0;
  193.   hanziku();       //初始化汉字库
  194.   while(1){
  195.    column_16();
  196.    delay(5);
  197.    EN=1;            
  198.   }
  199. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2021-4-13 08:16 | 只看该作者
需要消隐处理,同数码管需要消隐一样道理。
回复

使用道具 举报

板凳
ID:390416 发表于 2021-4-13 09:16 | 只看该作者
数据发送到595后,先关闭ABCD,然后再让595输出数据到点阵LED。其实单独用595也可以驱动,可以参考我的贴子
回复

使用道具 举报

地板
ID:723547 发表于 2021-4-13 09:30 | 只看该作者
在显示下一次数据前,把数据口清空
回复

使用道具 举报

5#
ID:892657 发表于 2021-4-13 15:58 | 只看该作者
人人学会单片机 发表于 2021-4-13 09:16
数据发送到595后,先关闭ABCD,然后再让595输出数据到点阵LED。其实单独用595也可以驱动,可以参考我的贴子

大佬 参考你哪个帖子
回复

使用道具 举报

6#
ID:892657 发表于 2021-4-13 17:32 | 只看该作者
具体应该怎么改代码 求帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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