找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机16*16点阵led显示汉字为什么显示只有一条直线,各位大佬求帮助

[复制链接]
跳转到指定楼层
楼主

文件见附件这是我的代码  

  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];
  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;
  72.       num_temp[n][ i]<<=1;
  73.       if(f){
  74.        num_temp[n][ i]=num_temp[n][ i]+0x01;
  75.       }               
  76.       b1=num_temp[n][ 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;
  101.       if(f)
  102.       {
  103.        num_temp[n][ i]=num_temp[n][ i]+0x80;
  104.       }         
  105.       b1=num_temp[n][ 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];
  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. }
复制代码


新建文件夹.zip

50.52 KB, 下载次数: 2

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:390416 发表于 2021-3-16 22:37 | 只看该作者
LED16x16点阵 89单片机+四个74HC595的 程序源码原理图 http://www.51hei.com/bbs/dpj-200961-1.html
回复

使用道具 举报

板凳
ID:332444 发表于 2021-3-17 14:02 | 只看该作者
回复

使用道具 举报

地板
ID:332444 发表于 2021-3-17 15:02 | 只看该作者
回复

使用道具 举报

5#
ID:890771 发表于 2021-3-17 15:58 | 只看该作者
这个你可以试着先用一个16*16的点阵试验一下,缩小你要检查的范围,之前做过一个,现在忘得差不多了,我把源码发出来,你参考下
#include<reg51.h>
#include<intrins.h>
sbit DS=P1^0;
sbit ST_CP=P1^1;
sbit SH_CP=P1^2;
sbit A=P1^3;
sbit E=P1^4;
sbit C=P1^5;
sbit D=P1^6;
int u,n;
unsigned char display_1[]={
0xbf,0x7f,0xb7,0x9f,0xb7,0xe0,0xb7,0xdf,
0x00,0x80,0xb7,0xbb,0xb7,0xbb,0xff,0xff,
0x3b,0xb0,0xbb,0xaf,0xbb,0xaf,0xbb,0xaf,
0x03,0xaf,0xff,0xa3,0xff,0xbf,0xff, 0xff,


};

void delay()
{
      for(u=0;u<100;u++)
         for(n=0;n<1;n++);
}
void  hc595_senddat(unsigned char dat)
{
        unsigned char k;
        for(k=0;k<8;k++)
        {
            DS=dat&0x80;
            SH_CP=0;
            SH_CP=1;
            dat<<=1;
        }       
}
main()
{
        unsigned char i;

        SH_CP=0;
        ST_CP=0;
        while(1)
        {
                for(i=0;i<16;i++)
                {       
                       
                        {
                                hc595_senddat(display_1[2*i+1]);
                                hc595_senddat(display_1[2*i]);                        
                        }
                       
                        switch(i)
                          {
                            case 0:A=0;E=0;C=0;D=0; break;  //负0000
                            case 1:A=1;E=0;C=0;D=0; break; //1000
                            case 2:A=0;E=1;C=0;D=0; break;  //0100
                            case 3:A=1;E=1;C=0;D=0; break; //1100
                            case 4:A=0;E=0;C=1;D=0; break; //0010
                            case 5:A=1;E=0;C=1;D=0; break; //1010
                            case 6:A=0;E=1;C=1;D=0; break; //0110
                            case 7:A=1;E=1;C=1;D=0; break; //1110
                            case 8:A=0;E=0;C=0;D=1; break;  //0001
                            case 9:A=1;E=0;C=0;D=1; break; //1001
                            case 10:A=0;E=1;C=0;D=1; break; //0101
                            case 11:A=1;E=1;C=0;D=1; break; //1101
                            case 12:A=0;E=0;C=1;D=1; break; //0011
                            case 13:A=1;E=0;C=1;D=1; break; //1011
                            case 14:A=0;E=1;C=1;D=1; break; //0111
                            case 15:A=1;E=1;C=1;D=1; break; //1111
                          }
                       
                        ST_CP=1;
                        ST_CP=0;
            delay();
                }
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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