找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8363|回复: 15
收起左侧

单片机点阵LED书写屏幕DIY

  [复制链接]
ID:392682 发表于 2018-9-2 21:18 | 显示全部楼层 |阅读模式
制作出来的DIY书写屏幕实物图如下:

光笔书写

光笔书写

逐点扫描书写屏幕

逐点扫描书写屏幕

写好的字在一般显示屏上显示

写好的字在一般显示屏上显示


单片机源程序如下:
  1. #include "dianzhen3_lib.h"

  2. #define u8 unsigned char
  3. #define dianzhen_138_location P2
  4. bit scan_f = 0;//当输入按键按下时138点阵开始扫描
  5. bit odd_or_even = 0;//修改键按下次数的奇偶标志位
  6. bit input_or_finish_flag = 0;
  7. u8 k=0;

  8. u8 key_value;
  9. u8 location_num = 0;
  10. u8 del_location_num = 0;
  11. u8 xdata t_collect[130]={0xff};
  12. u8  xdata t_del[30]={ 0xff };
  13. u8  xdata   t_ku[254];
  14. u8  code t_ku_1[254]={   //0xff被保留,用作采集数据的最后一个.0xfe也被保留,t_ku[]填充
  15.                                                                                         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
  16.                                                                                         …………
  17. …………
  18. …………限于本文篇幅 余下代码请从51黑下载附件…………
  19.                                                                                         0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};

  20. extern unsigned char code  infro3[208]; //淮工光信秦帅
  21. void main()
  22. {
  23.         u8  i, j;
  24.        
  25.         P3M0         =           0;       //使P3口与P2口为准双向口,和传统51单片机一样
  26.         P3M1         =           0;
  27.         P2M0         =       0xff;   //P2口为推挽输出用来驱动138点阵
  28.         P2M1         =           0;
  29.         P1M0         =        0xff;   //用P1口来驱动595点阵屏
  30.         P1M1         =           0;
  31.         P0M0         =      0x07;
  32.         P0M1         =            0;//使P00.P01.P02推挽输出
  33.         EA             =            1;//按键中断一直开
  34.         EX1           =            1;
  35.         IT1             =            1;
  36.         P55            =            1;  //因为手头上的这块15单片机的P3.5口始终为0,不知为啥,就用了P55来替代,用作按键部分
  37.         P3              =        0xff;
  38.         P01            =            0;   ////绿灯,高电平点亮
  39.         P00            =            0;  //红灯,高电平点亮
  40.         P02            =            1;  //138点阵使能端,低电平有效
  41.        
  42.         for(i=0; i<254; i++ )     //赋值t_ku[]
  43.         {
  44.                 t_ku[i] = t_ku_1[i];
  45.         }
  46.         while(scan_f == 0)     //当没开始按下的时候一直显示“淮工光信秦帅”
  47.         {
  48.                 infro_display( 3 );
  49.         }
  50.         while(1)
  51.         {
  52.         while( scan_f == 1 )
  53.         {
  54.                 if( odd_or_even  == 0 )     //只有当修改键是偶数次按下的时候才扫描(偶数次包含0次)
  55.                 {
  56.                 for(k=0; k<254; k++)    //开始扫描138点阵
  57.                         {
  58.                                 dianzhen_138_location = t_ku[k];
  59.                             Delay(1) ;
  60.                         }       
  61.                 }
  62.                 else   if( odd_or_even  == 1 )   //修改键奇数次按下时,将收集到的数据显示出来
  63.                 {
  64.                 for( i=0; t_collect[i]!=0xff ; i++ )
  65.                         {
  66.                                 if(  t_collect[i] == 0xfe )
  67.                                 {
  68.                                         continue;
  69.                                 }
  70.                                 dianzhen_138_location = t_collect[i];
  71.                                 Delay(2);            
  72.                         }       
  73.                 }
  74.        
  75.                 if( key_value == input )
  76.                 {
  77.                         key_value = 0 ;       //将key_value内容清空

  78.                          location_num = 0;
  79.                  del_location_num = 0;
  80.                          odd_or_even = 0;
  81.                         for(i=0; i<254; i++ )     //赋值t_ku[]
  82.                 {
  83.                        t_ku[i] = t_ku_1[i];
  84.                 }
  85.          
  86.                         t_collect[0] = 0xff;
  87.                         t_del[0] = 0xff;
  88.                        
  89.                         EX0 = 1;                 //启动外部中断0(光笔生效)
  90.                         IT0   = 1;
  91.                 }
  92.                
  93.                 if( key_value == modify)
  94.                 {
  95.                         key_value = 0;

  96.                         if( t_collect[0] != 0xff )//没有采集数据则不修改
  97.                         {
  98.                                 odd_or_even  =  ~odd_or_even;//为1时是奇数次按下,为0时是偶数次按下
  99.                                 if( odd_or_even == 0 )//如果修改是偶数次按下修改键,则收回被删除的点
  100.                                 {
  101.                                         if( t_del[0] != 0xff )
  102.                                         {
  103.                                                 for( i=0; t_del[i] != 0xff ; i++ )
  104.                                                 {
  105.                                                         for(j=0;t_ku[j] != 0xfe ; j++);
  106.                                                         t_ku[j] = t_del[i];
  107.                                                 }
  108.                                                 t_del[0] = 0xff;                          //数组的第一个数若为0xff,则说明此数组里面无需执行数据
  109.                                                 del_location_num = 0;
  110.                                         }
  111.                                 }
  112.                                
  113.                         }
  114.                 }
  115.                
  116.        
  117.                 if( key_value == save )
  118.                 {
  119.                         key_value = 0;
  120.                         EA = 0;
  121.                         if (t_collect[ 0 ] == 0xff)//若没有需要保存的数据,则闪一下红灯;返回
  122.                         {
  123.                             P01 = 1;//如果保存失败则红灯闪烁一下(P01口接红灯)高电平点亮
  124.                     Delay(255);
  125.                                 Delay(255);
  126.                                 Delay(255);
  127.                                 Delay(255);
  128.                                 Delay(255);
  129.                                 Delay(255);
  130.                     P01 = 0;
  131.                         }
  132.                         else
  133.                         {
  134.                                 if ( save_data( t_collect ) !=0 )
  135.                                 {
  136.                                 P00 = 1;//如果保存成功则绿灯闪烁一下(P01口接绿灯)高电平点亮
  137.                         Delay(255);
  138.                                         Delay(255);
  139.                                         Delay(255);
  140.                                         Delay(255);
  141.                                         Delay(255);
  142.                                         Delay(255);
  143.                         P00 = 0;
  144.                                 key_value = input;//若保存成功则开始下个字的输入,若不成功则返回
  145.                                 }
  146.                                 else
  147.                                 {
  148.                                          P01 = 1;//如果没有保存成功则红灯闪烁一下(P11口接红灯)
  149.                          Delay(255);
  150.                                          Delay(255);
  151.                                          Delay(255);
  152.                                          Delay(255);
  153.                                          Delay(255);
  154.                                          Delay(255);
  155.                          P01 = 0;
  156.                                 }
  157.                             
  158.                         }
  159.                    EA = 1;       
  160.                 }
  161.                
  162. }
  163.                 if( key_value == finish )
  164.                 {
  165.                         key_value = 0;
  166.                         EX0 = 0;                 //关闭外部中断0(光笔生效)
  167.                         P02 = 1;                 //关闭书写屏(P02)为138点阵屏的使能端
  168.                 //        IT0   = 1;
  169.                         P17  = 1;//595点阵屏的使能端,低电平有效(即为高电平是全部输出低电平)
  170.                 }
  171.                
  172.                 if( key_value == display )
  173.                 {
  174.                         key_value = 0;               
  175.                        
  176.                         EX0 = 0;
  177.                         P02 = 1;                               //关闭书写屏(P02)为138点阵屏的使能端
  178.                         data_display();                     //一直显示直到input或者finish按键按下
  179. //                        for(k=0; k<254; k++)   //用t_ku数组来存显示数据,返回后需重新赋值
  180. //                           {
  181. //                                  dianzhen_138_location = t_ku[k];
  182. //                              Delay(1) ;
  183. //                           }       
  184. //                        EX0 = 1;
  185.                 }
  186.         }
  187.        
  188. }

  189. void key_interput1() interrupt 2
  190. {
  191.         u8 t;
  192.         t = P3;
  193.     Delay10ms()        ;
  194.         if( t != P3 )
  195.         {
  196.                 return ;
  197.         }
  198.                
  199.         switch( t & 0Xd0 )
  200.         {
  201.                 case 0xc0: key_value = input ; scan_f = 1 ; input_or_finish_flag = 1; P02 =0;break;//P02是138点阵的使能端口
  202.                 case 0x90: key_value = save  ; input_or_finish_flag = 0; break;
  203.                 case 0x50: key_value = finish ; scan_f = 0  ; input_or_finish_flag = 1; break;
  204.                 case 0xd0: if( P55 == 0 ) {key_value = modify  ;input_or_finish_flag = 0;}
  205.                                   else if(  P33 == 0  ){key_value = display ; scan_f = 0 ;input_or_finish_flag = 0;} break;
  206.         }
  207.        
  208.         for(t=0; t<50; t++)
  209.         {
  210.           while(P33 == 0)
  211.        {
  212.          Delay10ms();
  213.        }
  214.         }
  215. }


  216. void  Led_3du33_interrput() interrupt 0
  217. {
  218.         u8  i ;
  219.         //static del_f = 1;       
  220.         EX0=0;
  221.     for(i=0; i<location_num; i++)       //判断此点是否已经采集过若采集过则不再重新采集
  222.         {
  223.                 if( ( t_collect[i] == dianzhen_138_location ) && (dianzhen_138_location != 0xfe))
  224.                 {
  225.                         if( (odd_or_even == 1)  && ( del_location_num<28))//修改键奇数次按下,这里允许删除了28个点坐标,可以改动
  226.                         {  
  227.                                  //Delay10ms()  ;                   //如果真要删除点的话,在这里用一下延时,慢一点
  228.                                 //if (P32 == 0)
  229.                                 //{
  230.                                 // del_f=~del_f;
  231.                                 //if(del_f == 1)
  232.                                 //{
  233.                                 if( t_collect[i-1] == dianzhen_138_location )        //这个if是用来防止滞后响应的
  234.                                 {                                                                        //比如因为上一个点响应的中断
  235.                                          t_del[del_location_num++] = t_collect[(i-1)] ;//但是点阵坐标已经跑到下一个了
  236.                                 t_collect[(i-1)]=0xfe;                                       //消除的数据点需要用0xfe来填充,0xfe将会在存储数据时被消除
  237.                                 }
  238.                                 else
  239.                                 {
  240.                                     t_del[del_location_num++] =  t_collect[i]  ;
  241.                                 t_collect[i]=0xfe;                     //消除的数据点需要用0xfe来填充,0xfe将会在存储数据时被消除
  242.                                 }
  243.                                 t_del[del_location_num] = 0xff ;//用0xff表示结束                       
  244.                                 //}       
  245.                                 //}                               
  246.                         }
  247.                         EX0 = 1;
  248.                         return;
  249.                 }
  250.                
  251.         }
  252.         if( location_num <130 )
  253.         {
  254.             t_collect[ location_num++] = dianzhen_138_location;//t_ku[]扫描时选中一个数,则消失一个点
  255.                 if(t_ku[(k-1)] == dianzhen_138_location)  // 这个if的作用和删除点时的if目的是一样的
  256.                 {
  257.                         t_ku[(--k)] = 0xfe;//被选中的数,用0xfe来替补 (因为有时候时间有点错开了,比如扫描函数已经执行完了K++,然后才跑到中断的情况)
  258.                 }
  259.                 else
  260.                 {
  261.                      t_ku[k] = 0xfe;//被选中的数,用0xfe来替补 (0xfe将会在保存的时候被删除)
  262.                 }
  263.                 t_collect[ location_num] = 0xff ;//0xff 始终为最后一个数
  264.         }

  265.          EX0 = 1;
  266.         return;
  267. }
