久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9494|回復: 15
打印 上一主題 下一主題
收起左側

單片機點陣LED書寫屏幕DIY

  [復制鏈接]
跳轉到指定樓層
樓主
制作出來的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黑下載附件…………
復制代碼

所有資料51hei提供下載:
代碼.rar (81.09 KB, 下載次數: 69)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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的書寫點陣屏與顯示點陣屏拼接起,開始學畫板,單片機,感覺學到來不少

筆是檢測光源,然后掃描點陣,當筆接收到暗信號然后就讓程序處理該點熄滅,是這個原理嗎?同理點亮一個點?
回復

使用道具 舉報

5#
ID:392682 發表于 2018-9-3 12:35 | 只看該作者
對,就是這個原理,點陣瞬間只亮一個點,掃描整個點陣,光筆放在對應的點上,當該點被點亮時,光筆接收到信號,單片機產生中斷,記錄下該點坐標,然后再一系列處理

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:392682 發表于 2018-9-3 12:37 | 只看該作者
admin 發表于 2018-9-3 01:54
好東東,源碼和原理圖能分享嗎?

可以,待會發,
回復

使用道具 舉報

7#
ID:392682 發表于 2018-9-3 13:30 | 只看該作者
書寫屏驅動是用的138,普通顯示屏的驅動是138與595,感應筆用的是光電三極管3DU33,單片機用STC15。感覺比較費事的工作是如何把書寫屏的坐標轉化為普通的顯示屏的坐標。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:135640 發表于 2018-9-4 15:00 | 只看該作者
什么時候才能像樓主一樣牛人的存在呀!
回復

使用道具 舉報

9#
ID:65956 發表于 2018-9-27 08:52 | 只看該作者
這個有點不可思議?第一次看到有這種方案?值得學習
回復

使用道具 舉報

10#
ID:73118 發表于 2019-4-5 13:13 | 只看該作者
資料不完整
回復

使用道具 舉報

11#
ID:437233 發表于 2019-5-7 22:04 | 只看該作者
謝謝分享
回復

使用道具 舉報

12#
ID:303735 發表于 2019-5-9 16:42 | 只看該作者
好不錯,
回復

使用道具 舉報

13#
ID:531587 發表于 2019-5-18 11:35 | 只看該作者
高手啊,佩服佩服。
回復

使用道具 舉報

14#
ID:214068 發表于 2019-5-18 16:10 | 只看該作者
你才是大牛   從沒想過還可以這么玩···
回復

使用道具 舉報

15#
ID:635828 發表于 2019-11-26 12:59 | 只看該作者
能分享一下原理圖嗎?
回復

使用道具 舉報

16#
ID:73118 發表于 2019-12-20 10:09 | 只看該作者
大神只是分享了一份錯誤資料而已
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 4h影视 | 九九伦理片| 99资源站 | 成人免费一区二区三区牛牛 | 成人一区精品 | 久久艹av| 在线视频亚洲 | 69av网| 天天看天天摸天天操 | 日本a∨精品中文字幕在线 亚洲91视频 | 中文字幕av在线播放 | 日日干天天操 | 一级少妇女片 | 99久久精品一区二区成人 | a免费观看 | 国产成人99久久亚洲综合精品 | 精品久久久999 | 久久精品16 | 成年视频在线观看福利资源 | 蜜桃av一区二区三区 | 一区二区三区四区免费视频 | 午夜激情在线 | 午夜影院 | 一区中文字幕 | 精品免费 | 91性高湖久久久久久久久_久久99 | 极品销魂美女一区二区 | 亚洲精品一区二区三区四区高清 | 欧美 日韩 国产 一区 | 久久国产激情视频 | 日韩一区二区三区视频在线播放 | 在线国产99| 成人深夜福利在线观看 | 亚洲成人精品一区二区 | 九九精品在线 | 二区国产 | 91久久北条麻妃一区二区三区 | 久久久www成人免费无遮挡大片 | 亚洲欧美日韩精品久久亚洲区 | 少妇黄色 | 国产精品伦理一区二区三区 |