找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是我写的64乘32点阵扫描横移代码

[复制链接]
跳转到指定楼层
楼主
ID:155200 发表于 2017-10-22 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多多指教

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit TR  =P2^6;
  5. sbit led0=P2^7;

  6. sbit OA  =P1^0;  //行控制线A
  7. sbit OB  =P1^1;  //行控制线B
  8. sbit OC  =P1^2;  //行控制线C
  9. sbit OD  =P1^3;  //行控制线D

  10. sbit LE=P2^0;              //锁存         
  11. sbit CLK=P2^1;                   //时钟       
  12. sbit OE=P2^3;                                 //片选


  13. sbit DR1= P1^4;            //红色数据1
  14. sbit DR2= P1^6;                           //红色数据2

  15. sbit DG1= P1^5;            //绿色数据1
  16. sbit DG2= P1^7;                           //绿色色数据2

  17. unsigned int a,b,c,d,i,j,x,y=32,led31,led32,led41,led42;
  18. void delay(uint i);
  19. const uchar code hz[][32]={
  20. 0x00,0x00,0x00,0x10,0x00,0x30,0x00,0x20,0x07,0xA0,0x1B,0x7E,0x02,0x46,0x06,0xE8,
  21. 0x03,0x60,0x04,0x70,0x18,0xC8,0x01,0x86,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,

  22. 0x00,0x00,0x00,0x20,0x00,0xC0,0x11,0x9E,0x19,0x36,0x01,0x34,0x01,0xFC,0x19,0xBC,
  23. 0x08,0x20,0x08,0x20,0x04,0x20,0x3F,0xF0,0x00,0x0F,0x00,0x07,0x00,0x00,0x00,0x00,

  24. 0x00,0x00,0x00,0x60,0x00,0x48,0x00,0x58,0x07,0xF0,0x02,0x48,0x00,0xFC,0x07,0xC0,
  25. 0x09,0x80,0x01,0x40,0x02,0x40,0x0C,0x40,0x18,0x41,0x00,0x3F,0x00,0x00,0x00,0x00,

  26. 0x00,0x00,0x03,0x10,0x02,0x10,0x02,0x22,0x1A,0x2E,0x1A,0x78,0x1A,0xD8,0x1B,0x10,
  27. 0x1A,0x1F,0x1A,0xFB,0x12,0xD9,0x02,0x7B,0x02,0x46,0x02,0x00,0x00,0x00,0x00,0x00,

  28. };
  29. const uchar code hz2[][32]={0x00};
  30. //const uchar code hz3[][32]={0x00};
  31. const uchar code hz5[][32]=
  32. {
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x18,0x32,0x7C,0x60,0xC0,0x40,0x00,
  34. 0x00,0x10,0x0C,0x20,0x1C,0x20,0x1E,0x60,0x0F,0xC0,0x0F,0x80,0x03,0x00,0x00,0x00,

  35. 0x00,0x00,0x00,0x00,0x00,0xF0,0x03,0xE0,0x00,0x00,0x00,0x1C,0x00,0xFC,0x0F,0xE0,
  36. 0x09,0xC0,0x01,0x40,0x02,0x40,0x04,0x40,0x1C,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,

  37. 0x00,0x18,0x00,0x18,0x03,0x18,0x06,0x18,0x06,0xFE,0x0C,0xB8,0x0D,0x1F,0x14,0x7F,
  38. 0x05,0x90,0x04,0x10,0x04,0x10,0x04,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,

  39. 0x00,0x60,0x00,0x20,0x00,0x1C,0x01,0xF0,0x01,0x3C,0x03,0xF8,0x03,0x50,0x06,0xFC,
  40. 0x05,0xD0,0x08,0x3F,0x1B,0xD0,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,
  41. };
  42. const uchar code hz6[][32]=        {


  43. 0x00,0xE0,0x01,0x00,0x02,0x00,0x0C,0x00,0x08,0x00,0x10,0x7C,0x10,0x82,0x21,0x11,0x21,0x35,0x27,0x3D,0x39,0x19,0x23,0x01,0x2C,0x82,0x30,0x7C,0x20,0x00,0x20,0x00,

  44. 0x1C,0x00,0x07,0x00,0x01,0x80,0x00,0x40,0x00,0x40,0x3E,0x60,0x41,0x20,0x88,0x90,0x9A,0xD0,0x9E,0xB0,0x8C,0xD0,0x80,0xB0,0x41,0x10,0x3E,0x10,0x00,0x10,0x00,0x10,

  45. 0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x03,0x60,0x0F,0xC0,0x7F,0x80,0x0F,0x00,0x19,0xC0,0x30,0x78,0x77,0xCC,0x09,0x60,0x0B,0xA0,0x05,0x20,0x07,0x40,0x00,0x00,

  46. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0xF8,0x5F,0x58,0x6A,0x50,0x4A,0x60,0x5B,0x80,0x22,0x00,0x02,0x02,0x01,0x02,0x01,0x86,0x00,0x78,0x00,0x00,0x08,0x00,

  47. };
  48. const uchar code hz7[][32]=        {

  49. 0x20,0x00,0x20,0x00,0x20,0x07,0x30,0x02,0x2C,0x01,0x23,0x00,0x20,0xBC,0x78,0x43,0xD4,0x20,0x93,0x20,0x90,0xE0,0x90,0x40,0xC8,0x40,0x78,0x40,0x0D,0x80,0x00,0x00,

  50. 0x10,0x10,0xF0,0x10,0xA0,0x30,0x60,0xD0,0xC1,0x10,0x02,0x38,0x34,0x56,0xC5,0x93,0x07,0x11,0x01,0x11,0x01,0x11,0x01,0x33,0x01,0xD2,0x00,0x1C,0x00,0x20,0x00,0x20,

  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0F,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  52. 0x88,0x00,0xCC,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x8C,0xF0,0x8F,0xE0,0x0E,0x00,0x3C,0x00,0xEC,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x00,0x00,0x00,
  53. };
  54. const uchar code xiao[][32]={0X00


  55. };


  56. uchar clear[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
  57. uchar clear1[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
  58. uchar clear2[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};
  59. void SendDate(unsigned char DataR1,unsigned char DataG1,unsigned char DataR2,unsigned char DataG2)
  60. {
  61.         unsigned char k;
  62.         for(k = 0; k<8; k++)
  63.         {
  64.                 DR1=DataR1 & 0x01;
  65.                 DG1=DataG1 & 0x01;
  66.                 DR2=DataR2 & 0x01;
  67.                 DG2=DataG2 & 0x01;
  68.                 CLK = 0;
  69.                 CLK = 1;
  70.                 DataR1 >>= 1;
  71.                 DataG1 >>= 1;
  72.                 DataR2 >>= 1;
  73.                 DataG2 >>= 1;
  74.         }
  75. }
  76. void led_gang(uchar shang[][32],uchar xia[][32])
  77. {
  78.            
  79.             for(x=4;x>0;x--)
  80.                   {
  81.                 SendDate(0x00,xia[x-1][y-1],0x00,shang[x-1][y-1]);       
  82.                 SendDate(0x00,xia[x-1][y-2],0x00,shang[x-1][y-2]);
  83.                 }
  84.                 y=y-2;
  85.                 if(y==0)y=32;                 

  86.                 OE=1;           //关显示屏片选
  87.                 LE=1;     
  88.                 LE=0;           //输出锁存
  89.                 OE=0;                             //开显示屏片选



  90. }
  91. void hengyi()
  92. {
  93.         static int m=0;
  94.              static        int i=63;
  95.                 for(x=8;x>0;x--)
  96.           {        SendDate(0x00,0x00,clear[x-1],0x00);
  97.           }
  98.              m++;       
  99.                 if(m%16==0)
  100.                 {
  101.                         m=0;
  102.                 clear[i/8]<<=1;
  103.                         i--;if(i<0)i=63;
  104.                 }
  105.                
  106.                 OE=1;           //关显示屏片选
  107.                 LE=1;     
  108.                 LE=0;           //输出锁存
  109.                 OE=0;                             //开显示屏片选


  110. }


  111. void zi_yi_ru(uchar ZK[][32],uchar ZK1[][32])
  112. {

  113.             static int m=0;
  114.              static        int i=63;
  115.                 int byte,temp;//一行有8个字节 即64列
  116.                 static int cgg,cg;
  117.                 for(byte=0;byte<8;byte++) //每次进来都给clear赋值点阵板的一行数据
  118.                 {        
  119.                   clear[byte]=ZK[byte/2][32-2*(m+1)+byte%2];
  120.                   clear1[byte]=ZK1[byte/2][32-2*(m+1)+byte%2];
  121.                 }       


  122.              m++;        //送一行数据m+1  即总共送16行数据
  123.                 if(m%16==0)
  124.                 {        m=0;
  125.                         i--;if(i<0)i=63;
  126.                 }
  127.        
  128.                 if(cgg>127){cgg=0;cg++; if(cg==8)cg=0;}          
  129.                 cgg++;
  130.                 temp=cg;
  131.                 for(;temp>0;temp--)
  132.                 {clear[8-temp]=0;
  133.                  clear1[8-temp]=0;
  134.                 }       
  135.        

  136.                 for(x=8;x>0;x--)   //送入64位数据  即一行的数据
  137.           {       
  138.             if((8-cg)==x)
  139.                   SendDate(clear1[x-1]&(0xff<<(8-i%8)),0x00,clear[x-1]&(0xff<<(8-i%8)),0x00);
  140.                 else
  141.                 SendDate(clear1[x-1],0x00,clear[x-1],0x00);
  142.           }
  143.                 //所以每一次都要给clear赋值一次  

  144.                 OE=1;           //关显示屏片选
  145.                 LE=1;     
  146.                 LE=0;           //输出锁存
  147.                 OE=0;                             //开显示屏片选
  148. }
  149. void clear_0()
  150. {
  151.   uchar i;
  152.   for(i=0;i<8;i++)
  153.   {
  154.           clear[i]=0X00;clear1[i]=0X00;clear2[i]=0X00;
  155.   }


  156. }
  157. void gundong(uchar HK2[][32],uchar HK3[][32])
  158. {
  159.          static int time_64=128*8-1;
  160.          static int m;
  161.          int temp,j,h;
  162. //         static char yi=7;
  163.      char yi;
  164.          temp=time_64/128;
  165.          yi=time_64/16%8;
  166.          for(j=0;j<temp;j++)
  167.          {clear[j]=0;clear1[j]=0;clear2[j]=0;}
  168.          for(j=temp,h=7;j<8;j++,h--)
  169.          {
  170.            {    if(h%2==1)
  171.                         {   
  172.                             if(h==7)
  173.                             {//clear[j]=(HK[3-h/2][32-2*(m+1)]>>yi)|(HK[3-h/2][32-2*(m+1)+1]<<(8-yi));
  174.                                 clear1[j]=(HK2[3-h/2][32-2*(m+1)]>>yi);//|(HK2[3-h/2][32-2*(m+1)+1]<<(8-yi));
  175.                                 clear2[j]=(HK3[3-h/2][32-2*(m+1)]>>yi);//|(HK3[3-h/2][32-2*(m+1)+1]<<(8-yi));
  176.                                 }
  177.                                 else
  178.                                 {//clear[j]=(HK[3-h/2][32-2*(m+1)]>>yi)|(HK[3-h/2][32-2*(m+1)+1]<<(8-yi));
  179.                                 clear1[j]=(HK2[3-h/2][32-2*(m+1)]>>yi)|(HK2[3-h/2-1][32-2*(m+1)+1]<<(8-yi));
  180.                                 clear2[j]=(HK3[3-h/2][32-2*(m+1)]>>yi)|(HK3[3-h/2-1][32-2*(m+1)+1]<<(8-yi));}
  181.                         }
  182.                         else
  183.                         {
  184. //                           if(temp==0&&h<=1)//h=0
  185. //                           {
  186. //                                   //clear[j]=(HK[3-h/2][32-2*(m+1)+1]>>yi)|(HK[3-h/2+1][32-2*(m+1)]<<(8-yi));
  187. //                                clear1[j]=(HK2[3-h/2][32-2*(m+1)+1]>>yi);//|(HK2[3-h/2+1][32-2*(m+1)]<<(8-yi));
  188. //                                clear2[j]=(HK3[3-h/2][32-2*(m+1)+1]>>yi);//|(HK3[3-h/2+1][32-2*(m+1)]<<(8-yi));
  189. //                           }
  190. //                           else
  191.                            {        //clear[j]=(HK[3-h/2][32-2*(m+1)+1]>>yi)|(HK[3-h/2+1][32-2*(m+1)]<<(8-yi));
  192.                                 clear1[j]=(HK2[3-h/2][32-2*(m+1)]<<(8-yi))|(HK2[3-h/2][32-2*(m+1)+1]>>yi);
  193.                                 clear2[j]=(HK3[3-h/2][32-2*(m+1)]<<(8-yi))|(HK3[3-h/2][32-2*(m+1)+1]>>yi); }
  194.                        
  195.                         }
  196.            }

  197.          }

  198.      m++;        //送一行数据m+1  即总共送16行数据
  199.         if(m%16==0)
  200.         {        m=0;//yi--;if(yi<0)yi=0;
  201.         //        i--;if(i<0)i=63;        //i表示送完64列数据了
  202.         }
  203.         time_64--;
  204.         if(time_64==0){time_64=128*8-1;         }

  205.          for(x=8;x>0;x--)   //送入64位数据  即一行的数据
  206.           {       
  207.                 SendDate(0x00,clear2[x-1],0x00,clear1[x-1]);
  208.           }
  209.                 //所以每一次都要给clear赋值一次  

  210.                 OE=1;           //关显示屏片选
  211.                 LE=1;     
  212.                 LE=0;           //输出锁存
  213.                 OE=0;                             //开显示屏片选

  214. }
  215. //void zi_yi_ru2(uchar ZK[][32])
  216. //{
  217. //
  218. //            static int m=0;
  219. //             static        int i=63;
  220. //                int byte,temp;//一行有8个字节 即64列
  221. //                static int cgg,cg;
  222. //                for(byte=0;byte<8;byte++) //每次进来都给clear赋值点阵板的一行数据
  223. //                {        
  224. //                  clear[byte]=ZK[byte/2][32-2*(m+1)+byte%2];
  225. //                }       
  226. //
  227. //
  228. //             m++;        //送一行数据m+1  即总共送16行数据
  229. //                if(m%16==0)
  230. //                {
  231. //                    
  232. //                        m=0;
  233. //             //   clear[i/8]=0;                 //先把16行数据显示一遍 再向左移动一位
  234. //                        i--;if(i<0)i=63;
  235. //                }
  236. //       
  237. //                if(cgg>127){cgg=0;cg++; if(cg==8)cg=0;}          
  238. //                cgg++;
  239. //                temp=cg;
  240. //                for(;temp>0;temp--)
  241. //                {clear[8-temp]=0;}       
  242. //       
  243. //
  244. //                for(x=8;x>0;x--)   //送入64位数据  即一行的数据
  245. //          {       
  246. //            if((8-cg)==x)
  247. //                  SendDate(0x00,clear[x-1]&(0xff<<i%8),0x00,0x00);
  248. //                else
  249. //                SendDate(0x00,clear[x-1],0x00,0x00);
  250. //          }
  251. //                //所以每一次都要给clear赋值一次  
  252. //
  253. //                OE=1;           //关显示屏片选
  254. //                LE=1;     
  255. //                LE=0;           //输出锁存
  256. //                OE=0;                             //开显示屏片选
  257. //
  258. //
  259. //
  260. //
  261. //
  262. //}
  263. void scan()
  264. {
  265.    
  266.         OA=a;OB=b;OC=c;OD=d;
  267.         a++;
  268.         if(a==2){a=0;b++;}
  269.         if(b==2){b=0;c++;}
  270.         if(c==2){c=0;d++;}
  271.         if(d==2){d=0;}
  272.   


  273. }

  274. void gunru(uchar shang[][32],uchar xia[][32])
  275. {
  276.     unsigned int m,n;
  277.         for(m=0;m<64;m++)
  278.         {          for(n=0;n<16;n++)
  279.                 {         
  280.                     gundong(shang,xia);
  281.                         scan();               
  282.                                   
  283.                 }
  284.           // delay(100);       
  285.         }
  286. }
  287. void gunchu(uchar shang[][32],uchar xia[][32])
  288. {
  289.     unsigned int m,n;
  290.         for(m=0;m<64;m++)
  291.         {          for(n=0;n<16;n++)
  292.                 {         
  293.                  
  294.                         zi_yi_ru(shang,xia);//hengyi();
  295.                         scan();               
  296.                                   
  297.                 }
  298.                
  299.         }
  300. }
  301. //void full_clear2()
  302. //{
  303. //    unsigned int m,n;
  304. //        for(m=0;m<64;m++)
  305. //        {          for(n=0;n<16;n++)
  306. //                {         
  307. //                    zi_yi_ru2(hz3);//hengyi();
  308. //                        scan();               
  309. //                                  
  310. //                }
  311. //        }
  312. //}

  313. void soft_reset(void)
  314. {
  315. ((void (code *) (void)) 0x0000) ();
  316. }

  317. /*****************延时函数:大约1ms************************/
  318. void delay(uint i)
  319. {
  320.   uint j,k;
  321.   for(j=i;j>0;j--)
  322.     for(k=1250;k>0;k--);
  323. }

  324. void main()
  325. {

  326.         unsigned int m,n,e,d,g,gang=10;
  327. ……………………

  328. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
64乘32点阵板.c.rar (73.83 KB, 下载次数: 20)


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

使用道具 举报

沙发
ID:291645 发表于 2018-3-24 02:00 | 只看该作者
大兄弟,如果这代码换成单色点阵怎么改
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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