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

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)16*16點(diǎn)陣顯示漢字程序流程圖Proteus仿真圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
包括原理圖 程序 仿真以及流程圖
可以通過(guò)按鍵控制點(diǎn)陣顯示內(nèi)容的快慢和方向

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


主程序流程圖


按鍵流程圖


顯示流程圖


單片機(jī)源程序如下:

  1. //宏定義
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define zishu 5                        //字?jǐn)?shù)

  5. //包含頭文件
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. #include <math.h>

  9. uchar i,flag,j,k;
  10. uint X=0;
  11. uchar KEY_NUM=0;
  12. uchar speed=10;                 //初始速度
  13. bit pause=0;                 //暫停變量,為1時(shí)是暫停

  14. //管腳定義

  15. //595
  16. sbit SI=P0^6;//數(shù)據(jù)腳
  17. sbit SCK=P0^5;//上升沿時(shí)數(shù)據(jù)寄存器的數(shù)據(jù)移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數(shù)據(jù)不變
  18. sbit RCK=P0^4;//上升沿時(shí)移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲(chǔ)寄存器,下降沿時(shí)存儲(chǔ)寄存器數(shù)據(jù)不變。通常我將
  19.                                   //RCK置為低電平,當(dāng)移位結(jié)束后,在RCK端產(chǎn)生一個(gè)正脈沖(5V時(shí),大于幾十納秒就行了。我
  20.                                   //通常都選微秒級(jí)),更新顯示數(shù)據(jù)。
  21. sbit SI0=P0^3;//
  22. sbit SCK0=P0^2;//
  23. sbit RCK0=P0^1;
  24. sbit SI1=P2^1;
  25. sbit RCK1=P2^2;
  26. sbit SCK1=P2^0;
  27. sbit SI2=P2^4;
  28. sbit RCK2=P2^5;
  29. sbit SCK2=P2^3;
  30. sbit KEY_=P3^2;                  //切換方向
  31. sbit KEY_ADD=P1^0;          //加速
  32. sbit KEY_DEC=P1^1;          //減速
  33. sbit KEY_PAUSE=P1^2;  //暫停
  34. //函數(shù)聲明
  35. void Init595_l1();
  36. void Init595_l2();
  37. void Init595_c1();
  38. void Init595_c2();
  39. void Write_byte595_l1(uchar temp);
  40. void Write_byte595_l2(uchar temp);
  41. void Write_byte595_c1(uchar temp);
  42. void Write_byte595_c2(uchar temp);
  43. void delay(uint z);

  44. //漢字?jǐn)?shù)組
  45. uchar code H1[]=                                                                                                //左移 逐字
  46. {
  47. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",0*/
  48. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",1*/

  49. ^^^^^^^^^^^^省略見(jiàn)附件^^^^^^^
  50. };
  51. uchar code a[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  52. uchar code b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  53. uchar code c[]={0x20,0x40,0x60,0x80};

  54. void T0_time() interrupt 1                 //定時(shí)器0
  55. {
  56.         TH0=0x3c;
  57.         TL0=0xb0;
  58.         if(KEY_==0)
  59.         {
  60.                 KEY_NUM++;
  61.                 if(KEY_NUM>=2)
  62.                 {
  63.                         KEY_NUM=0;
  64.                         TR0=0;
  65.                         pause=0;
  66.                         flag++;
  67.                         if(flag>=6)                  //切換模式
  68.                         {
  69.                                 flag=1;
  70.                         }
  71.                         Write_byte595_l1(0xff);
  72.                         Write_byte595_l2(0xff);
  73.                         Write_byte595_c1(0x00);
  74.                         Write_byte595_c2(0x00);
  75.                         i=1;X=0;j=0;k=0;
  76.                 }
  77.         }
  78.         if(KEY_ADD==0)                                   //加速按鍵
  79.         {
  80.                 speed-=2;                                   //速度變量減2(速度變量越小速度越快)
  81.                 if(speed<2)                                   //最小減到2
  82.                 speed=2;
  83.                 TR0=0;
  84.         }
  85.         if(KEY_DEC==0)                                          //減速按鍵
  86.         {
  87.                 speed+=2;
  88.                 if(speed>20)
  89.                 speed=20;
  90.                 TR0=0;
  91.         }
  92.         if(KEY_PAUSE==0)                                        //暫停按鍵
  93.         {
  94.                 pause=!pause;                                        //變量為1時(shí)進(jìn)入暫停狀態(tài)
  95.                 TR0=0;
  96.         }
  97. }

  98. void display()                                   //顯示函數(shù)
  99. {
  100.         if(flag==1)                                                   //左移函數(shù)
  101.         {
  102.                 for(k=0;k<speed;k++)                                  //更改speed能改變速度
  103.                 {
  104.                         for(i=1;i<17;i++)                                                                                 //一個(gè)for循環(huán),分別選中16個(gè)列
  105.                         {  
  106.                                 if(flag==1)
  107.                                 {
  108.                                         Write_byte595_l1(0xff);
  109.                                         Write_byte595_l2(0xff);
  110.                                         if(i<9)
  111.                                         {
  112.                                                 Write_byte595_c1(a[i-1]);
  113.                                                 Write_byte595_c2(0x00);
  114.                                         }
  115.                                         else
  116.                                         {
  117.                                                 Write_byte595_c2(a[i-9]);
  118.                                                 Write_byte595_c1(0x00);
  119.                                         }
  120.                                         Write_byte595_l1(H1[i*2-2+2*X]);
  121.                                         Write_byte595_l2(H1[i*2-1+2*X]);                        //顯示內(nèi)容
  122.                                         delay(7);
  123.                                 }
  124.                                 if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  125.                         }
  126.                 }
  127.         }                                 
  128.         if(flag==2)                                                    //右移函數(shù)
  129.         {
  130.                 for(k=0;k<speed;k++)
  131.                 {  
  132.                         for(i=1;i<17;i++)                                                                                 //一個(gè)for循環(huán),分別選中16個(gè)列
  133.                         {  
  134.                                 if(flag==2)
  135.                                 {
  136.                                         Write_byte595_l1(0xff);
  137.                                         Write_byte595_l2(0xff);
  138.                                         if(i<9)
  139.                                         {
  140.                                                 Write_byte595_c1(a[i-1]);
  141.                                                 Write_byte595_c2(0x00);
  142.                                         }
  143.                                         else
  144.                                         {
  145.                                                 Write_byte595_c2(a[i-9]);
  146.                                                 Write_byte595_c1(0x00);
  147.                                         }
  148.                                         Write_byte595_l2(H2[i*2-1-2*X+32*(zishu+1)]);                   //32乘以要顯示的漢字加1
  149.                                         Write_byte595_l1(H2[i*2-2-2*X+32*(zishu+1)]);                   //32乘以要顯示的漢字加1
  150.                                         delay(7);
  151.                                 }
  152.                                 if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  153.                         }
  154.                 }
  155.         }                                 
  156.        
  157.         if(flag==3)                                                          // 上移函數(shù)
  158.         {
  159.                 for(k=0;k<speed;k++)
  160.                 {  
  161.                         for(i=1;i<17;i++)                                                                                 //一個(gè)for循環(huán),分別選中16個(gè)列
  162.                         {        
  163.                                 if(flag==3)
  164.                                 {
  165.                                         Write_byte595_c1(0x00);
  166.                                         Write_byte595_c2(0x00);
  167.                                         if(i<9)
  168.                                         {
  169.                                                 Write_byte595_l1(b[i-1]);
  170.                                                 Write_byte595_l2(0xff);
  171.                                         }
  172.                                         else
  173.                                         {
  174.                                                 Write_byte595_l2(b[i-9]);
  175.                                                 Write_byte595_l1(0xff);
  176.                                         }
  177.                                         Write_byte595_c1(H3[i*2-2+2*X]);
  178.                                         Write_byte595_c2(H3[i*2-1+2*X]);
  179.                                         delay(7);
  180.                                 }
  181.                                 if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  182.                         }
  183.                 }
  184.         }                                                       
  185.         if(flag==4)                                                         //下移函數(shù)
  186.         {
  187.                 for(k=0;k<speed;k++)
  188.                 {  
  189.                         for(i=1;i<17;i++)                                                                                 //一個(gè)for循環(huán),分別選中16個(gè)列
  190.                         {        
  191.                                 if(flag==4)
  192.                                 {
  193.                                         Write_byte595_c1(0x00);
  194.                                         Write_byte595_c2(0x00);
  195.                                         if(i<9)
  196.                                         {
  197.                                                 Write_byte595_l1(b[i-1]);
  198.                                                 Write_byte595_l2(0xff);
  199.                                         }
  200.                                         else
  201.                                         {
  202.                                                 Write_byte595_l2(b[i-9]);
  203.                                                 Write_byte595_l1(0xff);
  204.                                         }
  205.                                         Write_byte595_c1(H4[i*2-2-2*X+32*(zishu+1)]);                          //32乘以要顯示的漢字加1
  206.                                         Write_byte595_c2(H4[i*2-1-2*X+32*(zishu+1)]);                          //32乘以要顯示的漢字加1
  207.                                         delay(7);
  208.                                 }
  209.                                 if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  210.                         }
  211.                 }
  212.         }                                    
  213.        
  214.         if(pause==0)                                   //非暫停狀態(tài)時(shí),正常控制X變量加,也就是正常移動(dòng)顯示
  215.         {
  216.                 X++;                                                                                                                //顯示左移
  217.                 if(X==16+16*zishu)                                                                                                        //16加16乘以要顯示的漢字?jǐn)?shù)
  218.                 X=0;                                                                                                        //從頭開(kāi)始
  219.         }
  220. }

  221. void dis_zhuzi()                                                          //逐字顯示函數(shù)
  222. {
  223.         uchar zancun;                                                          //暫存變量
  224.         if(flag==5)                                  //逐字顯示
  225.         {
  226.                 for(j=1;j<(zishu+2);j++)                                   //字?jǐn)?shù)+2(加1時(shí)是正好都顯示,為了顯示完顯示一個(gè)空格,所以此處加2)
  227.                 {
  228.                         if(pause!=0)                                                  //暫停狀態(tài)時(shí)
  229.                         {
  230.                                 j=zancun;                                                  //將暫存里的數(shù)值復(fù)制給j(j的值會(huì)在上面的for循環(huán)里循環(huán)變大,在暫停狀態(tài)時(shí),不想讓顯示繼續(xù),所以這里會(huì)將暫停前的j值復(fù)制回來(lái))
  231.                         }
  232.                         zancun=j;                                                           //正常顯示時(shí)保存j值到暫存變量中,用于暫停后停止顯示
  233.                         for(k=0;k<(speed*4);k++)                           //調(diào)速
  234.                         {  
  235.                                 for(i=1;i<17;i++)                                                                                 //一個(gè)for循環(huán),分別選中16個(gè)列
  236.                                 {  
  237.                                         if(flag==5)
  238.                                         {
  239.                                                 Write_byte595_l1(0xff);
  240.                                                 Write_byte595_l2(0xff);
  241.                                                
  242.                                                 if(i<9)
  243.                                                 {
  244.                                                         Write_byte595_c1(a[i-1]);
  245.                                                         Write_byte595_c2(0x00);
  246.                                                 }
  247.                                                 else
  248.                                                 {
  249.                                                         Write_byte595_c2(a[i-9]);
  250.                                                         Write_byte595_c1(0x00);
  251.                                                 }
  252.                                                 Write_byte595_l1(H1[i*2-2+0x20*j]);
  253.                                                 Write_byte595_l2(H1[i*2-1+0x20*j]);                        //顯示內(nèi)容
  254.                                                 delay(7);
  255.                                         }
  256.                                         if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  257.                                 }
  258.                         }                                       
  259.                
  260.                         Write_byte595_c1(0x00);
  261.                         Write_byte595_c2(0x00);
  262.                         Write_byte595_l1(0xff);
  263.                         Write_byte595_l2(0xff);
  264.                         delay(10);
  265.                 }
  266.        
  267.         }
  268. }

  269. //主函數(shù)
  270. void main()
  271. {
  272.         EA=1;
  273.         TMOD=0x01;
  274.         TH0=0x3c;
  275.         TL0=0xb0;
  276.         ET0=1;
  277.         TR0=1;
  278.         //595c初始化
  279.         Init595_l1();
  280.         Init595_l2();
  281.         Init595_c1();
  282.         Init595_c2();
  283.         //循環(huán)演示
  284.         while(1)          //循環(huán)
  285.         {  
  286.                 display();                 //調(diào)用顯示函數(shù)
  287.                 dis_zhuzi();         //調(diào)用逐字顯示函數(shù)
  288.         }
  289. }

  290. //初始化595
  291. void Init595_l1()
  292. {
  293.         flag=1;
  294.         SI=1;
  295.         SCK=0;
  296.         RCK=0;
  297. }
  298. void Init595_l2()
  299. {
  300.         SI0=1;
  301.         SCK0=0;
  302.         RCK0=0;
  303. }
  304. void Init595_c1()
  305. {
  306.         SI1=1;
  307.         SCK1=0;
  308.         RCK1=0;
  309. }
  310. void Init595_c2()
  311. {
  312.         SI2=1;
  313.         SCK2=0;
  314.         RCK2=0;
  315. }

  316. void Write_byte595_l1(uchar temp)                //寫(xiě)數(shù)據(jù)到595
  317. {
  318.         uchar i,data_=temp;
  319.                                                 //關(guān)閉列選
  320.         for(i=0;i<8;i++)                                //傳值8位
  321.         {
  322.                 if(data_&0x01==0x01)                //判斷低位為1
  323.                 {
  324.                         SI=1;                                        //數(shù)據(jù)腳就寫(xiě)入1
  325.                 }
  326.                 else                                                 //判斷低位為0
  327.                 {
  328.                         SI=0;                                        //數(shù)據(jù)腳寫(xiě)入0
  329.                 }
  330.                 //產(chǎn)生一個(gè)上升沿
  331.                 SCK=0;
  332.                 SCK=1;
  333.                 SCK=0;
  334.                 data_>>=1;                                        //將要寫(xiě)入的數(shù)據(jù)右移一位
  335.         }
  336.         RCK=0;//顯示數(shù)據(jù)
  337.         RCK=1;
  338.         RCK=0;
  339. }
  340. void Write_byte595_c1(uchar temp)                //寫(xiě)數(shù)據(jù)到595
  341. {
  342.         uchar i,data_=temp;
  343.                                                 //關(guān)閉列選
  344.         for(i=0;i<8;i++)                                //傳值8位
  345.         {
  346.                 if(data_&0x01==0x01)                //判斷低位為1
  347.                 {
  348.                         SI1=1;                                        //數(shù)據(jù)腳就寫(xiě)入1
  349.                 }
  350.                 else                                                 //判斷低位為0
  351.                 {
  352.                         SI1=0;                                        //數(shù)據(jù)腳寫(xiě)入0
  353.                 }
  354.                 //產(chǎn)生一個(gè)上升沿
  355.                 SCK1=0;
  356.                 SCK1=1;
  357.                 SCK1=0;
  358.                 data_>>=1;                                        //將要寫(xiě)入的數(shù)據(jù)右移一位
  359.         }
  360.         RCK1=0;//顯示數(shù)據(jù)
  361.         RCK1=1;
  362.         RCK1=0;
  363. }
  364. void Write_byte595_l2(uchar temp)                //寫(xiě)數(shù)據(jù)到595
  365. {
  366.         uchar i,data_=temp;
  367.                                                 //關(guān)閉列選
  368.         for(i=0;i<8;i++)                                //傳值8位
  369.         {
  370.                 if(data_&0x01==0x01)                //判斷低位為1
  371.                 {
  372.                         SI0=1;                                        //數(shù)據(jù)腳就寫(xiě)入1
  373.                 }
  374.                 else                                                 //判斷低位為0
  375.                 {
  376.                         SI0=0;                                        //數(shù)據(jù)腳寫(xiě)入0
  377.                 }
  378.                 //產(chǎn)生一個(gè)上升沿
  379.                 SCK0=0;
  380.                 SCK0=1;
  381.                 SCK0=0;
  382.                 data_>>=1;                                        //將要寫(xiě)入的數(shù)據(jù)右移一位
  383.         }
  384.         RCK0=0;//顯示數(shù)據(jù)
  385.         RCK0=1;
  386.         RCK0=0;
  387. }
  388. void Write_byte595_c2(uchar temp)                //寫(xiě)數(shù)據(jù)到595
  389. {
  390.         uchar i,data_=temp;
  391.                                                 //關(guān)閉列選
  392.         for(i=0;i<8;i++)                                //傳值8位
  393.         {
  394.                 if(data_&0x01==0x01)                //判斷低位為1
  395.                 {
  396.                         SI2=1;                                        //數(shù)據(jù)腳就寫(xiě)入1
  397.                 }
  398.                 else                                                 //判斷低位為0
  399.                 {
  400.                         SI2=0;                                        //數(shù)據(jù)腳寫(xiě)入0
  401.                 }
  402.                 //產(chǎn)生一個(gè)上升沿
  403.                 SCK2=0;
  404.                 SCK2=1;
  405.                 SCK2=0;
  406.                 data_>>=1;                                        //將要寫(xiě)入的數(shù)據(jù)右移一位
  407.         }
  408.         RCK2=0;//顯示數(shù)據(jù)
  409.         RCK2=1;
  410.         RCK2=0;
  411. }

  412. void delay(uint z)           //延時(shí)函數(shù)
  413. {
  414.         uint x,y;
  415.         for(x=z;x>0;x--)
  416.                 for(y=7;y>0;y--);
  417. }
復(fù)制代碼

Keil代碼與Proteus8.8 7.5仿真下載:
16點(diǎn)陣.zip (888.79 KB, 下載次數(shù): 147)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:262 發(fā)表于 2022-8-4 02:24 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:992298 發(fā)表于 2022-11-27 09:51 | 只看該作者
51有你更精彩
回復(fù)

使用道具 舉報(bào)

地板
ID:320306 發(fā)表于 2022-12-26 16:50 | 只看該作者
親測(cè)能用  感謝樓主
回復(fù)

使用道具 舉報(bào)

5#
ID:1061679 發(fā)表于 2023-1-28 18:07 | 只看該作者

51有你更精彩
回復(fù)

使用道具 舉報(bào)

6#
ID:889178 發(fā)表于 2023-2-3 21:56 | 只看該作者
太好了,我一直只懂一些段碼的基礎(chǔ)東西,先收藏了,有時(shí)間慢慢學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

7#
ID:894420 發(fā)表于 2023-4-3 14:43 | 只看該作者

太好了,我一直只懂一些段碼的基礎(chǔ)東西,先收藏了,有時(shí)間慢慢學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

8#
ID:1139803 發(fā)表于 2024-12-19 17:16 | 只看該作者
感謝樓主,只恨我沒(méi)早點(diǎn)遇見(jiàn)你
回復(fù)

使用道具 舉報(bào)

9#
ID:498156 發(fā)表于 2024-12-19 19:31 | 只看該作者
51有你更精彩
回復(fù)

使用道具 舉報(bào)

10#
ID:344646 發(fā)表于 2024-12-23 21:31 | 只看該作者
能用  感謝樓主
回復(fù)

使用道具 舉報(bào)

11#
ID:983932 發(fā)表于 2025-3-18 09:47 | 只看該作者
這個(gè)點(diǎn)陣在實(shí)物里面是4個(gè)8*8的吧  是共陰還是共陽(yáng)啊
回復(fù)

使用道具 舉報(bào)

12#
ID:983932 發(fā)表于 2025-3-18 09:47 | 只看該作者

這個(gè)點(diǎn)陣在實(shí)物里面是4個(gè)8*8的吧 是共陰還是共陽(yáng)啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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