极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17672|回复: 5

求高手修改下 8051的LED点阵程序为arduino程序。

[复制链接]
发表于 2012-6-21 10:02:25 | 显示全部楼层 |阅读模式
感谢 [email protected] 的代码。  程序已经测试正常。




以上为该 模块的 资料。
以下为原始代码。

  1. /*16*16点阵屏的显示*/

  2. #include <reg51.h>
  3. #include <intrins.h>       

  4. #define DATE_OUT P2                        //指定P2口做为输出
  5. sbit DATA=DATE_OUT^0;                //列数据输出位       
  6. sbit SCLH=DATE_OUT^1;                //列扫描时钟位
  7. sbit SCLT=DATE_OUT^2;                //列数据锁存位
  8. sbit AB  =DATE_OUT^3;                //行数据输出位
  9. sbit SCK =DATE_OUT^4;                //行扫描时钟位


  10. unsigned char date[32];                //32字节RAM做为16*16点阵屏显示缓存
  11. void display();                                //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
  12. void display_time(unsigned int timer);                        //指定时间扫描显示


  13. code unsigned char zuo[32]={//左
  14. 0x02,0x00,0x02,0x00,0x02,0x08,0x0FF,0x0FC,
  15. 0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x10,
  16. 0x0F,0x0F8,0x10,0x80,0x10,0x80,0x20,0x80,
  17. 0x40,0x80,0x80,0x84,0x7F,0x0FE,0x00,0x00};

  18. code unsigned char you[32]={//右
  19. 0x02,0x00,0x02,0x00,0x02,0x04,0x0FF,0x0FE,
  20. 0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x08,
  21. 0x1F,0x0FC,0x28,0x08,0x48,0x08,0x88,0x08,
  22. 0x08,0x08,0x08,0x08,0x0F,0x0F8,0x08,0x08};

  23. code unsigned char sha[32]={//刹
  24. 0x20,0x84,0x11,0x84,0x0A,0x24,0x04,0x24,
  25. 0x0A,0x24,0x11,0x0A4,0x64,0x0A4,0x04,0x24,
  26. 0x0FF,0x0E4,0x04,0x24,0x15,0x24,0x14,0x84,
  27. 0x24,0x84,0x44,0x04,0x14,0x14,0x08,0x08};

  28. code unsigned char ting[32]={//停
  29. 0x10,0x80,0x10,0x48,0x17,0x0FC,0x20,0x00,
  30. 0x23,0x0F8,0x62,0x08,0x0A3,0x0F8,0x20,0x00,
  31. 0x2F,0x0FE,0x28,0x02,0x33,0x0F4,0x20,0x40,
  32. 0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80};


  33. void main(void)
  34. {
  35.         unsigned char i=0,j=0;       
  36.         while(1)
  37.                 {       
  38.                 for(i=0;i<32;i++)
  39.                         date[i]=zuo[i];//将"左"字数据复制到显示缓存
  40.                 display_time(2);        //显示约2秒

  41.                 for(i=0;i<32;i++)
  42.                         date[i]=you[i];//将"右"字数据复制到显示缓存
  43.                 display_time(2);        //显示约2秒

  44.                 for(i=0;i<32;i++)
  45.                         date[i]=sha[i];//将"刹"字数据复制到显示缓存
  46.                 display_time(2);        //显示约2秒

  47.                 for(i=0;i<32;i++)
  48.                         date[i]=ting[i];//将"停"字数据复制到显示缓存
  49.                 display_time(2);        //显示约2秒
  50.                 }
  51. }

  52. /*   显示函数   */
  53. void display()
  54. {       
  55.         unsigned char i,ia,j,tmp;                //定义变量
  56.         DATE_OUT=0XFF;                                        //置位高电平做准备
  57.         AB=0;                                                        //将行数据位清0,准备移位
  58.         for(i=0;i<16;i++)                            //循环输出16行数据
  59.         {               
  60.                 SCK=0;                                //为行移位做准备
  61.                 SCLT=0;                                //为列锁存做准备
  62.                 for(ia=2;ia>0;)                //每行16个点,循环位移两个字节
  63.                 {       
  64.                         ia--;                        //循环两次
  65.                         tmp=~date[i*2+ia];                //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,
  66.                                                                     //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
  67.                         for(j=0;j<8;j++)                 //循环两次,每次移一个字节,
  68.                                 {       
  69.                                 SCLH=0;                                //为列移位做准备
  70.                              DATA=tmp&0x01;             //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
  71.                                 tmp>>=1;                          //将数据缓冲右移一位,为下次输出做准备
  72.                              SCLH=1;                                //将DATA上的数据移入寄存器
  73.                         }                                        //移入单字节结束
  74.                 }                                                        //移入两个字节结束
  75.                 DATE_OUT|=0X14;                                //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像
  76.                 //SCK=1;                                        //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
  77.                 //SCLT=1;                                        //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始
  78.                 AB=1;                                                //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
  79.         }                                                                //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱       
  80.         j=64;
  81.         while(j--);                //每一行的显示,保持两个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
  82.         SCK=0;                        //
  83.         SCK=1;                        //将最后一行数据移出
  84. }

  85. /*   timer=1时,为1s左右的延时   */
  86. void display_time(unsigned int timer)        //指定时间扫描显示
  87. {
  88.         unsigned char i;       
  89.         while(timer--)
  90.         {               
  91.                 i=130;               
  92.                 while(i--)
  93.                         display();
  94.         }
  95. }
