找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2227|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)16X32點(diǎn)陣左移顯示白居易的《長(zhǎng)恨歌》源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
       閑時(shí)就準(zhǔn)備一些外設(shè),編個(gè)程序練練C語言。春節(jié)是個(gè)大好時(shí)光
   買了16X32的點(diǎn)陣套件,動(dòng)手焊了一塊顯示屏,配合一個(gè)單片機(jī)開發(fā)板,搭了一個(gè)顯示系統(tǒng)。
   這個(gè)系統(tǒng)關(guān)鍵是程序。買套件時(shí)有附了一些示范程序。感覺太復(fù)雜,自己動(dòng)手編了一個(gè)。調(diào)試
  成功,拿出來大家分享一下。視頻



單片機(jī)源程序如下:
  1. /*        白居易  長(zhǎng)恨歌
  2. 標(biāo)準(zhǔn)08接口點(diǎn)陣屏管腳定義
  3. GND     A     ABCD是行掃描信號(hào)
  4. GND     B
  5. GND     C
  6. OE      D          OE是屏的使能端  低有效
  7. R1      G1          上半屏綠色
  8. R2      G2          下半屏綠色  本板由于沒有使用R2 G2,故把這兩腳改接為VCC,方便大家接線。
  9. GND            STR          鎖存信號(hào)
  10. GND     SCK         時(shí)鐘信號(hào)
  11. */
  12. /*接口說明*/
  13. //A B C D 是138行掃描信號(hào)
  14. // SCK   是595的移位信號(hào)
  15. // STR  是595的鎖存信號(hào)
  16. // OE    是屏的使能端 可以控制亮度
  17. // R     是紅色信號(hào)線
  18. // G     是綠色信號(hào)線
  19. // 本板由于沒有使用R2 G2,故把這兩腳改接為VCC,方便大家接線。   

  20. #include<reg52.h>
  21. #include<intrins.h>
  22. #include<stdio.h>
  23. #define u8 unsigned char
  24. #define u16 unsigned int
  25.                  
  26. /*****************************接口定義********************************/
  27. sbit sck=P0^1;//595的移位信號(hào)         
  28. sbit str=P0^2;//是595的鎖存信號(hào)            
  29. sbit sda_r=P2^7;//紅數(shù)據(jù)  
  30. sbit sda_g=P0^4;//綠數(shù)據(jù)   
  31. sbit OE=P0^5;//輸出使能
  32. sbit sign=P0^7;//檢測(cè)用LED
  33. sbit IA=P2^0;//行控制線A          
  34. sbit IB=P2^1;//行控制線B
  35. sbit IC=P2^2;//行控制線C
  36. sbit ID=P2^3;//行控制線D

  37. /********************************************************************/


  38. #define  scan0    {IA=0;IB=0;IC=0;ID=0;}
  39. #define  scan1    {IA=1;IB=0;IC=0;ID=0;}
  40. #define  scan2    {IA=0;IB=1;IC=0;ID=0;}
  41. #define  scan3    {IA=1;IB=1;IC=0;ID=0;}
  42. #define  scan4    {IA=0;IB=0;IC=1;ID=0;}
  43. #define  scan5    {IA=1;IB=0;IC=1;ID=0;}
  44. #define  scan6    {IA=0;IB=1;IC=1;ID=0;}
  45. #define  scan7    {IA=1;IB=1;IC=1;ID=0;}
  46. #define  scan8    {IA=0;IB=0;IC=0;ID=1;}
  47. #define  scan9    {IA=1;IB=0;IC=0;ID=1;}
  48. #define scan10    {IA=0;IB=1;IC=0;ID=1;}
  49. #define scan11    {IA=1;IB=1;IC=0;ID=1;}
  50. #define scan12    {IA=0;IB=0;IC=1;ID=1;}
  51. #define scan13    {IA=1;IB=0;IC=1;ID=1;}
  52. #define scan14    {IA=0;IB=1;IC=1;ID=1;}
  53. #define scan15    {IA=1;IB=1;IC=1;ID=1;}

  54. u16 adj,kk;
  55. u8 x,y;//
  56. u8 line,k; //line變量被多個(gè)函數(shù)調(diào)用
  57. u8 code ziku[];
  58. u8 buff_all[16][6];//對(duì)字庫(kù)里面的字重新排序緩存,           
  59. u8 buff[4];         //行緩存
  60. u8 buff_1[6];//數(shù)據(jù)移位緩存
  61. /******************************************************/

  62. u16 zishu=977;// 輸入目前字庫(kù)中字的個(gè)數(shù)!!!!!!!!!!!!!!!!!!!!!!!!!

  63. /********************************************************/
  64. void   rxd_data();                                   // 發(fā)送數(shù)據(jù)
  65. void   load_data();
  66. void scan(u8 Value)
  67. {switch(Value)
  68.         {case  0: scan0;break;
  69.                   case  1: scan1;break;
  70.                    case  2: scan2;break;
  71.                     case  3: scan3;break;
  72.              case  4: scan4;break;
  73.                       case  5: scan5;break;
  74.                        case  6: scan6;break;
  75.                         case  7: scan7;break;
  76.                  case  8: scan8;break;
  77.                        case  9: scan9;break;
  78.                       case 10:scan10;break;
  79.                      case 11:scan11;break;
  80.             case 12:scan12;break;
  81.                   case 13:scan13;break;
  82.                  case 14:scan14;break;
  83.             case 15:scan15;break;
  84.            default:break;
  85.         }
  86. }
  87. /*******************************************************************************
  88. * 函 數(shù) 名         : delay
  89. * 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
  90. *******************************************************************************/
  91. void delay(u16 i)
  92. {
  93.         while(i--);       
  94. }
  95. /****************字庫(kù)字按顯示順序調(diào)序放入2維數(shù)組緩存中,便于顯示時(shí)調(diào)取 */
  96. void adj_ziku()
  97.       {

  98.            u8 w,v;
  99.            v=zishu*2;

  100.            for(y=0;y<16;y++)
  101.                {

  102.                            for(x=0;x<6;x++) //zhuang 3 ge zi
  103.                           {         
  104.                             w=x/2;//除2取整
  105.                            buff_all[y][x]=ziku[adj*32+2*y+32*w+x%2];
  106.                           }
  107.                    }
  108.           
  109.           }                   //ok
  110.    

  111. /*主函數(shù)*/
  112. void main()
  113. {           
  114.      u8 del;
  115.          u16        count ;//字庫(kù)輸入后要更改,循環(huán)次數(shù)=(zishu/2-1 )*16         

  116.           
  117.                 while(1)
  118.         {   
  119.                   adj=0;//這個(gè)很重要,否則不會(huì)從0開始??原因不明       
  120.         count=zishu*16+1-32 ;
  121.                   delay(50000);
  122.                 delay(50000);
  123.   for(kk=0;kk<zishu-2;kk++)
  124.           {
  125.           for(k=0;k<16;k++) //走完一個(gè)字
  126.                 {

  127.                  for(del=0;del<1;del++)        //一幀停留時(shí)間控制
  128.                    {
  129.                          adj_ziku();
  130.                     for(line=0;line<16;line++)
  131.                          {

  132.                          load_data();

  133.                           rxd_data();
  134.                           scan(line);
  135.                           str=1; //595鎖存
  136.                           str=0;
  137.                            OE=0;        //各相應(yīng)位輸出
  138.                           delay(15); //數(shù)值大,亮度高,但會(huì)閃爍
  139.                            OE=1;//關(guān)閉595輸出(都為HIGH)

  140.                            }

  141.                   }
  142.                   //           delay(501);
  143.             }
  144.                                           adj++;

  145.           }
  146.         adj=0;
  147. }         
  148. }          
  149. /**********************************************************/
  150. void load_data(void)   //裝每行的4個(gè)字節(jié)到緩存buff中
  151.    {  u8 q1,q3,q4,n;
  152.    q3=k/8; q4=k%8;
  153.      for(q1=0;q1<6;q1++)        //預(yù)裝3個(gè)字
  154.               {                       
  155.                         buff_1[q1]=buff_all[line][q3+q1];          
  156.                   }
  157.     if(q4==0)
  158.          {
  159.                              for(n=0;n<4;n++)
  160.                             {buff[n]=buff_1[n];        }
  161.          }
  162.          else
  163.            {
  164.                           for(n=0;n<4;n++)
  165.                           {          
  166.                           buff[n]=(buff_1[n]<<q4)|(buff_1[n+1]>>(8-q4));
  167.                           }         
  168.           }           
  169.    }

  170. /***********************發(fā)送數(shù)據(jù)****************************/
  171. void rxd_data(void)                            //串行發(fā)送數(shù)據(jù)
  172. {
  173.   u8 s;
  174.   u8 temp,k;
  175.   
  176.   for(s=0;s<4;s++)                   //發(fā)送4字節(jié)數(shù)據(jù)
  177.         {
  178.          temp=buff[s];
  179.          temp=~temp;//取反才能字亮背景暗       

  180.              for(k=0;k<8;k++)//一個(gè)字節(jié)8位 發(fā)送給595
  181.                {
  182.                        sck=0; //上升沿移位595                          

  183.                sda_g=temp>>7;  //先送最高位,
  184.                            temp<<=1;                  
  185.                   sck=1;

  186.                }
  187.     }


  188.    }
  189. //字庫(kù)
  190. u8 code ziku[]={
  191. /*--  文字:  《  --*/
  192. /*--  新宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  193. 0x00,0x10,0x00,0x24,0x00,0x48,0x00,0x90,0x01,0x20,0x02,0x40,0x04,0x80,0x09,0x00,
  194. 0x04,0x80,0x02,0x40,0x01,0x20,0x00,0x90,0x00,0x48,0x00,0x24,0x00,0x10,0x00,0x00,

  195. /*--  文字:  長(zhǎng)  --*/
  196. ……………………

  197. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有程序51hei提供下載:
多字左移測(cè)試.rar (19.4 KB, 下載次數(shù): 20)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表