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

QQ登錄

只需一步,快速開始

搜索
查看: 2610|回復(fù): 0
收起左側(cè)

德飛萊ly-51s單片機(jī)程序求解讀

[復(fù)制鏈接]
ID:562262 發(fā)表于 2021-3-19 22:20 | 顯示全部樓層 |閱讀模式
如圖所示的一個(gè)16*16點(diǎn)陣顯示左移的示例程序,這里是主函數(shù)部分,我知道怎么靜態(tài)顯示一個(gè)漢字,但是搞不懂他這個(gè)是怎么在左移。求告知!!v4.0資料鏈接如附件
  1. /*-----------------------------------------------
  2.   名稱:16x16漢字屏流動(dòng)顯示
  3.   編寫:shifang
  4.   日期:2009.5
  5.   修改:bob_write 2021.3
  6.   硬件:LY-51S V4.0 單片機(jī)開發(fā)板
  7.   內(nèi)容:
  8.         P1.0-P1.3分別連接A、B、C、D,用于控制16行,通過2路HC138控制
  9.                                 SER接P1.4 通過2片HC595控制
  10.                                 CLK時(shí)鐘連接P1.5
  11.                                 LAT鎖存連接P1.6
  12.                                 OE接P1.7

  13.   現(xiàn)象:使用普通速度51系列單片機(jī)。1個(gè)漢字顯示屏,向左流動(dòng)顯示多個(gè)漢字,重復(fù)循環(huán)顯示。
  14. ------------------------------------------------*/
  15. #include<reg52.h>
  16. #include <intrins.h>

  17. sbit J32_LAT = P1^6;                //鎖存引腳
  18. sbit J32_SER = P1^4;                //數(shù)據(jù)引腳
  19. sbit J32_CLK = P1^5;          //時(shí)鐘引腳
  20. sbit J32_OE  = P1^7;          //使能引腳
  21. sbit KEY = P0^5;                                                  //獨(dú)立按鍵

  22. unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移動(dòng)位數(shù),臨時(shí)移動(dòng)位數(shù),大于一個(gè)字節(jié)增加字節(jié)數(shù)
  23. unsigned int HzNum;//漢字個(gè)數(shù)
  24. unsigned char buff[10];

  25. /*-----------------------------------------------
  26.              16x16漢字取模數(shù)據(jù)
  27. ------------------------------------------------*/
  28. unsigned char code hztest[][32]=    //取模選擇字節(jié)正序n行32列的數(shù)組,長度是固定的
  29. {
  30.         
  31.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  32.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不顯示,這里根據(jù)屏的大小修改,這個(gè)是1個(gè)漢字屏
  33.         //所以寫入1個(gè)漢字

  34. /*--  文字:  電  --*/
  35. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  36. 0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
  37. 0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE,

  38. /*--  文字:  子  --*/
  39. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  40. 0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x01,0x80,0x01,0x00,0xFF,0xFE,
  41. 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,

  42. /*--  文字:  信  --*/
  43. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  44. 0x08,0x40,0x08,0x20,0x0B,0xFE,0x10,0x00,0x10,0x00,0x31,0xFC,0x30,0x00,0x50,0x00,
  45. 0x91,0xFC,0x10,0x00,0x10,0x00,0x11,0xFC,0x11,0x04,0x11,0x04,0x11,0xFC,0x11,0x04,

  46. /*--  文字:  息  --*/
  47. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  48. 0x01,0x00,0x02,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,
  49. 0x1F,0xF0,0x10,0x10,0x01,0x00,0x08,0x84,0x48,0x92,0x48,0x12,0x87,0xF0,0x00,0x00,

  50. /*--  文字:  工  --*/
  51. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  52. 0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
  53. 0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,

  54. /*--  文字:  程  --*/
  55. /*--  宋體12;  此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16   --*/
  56. 0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,
  57. 0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00,

  58. };



  59. /*-----------------------------------------------
  60.              向595寫入一個(gè)字節(jié) 單紅色
  61. ------------------------------------------------*/
  62. void InputByte( unsigned  char DataR1) //寫一個(gè)字節(jié)用串行八位所以8次循環(huán)
  63. {
  64.         unsigned  char i;
  65.         for(i=8; i>0; i--)
  66.         {
  67.                 J32_SER = (DataR1&0x01);//分離最低位,即0000 0001和data相與取最低位
  68.                 J32_CLK = 0;
  69.                 J32_CLK = 1;
  70.                 DataR1 = DataR1 >> 1;//
  71.         }
  72. }


  73. /*-----------------------------------------------
  74.                     延時(shí)程序
  75. ------------------------------------------------*/
  76. void Delay(unsigned int t)
  77. {
  78.         while(--t);
  79. }

  80. void Delay10ms()                //@12.000MHz
  81. {
  82.         unsigned char i, j;

  83.         i = 117;
  84.         j = 184;
  85.         do
  86.         {
  87.                 while (--j);
  88.         } while (--i);
  89. }

  90. void Delay15ms()                //@12.000MHz
  91. {
  92.         unsigned char i, j, k;

  93.         _nop_();
  94.         _nop_();
  95.         i = 1;
  96.         j = 176;
  97.         k = 19;
  98.         do
  99.         {
  100.                 do
  101.                 {
  102.                         while (--k);
  103.                 } while (--j);
  104.         } while (--i);
  105. }





  106. /*-----------------------------------------------
  107.                       主程序
  108. ------------------------------------------------*/
  109. main()
  110. {
  111.         unsigned char count;//16行掃描數(shù)據(jù),范圍0-15
  112.         unsigned int i, j;
  113.         unsigned char temp;
  114.         //計(jì)算數(shù)組的元素個(gè)數(shù),最終需要的是漢字的個(gè)數(shù)
  115.         int lenTotal = sizeof(hztest) / sizeof(int);  //所有,整個(gè)數(shù)組的大小
  116.         int lenLow = sizeof(hztest[0]) / sizeof(int);  //低位,單個(gè)數(shù)組的大小
  117.         int lenHigh = lenTotal / lenLow;  //高位,相除相當(dāng)于字的個(gè)數(shù)


  118. while(1)
  119.         {
  120.                 /*MoveBitNum,移動(dòng)位數(shù),
  121.                 MoveBitNumtemp,臨時(shí)移動(dòng)位數(shù),
  122.                 IncNum,大于一個(gè)字節(jié)增加字節(jié)數(shù)*/
  123.                
  124.                 i++;
  125.                 if(i==60)//更改流動(dòng)速度,1T單片機(jī)和12T單片機(jī)速度大約5-8倍,注意更改參數(shù)
  126.                 {
  127.                         i=0;
  128.                         MoveBitNum++;
  129.                         if(MoveBitNum==16)//每次移動(dòng)完一個(gè)漢字大小后循環(huán)
  130.                         {
  131.                                 MoveBitNum=0;
  132.                                 HzNum+=1;    //調(diào)用下一個(gè)漢字
  133.                                 if(HzNum>=lenHigh-1)//需要顯示的漢字個(gè)數(shù),包括前面的一屏空字符的個(gè)數(shù),后面清屏的空字符不包含在內(nèi),這里是(漢字個(gè)數(shù)+1)
  134.                                                                                                                 //如果已經(jīng)是最后一個(gè)了,則令漢字個(gè)數(shù)為0,即hznum指針歸零
  135.                                         HzNum=0;   //完全顯示完后循環(huán)調(diào)用
  136.                         }
  137.                 }

  138.                 Delay(1);//控制掃描頻率
  139.                 //讀取漢字對(duì)應(yīng)屏幕緩沖區(qū)的數(shù)據(jù),不同大小的屏幕不一樣
  140.                 for(j=0; j<2; j++) //取每個(gè)漢字的前2個(gè)字節(jié),即32位,2/32
  141.                 {
  142.                         //漢字個(gè)數(shù)+1
  143.                         buff[j+j+1]=hztest[HzNum+j][count+count+1];  //每次移動(dòng)完一個(gè)漢字后,選擇下一個(gè)漢字
  144.                         buff[j+j]=hztest[HzNum+j][count+count];

  145.                 }
  146.                 //判斷移動(dòng)的位數(shù)
  147.                 if(MoveBitNum<8)                   //  判讀移動(dòng)距離是大于一個(gè)字節(jié)還是小于一個(gè)字節(jié),因?yàn)橐粋(gè)字節(jié)左移右移最大只能8位
  148.                 {
  149.                         IncNum=0;
  150.                         MoveBitNumtemp=MoveBitNum;
  151.                 }
  152.                 else
  153.                 {
  154.                         IncNum=1;    //大于8就減去8得到的數(shù)值還是小于8
  155.                         MoveBitNumtemp=MoveBitNum-8;
  156.                 }

  157.                 J32_LAT=0;       //鎖存無效

  158.                 for(j=2; j>0; j--)        //按bit的方式移動(dòng)緩沖區(qū)的內(nèi)容,然后輸出到595,即取出的數(shù)值每個(gè)字節(jié)左移一定的位數(shù),
  159.                 {
  160.                         //后面左移出的數(shù)據(jù)整合到前面的字節(jié)中,保持?jǐn)?shù)據(jù)的連續(xù)性
  161.                         temp=(buff[j-1+IncNum]<<MoveBitNumtemp)|(buff[j+IncNum]>>(8-MoveBitNumtemp));//這句比較重要,需要自行拿出2個(gè)字節(jié)的數(shù)據(jù)模擬分析
  162.                         InputByte(temp);//輸出到595
  163.                 }//8個(gè)字節(jié)傳輸完鎖存輸出
  164.                 //控制使能端
  165.                 J32_OE  = 1;
  166.                 P1=count;//用P0口的前4位控制16行,屏內(nèi)部通過4-16譯碼器工作,循環(huán)掃描16行
  167.                 J32_LAT=1;      //鎖存有效,此時(shí)一行的數(shù)據(jù)顯示到屏上
  168.                 J32_OE = 0;


  169.                 count++;
  170.                 if(count==16)
  171.                         count=0;


  172.         }
  173. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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