复制代码
  1. #include "intrins.h"
  2. #include <stc15.h>
  3. #define ENABLE_IAP  0x82            //if SYSCLK<20MHz
  4. #define CMD_IDLE    0               //????
  5. #define CMD_READ    1               //IAP?????
  6. #define CMD_PROGRAM 2               //IAP??????
  7. #define CMD_ERASE   3               //IAP??????
  8. #define data_num_addr 0x0000
  9. #define data_addr 0x0200
  10. extern bit input_or_finish_flag;  //声明外部变量,用来判断input或者finish键是否按下,0表示无按下,1表示有按下
  11. extern unsigned char  xdata t_ku[300]; //用这个数组来缓存从flash中读取的点阵信息
  12. void Delay(unsigned char n);     //上面对于位变量的外部引用,需要加上变量类型bit
  13. void IapIdle();
  14. unsigned char IapReadByte(unsigned int addr);
  15. void IapProgramByte(unsigned int addr, unsigned char dat);
  16. void IapEraseSector(unsigned int addr);
  17. unsigned char code  infro1[240]={
  18. 0x00,0x00,0x10,0x40,0x10,0x20,0x10,0x10,0x10,0x10,0x10,0x28,0x11,0x44,0x16,0x42,
  19. 0x10,0x41,0x90,0x40,0x50,0x40,0x30,0x40,0x10,0x40,0x00,0x40,0x00,0x40,0x00,0x00,/*"之",0*/
  20. …………
  21. …………
  22. …………限于本文篇幅 余下代码请从51黑下载附件…………
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*" ",6*/

  24. void Delay10ms()                //@11.0592MHz
  25. {
  26.         unsigned char i, j;
  27.     _nop_();
  28.         _nop_();
  29.         i = 108;
  30.         j = 145;
  31.         do
  32.         {
  33.                 while (--j);
  34.         } while (--i);
  35. }
  36. void Delay(unsigned char i)                //@11.0592MHz
  37. {
  38.         unsigned char  j;
  39.         j = 200;//200-215下眼看不怎么闪   220-230,正眼看不怎么闪
  40.         do
  41.         {
  42.                 while (--j);
  43.         } while (--i);
  44. }

  45. void sendata595(unsigned char i,unsigned char i2)
  46. {
  47.    unsigned char j;
  48.    P1=P1&0xbf;
  49.    for(j=0;j<8;j++)
  50.    {      
  51.     P1&=0Xdf;
  52.     P1=(P1&0Xef)|((i&0x80)>>3);
  53.     P1|=0x20;
  54.     i<<=1;
  55.    }
  56.     for(j=0;j<8;j++)
  57.    {      
  58.     P1&=0Xdf;
  59.     P1=(P1&0Xef)|((i2&0x80)>>3);
  60.     P1|=0x20;
  61.     i2<<=1;
  62.    }
  63.    P1=P1|0x40;
  64. }

  65. void infro_display( unsigned char i )//当数据存储区达到8个字或者没有存储的信息就用来显示操作信息
  66. {
  67.         unsigned int  j , n, j2=0 ;
  68.         unsigned char i2 ;//用来控制循环显示次数
  69.         unsigned char *table2 ;
  70.         unsigned char c ;//显示一板字时的刷新次数
  71.         switch(i)
  72.         {
  73.                 case 1: j2 = 208; table2 = infro1;break;
  74.                 case 2: j2 = 416; table2 = infro2;break;
  75.                 case 3: j2 = 176; table2 = infro3;break;
  76.         }
  77.         for(i2=0;i2<2;i2++)//循环显示两次
  78.     {
  79.           if( j2==176)//如果是显示“淮工光信秦帅”则一直显示,直到input或者finish
  80.           {
  81.                   i2 = 0;  
  82.           }
  83.      for(j=0;j<j2;j+=2)
  84.            {
  85.                    if( input_or_finish_flag == 1)
  86.                    {
  87.                            return;//如果输入键(input)按下,或者结束键(finish)按下,则结束此函数
  88.                    }
  89.               for(c=0;c<22;c++)//显示一板字时的刷新次数
  90.                         {
  91.                          n=j;       
  92.                          P1&=0xf0;
  93.                          for(i=0;n<32+j;n=n+2,i++)
  94.                           {
  95.                                 sendata595(table2[n],table2[n+1]);
  96.                                 P1=( (P1&0xf0)|i );
  97.                                 P17 = 0;
  98.                                 Delay(2);
  99.                                 P17 = 1;  
  100.                           }  
  101.                         }
  102.          }
  103.       }
  104.    }


  105. void pailie(unsigned char*w,unsigned char k)                  
  106. {
  107.         unsigned char t=0,i,j;
  108.         for(i=0;i<k-1;i++)
  109.                 for(j=0;j<k-1-i;j++)
  110.                 {
  111.                         if(w[j]>w[j+1])
  112.                         {
  113.                                     t = w[j];
  114.                                 w[j] = w[j+1];
  115.                                 w[j+1] = t;
  116.                         }
  117.                 }
  118. }


  119. void convert_to_595( unsigned char *q)
  120. {
  121.         unsigned char k, i, t, t2, j,a[32]={0x00};
  122.         for(i=0; q[i]!=0xff; i++); //统计出数组内元素的个数
  123.          pailie(q , i) ;
  124.          i=0;
  125.      t=(q[0]&0xf0)>>4;  
  126.      j=(q[0]&0x0f);     
  127.      t2=t;               
  128.    for(;t>0;t--,i=i+2)
  129.    {
  130.       a[i]=0x00 ;
  131.           a[i+1]=0x00 ;
  132.    }
  133.    a[i] |= (0x01<<j );  
  134.    for(k=1; q[k]!=0xff; k++)
  135.    {
  136.            t=( q[k]&0xf0 )>>4;
  137.            j=( q[k]&0x0f ) ;
  138.            if( t2 != t )
  139.            {
  140.                    i=i+2;            
  141.                    for( ;i<( t+t ); i=i+2)
  142.                    {
  143.                              a[i] = 0x00     ;
  144.                              a[i+1]=0x00   ;
  145.                    }
  146.                     t2 = t;
  147.            }
  148.        if( j < 8 )
  149.                 {
  150.                    a[i] |= ( 0x01<< j ) ;
  151.                 }
  152.            else
  153.                 {
  154.                    a[i+1] |= ( 0x01<<(j-8) );
  155.                 }          
  156.    }
  157.    for( i=0; i<32;i++)
  158.     {
  159.                 q[i] = a[i];
  160.         }               
  161.             q[32] = 0xff;
  162.    }


  163.    

  164. bit save_data( unsigned char *p  )
  165. {
  166.         static unsigned  char  save_data_num = 0;
  167.         bit y_n_flag =0;//操作成功或失败的标志 1表示成功,0代表失败
  168.         unsigned int  i, j = 0;
  169.         while( (j<5) && (y_n_flag == 0) )
  170.         {
  171.                 j++;
  172.            IapEraseSector(data_num_addr);//首先擦除第一与第二个扇区的原始数据
  173.           if( save_data_num == 0 )
  174.              IapEraseSector(data_addr);//首先擦除第一与第二个扇区的原始数据
  175.           y_n_flag = 1;
  176.           for(i=0; i<2; i++)
  177.         {
  178.                    if (IapReadByte(data_num_addr+i) != 0xff)
  179.                    {
  180.                            y_n_flag = 0;
  181.               break;   
  182.                    }
  183.             }
  184.                
  185.         if( save_data_num == 0 )          
  186.                 {
  187.                         for(i=0; i<512; i++)
  188.                         {
  189.                                 if ( IapReadByte(data_addr+i) != 0xff )
  190.                           {
  191.                                           y_n_flag = 0;
  192.                       break;  
  193.                               }          
  194.                     }                                                    
  195.          }          
  196.       }
  197.         if( y_n_flag == 0 )
  198.         {
  199.                 return 0;//提前结束此函数,因为擦除操作不成功
  200.         }
  201.         Delay(1);
  202.        
  203.         i=0;
  204.         j=0;
  205.         save_data_num ++;
  206.        
  207.         if( save_data_num == 9 )//如果已经保存了8个数,则清除这8个数
  208.         {
  209.                 save_data_num = 1;
  210.                 IapEraseSector(data_num_addr);
  211.                 IapEraseSector(data_addr);
  212.                  y_n_flag = 0 ;
  213.                 while(( j<5) && ( y_n_flag == 0))
  214.                 {
  215.                         y_n_flag = 1;
  216.                         for(i=0; i<2; i++)
  217.                         {
  218.                                 if ( IapReadByte(data_num_addr+i) != 0xff )
  219.                                {
  220.                                                y_n_flag = 0;
  221.                            break;  
  222.                                     }          
  223.                         }
  224.                         if( y_n_flag != 0)
  225.                         {
  226.                         for( i=0; i<300; i++) //因为最多只是用到了256个
  227.                         {
  228.                                         if ( IapReadByte(data_addr+i) != 0xff )
  229.                                {
  230.                                                y_n_flag = 0;
  231.                            break;  
  232.                                     }          
  233.                         }
  234.                         }
  235.                 }
  236.                 if( y_n_flag == 1 )
  237.                 {
  238.                         infro_display( 1 );//循环显示两次“之前数据已删”
  239.                 }
  240.                 else
  241.                 {
  242.                         infro_display( 2 );//循环显示两次“数据数据删除失败,数据未保存”
  243.                         save_data_num = 0;
  244.                         return y_n_flag;
  245.                 }
  246.                
  247.         }
  248.         for( j=0; p[j] != 0xff; j++ )//将收集数组里面的0xfe删除(0xfe是用来填充的)
  249.         {
  250.                 if( p[j] == 0xfe )
  251.                 {
  252.                         i = j;
  253.                         for(;p[i] != 0xff; i++)
  254.                         {
  255.                                 p[i]=p[i+1] ;
  256.                         }
  257.                         if(j>0) j=j-1;
  258.                 }
  259.         }
  260.         convert_to_595(p);//如果前面的块删除操作成功,则开始转化字库
  261.         IapProgramByte(data_num_addr, save_data_num);//在0x0000处写上保存数据的个数
  262.         for( j=(save_data_num-1)*32,i=j;  i<j+32; i++ )
  263.         {
  264.                 IapProgramByte(data_addr+i, p[(i%32)]);//将点阵数据保存到第二扇区里
  265.         }
  266.        
  267.         return y_n_flag;//若值为0,则说明未保存成功,值为1,则保存成功

  268. }


  269. void save_data_display(unsigned char *p3,unsigned int i3)
  270. {
  271.         unsigned int j = 0,n ;
  272.         unsigned char i,c ;
  273.         while(1)                        //一直显示直到input或者finish按下
  274.         {
  275.         for(j=0; j<=i3; j+=2)
  276.            {
  277.                    if( i3 <33 )//代表只有一个数的时候,j=0,能让其静态显示
  278.                    {
  279.                            j = 0;
  280.                    }
  281.                    if( input_or_finish_flag == 1)
  282.                    {
  283.                            return;//如果输入键(input)按下,或者结束键(finish)按下,则结束此函数
  284.                    }
  285.               for(c=0;c<22;c++)//显示一板字时的刷新次数
  286.                         {
  287.                          n=j;       
  288.                          P1&=0xf0;
  289.                          for(i=0;n<32+j;n=n+2,i++)
  290.                           {
  291.                                 sendata595(p3[n],p3[n+1]);
  292.                                 P1=( (P1&0xf0)|i );
  293.                                 P17 = 0;
  294.                                 Delay(2);
  295.                                 P17 = 1;  
  296.                           }  
  297.                         }
  298.          }
  299.          }
  300. }


  301. void data_display()
  302. {
  303.         unsigned int i,j;
  304.         i = IapReadByte( data_num_addr);
  305.         if ( i == 0xff)          //若没有存储的数据,则循环显示“淮工光信秦帅”  可以按input或者finish键退出
  306.         {
  307.                 infro_display(3 );               
  308.         }
  309.         else if( i >=1)
  310.         {  
  311.                    i = i*32; //i<256
  312.                    for( j=0; j<i ; j++)//若存了不只一个数,则移屏显示这些数  可以按input或者finish键退出
  313.                       {
  314.                                   t_ku[j] = IapReadByte( data_addr+j);
  315.                           }
  316.                           for(; j<32+i;j++)    //为了让其显示更流畅
  317.                           {
  318.                                    t_ku[j] =0x00;
  319.                           }
  320.                           save_data_display( t_ku,i); //若i>32则说明是移动显示
  321. ……………………

  322. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
代码.rar (81.09 KB, 下载次数: 65)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:392682 发表于 2018-9-2 21:36 | 显示全部楼层
第一次做的作品,从16*16的书写点阵屏与显示点阵屏拼接起,开始学画板,单片机,感觉学到来不少
回复

使用道具 举报

ID:1 发表于 2018-9-3 01:54 | 显示全部楼层
好东东,源码和原理图能分享吗?
回复

使用道具 举报

ID:97554 发表于 2018-9-3 08:46 | 显示全部楼层
qinshuai 发表于 2018-9-2 21:36
第一次做的作品,从16*16的书写点阵屏与显示点阵屏拼接起,开始学画板,单片机,感觉学到来不少

笔是检测光源,然后扫描点阵,当笔接收到暗信号然后就让程序处理该点熄灭,是这个原理吗?同理点亮一个点?
回复

使用道具 举报

ID:392682 发表于 2018-9-3 12:35 | 显示全部楼层
对,就是这个原理,点阵瞬间只亮一个点,扫描整个点阵,光笔放在对应的点上,当该点被点亮时,光笔接收到信号,单片机产生中断,记录下该点坐标,然后再一系列处理

评分

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

查看全部评分

回复

使用道具 举报

ID:392682 发表于 2018-9-3 12:37 | 显示全部楼层
admin 发表于 2018-9-3 01:54
好东东,源码和原理图能分享吗?

可以,待会发,
回复

使用道具 举报

ID:392682 发表于 2018-9-3 13:30 | 显示全部楼层
书写屏驱动是用的138,普通显示屏的驱动是138与595,感应笔用的是光电三极管3DU33,单片机用STC15。感觉比较费事的工作是如何把书写屏的坐标转化为普通的显示屏的坐标。

评分

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

查看全部评分

回复

使用道具 举报

ID:135640 发表于 2018-9-4 15:00 | 显示全部楼层
什么时候才能像楼主一样牛人的存在呀!
回复

使用道具 举报

ID:65956 发表于 2018-9-27 08:52 | 显示全部楼层
这个有点不可思议?第一次看到有这种方案?值得学习
回复

使用道具 举报

ID:73118 发表于 2019-4-5 13:13 | 显示全部楼层
资料不完整
回复

使用道具 举报

ID:437233 发表于 2019-5-7 22:04 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:303735 发表于 2019-5-9 16:42 | 显示全部楼层
好不错,
回复

使用道具 举报

ID:531587 发表于 2019-5-18 11:35 | 显示全部楼层
高手啊,佩服佩服。
回复

使用道具 举报

ID:214068 发表于 2019-5-18 16:10 | 显示全部楼层
你才是大牛   从没想过还可以这么玩···
回复

使用道具 举报

ID:635828 发表于 2019-11-26 12:59 | 显示全部楼层
能分享一下原理图吗?
回复

使用道具 举报

ID:73118 发表于 2019-12-20 10:09 | 显示全部楼层
大神只是分享了一份错误资料而已
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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