复制代码



这是我改的。。  好像还是 不对
  1. /*
  2.   Blink
  3.   Turns on an LED on for one second, then off for one second, repeatedly.

  4.   This example code is in the public domain.
  5. */

  6. // Pin 13 has an LED connected on most Arduino boards.
  7. // give it a name:
  8. int led = 13;

  9. unsigned char i=0,j=0;       
  10. //ck:  P24
  11. //ab:  P23
  12. //rck: P22
  13. //srcl:P21
  14. //ser: P20

  15. static const int DATA=9;                //列数据输出位        灰
  16. static const int SCLH=10;                //列扫描时钟位  紫
  17. static const int SCLT=11;                //列数据锁存位  蓝
  18. static const int AB  =12;                //行数据输出位  绿
  19. //static const int SCK =13;                //行扫描时钟位  黄



  20. unsigned char date[32];                //32字节RAM做为16*16点阵屏显示缓存
  21. void display();                                //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
  22. void display_time(unsigned int timer);                        //指定时间扫描显示


  23.   unsigned char zuo[32]={//左
  24. 0x02,0x00,0x02,0x00,0x02,0x08,0x0FF,0x0FC,
  25. 0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x10,
  26. 0x0F,0x0F8,0x10,0x80,0x10,0x80,0x20,0x80,
  27. 0x40,0x80,0x80,0x84,0x7F,0x0FE,0x00,0x00};

  28.   unsigned char you[32]={//右
  29. 0x02,0x00,0x02,0x00,0x02,0x04,0x0FF,0x0FE,
  30. 0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x08,
  31. 0x1F,0x0FC,0x28,0x08,0x48,0x08,0x88,0x08,
  32. 0x08,0x08,0x08,0x08,0x0F,0x0F8,0x08,0x08};

  33.   unsigned char sha[32]={//刹
  34. 0x20,0x84,0x11,0x84,0x0A,0x24,0x04,0x24,
  35. 0x0A,0x24,0x11,0x0A4,0x64,0x0A4,0x04,0x24,
  36. 0x0FF,0x0E4,0x04,0x24,0x15,0x24,0x14,0x84,
  37. 0x24,0x84,0x44,0x04,0x14,0x14,0x08,0x08};

  38.   unsigned char ting[32]={//停
  39. 0x10,0x80,0x10,0x48,0x17,0x0FC,0x20,0x00,
  40. 0x23,0x0F8,0x62,0x08,0x0A3,0x0F8,0x20,0x00,
  41. 0x2F,0x0FE,0x28,0x02,0x33,0x0F4,0x20,0x40,
  42. 0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80};



  43. // the setup routine runs once when you press reset:
  44. void setup() {               
  45.   // initialize the digital pin as an output.
  46.   pinMode(led, OUTPUT);     
  47. }

  48. // the loop routine runs over and over again forever:
  49. void loop() {
  50.   digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  51.   delay(1000);               // wait for a second
  52.   digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  53.   delay(1000);               // wait for a second
  54. show();
  55. }

  56. void high(int led){
  57.   digitalWrite(led, HIGH);
  58. }

  59. void low(int led){
  60.   digitalWrite(led, LOW);
  61. }

  62. void highAll(){
  63.   high(DATA);
  64.   high(SCLH);
  65.   high(SCLT);
  66.   high(AB);
  67.   high(SCK);
  68. }

  69. void show( )
  70. {
  71.        
  72.          
  73.                 for(i=0;i<32;i++)
  74.                         date[i]=zuo[i];//将"左"字数据复制到显示缓存
  75.                 display_time(2);        //显示约2秒

  76.                 for(i=0;i<32;i++)
  77.                         date[i]=you[i];//将"右"字数据复制到显示缓存
  78.                 display_time(2);        //显示约2秒

  79.                 for(i=0;i<32;i++)
  80.                         date[i]=sha[i];//将"刹"字数据复制到显示缓存
  81.                 display_time(2);        //显示约2秒

  82.                 for(i=0;i<32;i++)
  83.                         date[i]=ting[i];//将"停"字数据复制到显示缓存
  84.                 display_time(2);        //显示约2秒
  85.                  
  86. }


  87. /*   显示函数   */
  88. void display()
  89. {       
  90.         unsigned char i,ia,j,tmp;                //定义变量
  91.         highAll();//DATE_OUT=0XFF;                                        //置位高电平做准备
  92.         low(AB);//AB=0;                                                        //将行数据位清0,准备移位
  93.         for(i=0;i<16;i++)                            //循环输出16行数据
  94.         {               
  95.                 low(SCK);//SCK=0;                                //为行移位做准备
  96.                 low(SCLT);//SCLT=0;                                //为列锁存做准备
  97.                 for(ia=2;ia>0;)                //每行16个点,循环位移两个字节
  98.                 {       
  99.                         ia--;                        //循环两次
  100.                         tmp=~date[i*2+ia];                //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,
  101.                                                                     //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
  102.                         for(j=0;j<8;j++)                 //循环两次,每次移一个字节,
  103.                                 {       
  104.                                 low(SCLH);//SCLH=0;                                //为列移位做准备
  105.                              //DATA=tmp&0x01;             //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
  106.                                 if(tmp&0x01==1){
  107.                                   high(DATA);
  108.                                 }else{
  109.                                    low(DATA);
  110.                                 }
  111.                               tmp>>=1;                          //将数据缓冲右移一位,为下次输出做准备
  112.                              high(SCLH);//SCLH=1;                                //将DATA上的数据移入寄存器
  113.                         }                                        //移入单字节结束
  114.                 }                                                        //移入两个字节结束
  115.                 ////DATE_OUT|=0X14;                                //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像
  116.                 //SCK=1;                                        //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
  117.                 //SCLT=1;                                        //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始
  118.                 high(DATA);//AB=1;                                                //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
  119.         }                                                                //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱       
  120.         j=64;
  121.         while(j--);                //每一行的显示,保持两个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
  122.         low(SCK);//SCK=0;                        //
  123.         high(SCK);//SCK=1;                        //将最后一行数据移出
  124. }

  125. /*   timer=1时,为1s左右的延时   */
  126. void display_time(unsigned int timer)        //指定时间扫描显示
  127. {
  128.         unsigned char i;       
  129.         while(timer--)
  130.         {               
  131.                 i=13000;               
  132.                 while(i--)
  133.                         display();
  134.         }
  135. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-6-23 17:23:13 | 显示全部楼层
诶~你怎么也用这个啊  是74hc595+74hc164吧
我前几天才做好的,才把软件改好想放教程就来这个
算了给你来吧
这三个字是我很重要的人的名字请不要改
中间因为无法同时改变电平所以有拖影
若不亮请改变接口定义
  1. #define DS 30        //列数据输出位 DS_595  
  2. #define SHCP 32        //列扫描时钟位 SHCP_595  
  3. #define STCP 34        //列数据锁存位 STCP_595   
  4. #define AB 36   //行数据输出位 AB_164  
  5. #define CLK 38        //行扫描时钟位 CP_164   

  6. unsigned char date[32];                //32字节RAM做为16*16点阵屏显示缓存
  7. unsigned char i=0,j=0;

  8. unsigned char code1[32]={//lu
  9.   0x00,0x20,0x7C,0x20,0x44,0x28,0x49,0xFC,
  10.   0x48,0x20,0x50,0x20,0x48,0x24,0x4B,0xFE,
  11.   0x44,0x20,0x45,0x24,0x45,0x24,0x69,0x24,
  12.   0x51,0x24,0x41,0x24,0x41,0xFC,0x41,0x04};

  13. unsigned char code2[32]={//jia
  14.   0x01,0x08,0x7F,0xFC,0x01,0x00,0x3F,0xF8,
  15.   0x00,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,
  16.   0x04,0x44,0xFF,0xFE,0x10,0x08,0x7E,0xFC,
  17.   0x12,0x88,0x12,0x88,0x2A,0xF8,0x44,0x88};

  18. unsigned char code3[32]={//nan
  19.   0x20,0x40,0x20,0x40,0x20,0x44,0x2F,0xFE,
  20.   0xF8,0x40,0x20,0x44,0x37,0xFE,0x6D,0x14,
  21.   0x64,0xA4,0xA5,0xF4,0x24,0x44,0x24,0x44,
  22.   0x27,0xFC,0x24,0x44,0x24,0x54,0x24,0x08
  23. };

  24. /*unsigned char code4[32]={//
  25.   0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x80,
  26.   0x20,0x84,0x3F,0xFE,0x20,0x00,0x20,0x00,
  27.   0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,
  28.   0x20,0x40,0x20,0x40,0x40,0x40,0x80,0x40};

  29. unsigned char code5[32]={//
  30.   0x01,0x00,0x11,0x00,0x11,0x10,0x1F,0xF8,
  31.   0x11,0x00,0x21,0x00,0x01,0x04,0xFF,0xFE,
  32.   0x03,0x00,0x05,0x80,0x09,0x40,0x11,0x30,
  33.   0x21,0x0E,0xC1,0x04,0x01,0x00,0x01,0x00
  34. };
  35. */
  36. void setup(){
  37.   pinMode(DS,OUTPUT);
  38.   pinMode(STCP,OUTPUT);
  39.   pinMode(SHCP,OUTPUT);
  40.   pinMode(CLK,OUTPUT);
  41.   pinMode(AB,OUTPUT);
  42. }

  43. void loop(){
  44.   for(i=0;i<32;i++){
  45.     date[i]=code1[i];
  46.   }
  47.   display_time(2);        //显示约2秒

  48.   for(i=0;i<32;i++){
  49.     date[i]=code2[i];
  50.   }
  51.   display_time(2);        //显示约2秒

  52.   for(i=0;i<32;i++){

  53.     date[i]=code3[i];
  54.   }
  55.   display_time(2);        //显示约2秒

  56. /* for(i=0;i<32;i++){
  57.     date[i]=code4[i];
  58.   }
  59.   display_time(2);        //显示约2秒

  60.   for(i=0;i<32;i++){
  61.     date[i]=code5[i];
  62.   }
  63.   display_time(2);        //显示约2秒
  64.    */
  65. }

  66. /*   显示函数   */
  67. void display()    //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
  68. {        
  69.   unsigned char i,ia,j,tmp;                //定义变量
  70.   digitalWrite(AB,LOW);                        //将行数据位清0,准备移位
  71.   for(i=0;i<16;i++)                        //循环输出16行数据
  72.   {               
  73.     digitalWrite(CLK,LOW);                //为行移位做准备
  74.     digitalWrite(STCP,LOW);                //为列锁存做准备
  75.     for(ia=2;ia>0;)                        //每行16个点,循环位移两个字节
  76.     {        
  77.       ia--;                                //循环两次
  78.       tmp=~date[i*2+ia];
  79.       //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,
  80.       //因一行16个点由两个字节组成,
  81.       //电路中的移位寄存器最后一位对应最后一列,
  82.       //所以要先输出一行中的第二个字节数据

  83.       shiftOut(DS,SHCP,LSBFIRST,tmp);
  84.       
  85.     }                                        //移入两个字节结束
  86.     digitalWrite(CLK,HIGH);
  87.     digitalWrite(STCP,HIGH);
  88.     digitalWrite(AB,HIGH);
  89.    
  90.   }               
  91.   j=64;
  92.   while(j--){               
  93.     digitalWrite(CLK,LOW);                        
  94.     digitalWrite(CLK,HIGH);
  95.   }
  96. }

  97. /*   timer=1时,为1s左右的延时   */

  98. void display_time(unsigned int timer)        //指定时间扫描显示
  99. {
  100.   unsigned char i;        
  101.   while(timer--)
  102.   {               
  103.     i=130;               
  104.     while(i--)
  105.       display();
  106.   }
  107. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-25 12:59:32 | 显示全部楼层
,今晚回家试试,多谢了。
回复 支持 反对

使用道具 举报

发表于 2012-6-25 17:41:58 | 显示全部楼层
双色的点阵和单色的点阵我也没有玩过,玩过RGB点阵,楼上的使出来发个效果图哦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-26 14:50:45 | 显示全部楼层
本帖最后由 Chenmin 于 2012-6-26 15:19 编辑



陆嘉楠 是你女朋友吗








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-11-13 13:02:42 | 显示全部楼层
同时改变电平可以参考这个帖子:http://www.geek-workshop.com/thread-389-1-1.html
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 18:19 , Processed in 0.039066 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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