欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機16*16點陣顯示漢字程序流程圖Proteus仿真圖 [打印本頁]

作者: Youth8023    時間: 2022-8-2 16:50
標題: 51單片機16*16點陣顯示漢字程序流程圖Proteus仿真圖
包括原理圖 程序 仿真以及流程圖
可以通過按鍵控制點陣顯示內容的快慢和方向

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


主程序流程圖


按鍵流程圖


顯示流程圖


單片機源程序如下:

  1. //宏定義
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define zishu 5                        //字數

  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時是暫停

  14. //管腳定義

  15. //595
  16. sbit SI=P0^6;//數據腳
  17. sbit SCK=P0^5;//上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器數據不變
  18. sbit RCK=P0^4;//上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將
  19.                                   //RCK置為低電平,當移位結束后,在RCK端產生一個正脈沖(5V時,大于幾十納秒就行了。我
  20.                                   //通常都選微秒級),更新顯示數據。
  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. //函數聲明
  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. //漢字數組
  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. ^^^^^^^^^^^^省略見附件^^^^^^^
  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                 //定時器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時進入暫停狀態
  95.                 TR0=0;
  96.         }
  97. }

  98. void display()                                   //顯示函數
  99. {
  100.         if(flag==1)                                                   //左移函數
  101.         {
  102.                 for(k=0;k<speed;k++)                                  //更改speed能改變速度
  103.                 {
  104.                         for(i=1;i<17;i++)                                                                                 //一個for循環,分別選中16個列
  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]);                        //顯示內容
  122.                                         delay(7);
  123.                                 }
  124.                                 if(KEY_&&KEY_ADD&&KEY_DEC&&KEY_PAUSE==1) TR0=1;
  125.                         }
  126.                 }
  127.         }                                 
  128.         if(flag==2)                                                    //右移函數
  129.         {
  130.                 for(k=0;k<speed;k++)
  131.                 {  
  132.                         for(i=1;i<17;i++)                                                                                 //一個for循環,分別選中16個列
  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)                                                          // 上移函數
  158.         {
  159.                 for(k=0;k<speed;k++)
  160.                 {  
  161.                         for(i=1;i<17;i++)                                                                                 //一個for循環,分別選中16個列
  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)                                                         //下移函數
  186.         {
  187.                 for(k=0;k<speed;k++)
  188.                 {  
  189.                         for(i=1;i<17;i++)                                                                                 //一個for循環,分別選中16個列
  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)                                   //非暫停狀態時,正常控制X變量加,也就是正常移動顯示
  215.         {
  216.                 X++;                                                                                                                //顯示左移
  217.                 if(X==16+16*zishu)                                                                                                        //16加16乘以要顯示的漢字數
  218.                 X=0;                                                                                                        //從頭開始
  219.         }
  220. }

  221. void dis_zhuzi()                                                          //逐字顯示函數
  222. {
  223.         uchar zancun;                                                          //暫存變量
  224.         if(flag==5)                                  //逐字顯示
  225.         {
  226.                 for(j=1;j<(zishu+2);j++)                                   //字數+2(加1時是正好都顯示,為了顯示完顯示一個空格,所以此處加2)
  227.                 {
  228.                         if(pause!=0)                                                  //暫停狀態時
  229.                         {
  230.                                 j=zancun;                                                  //將暫存里的數值復制給j(j的值會在上面的for循環里循環變大,在暫停狀態時,不想讓顯示繼續,所以這里會將暫停前的j值復制回來)
  231.                         }
  232.                         zancun=j;                                                           //正常顯示時保存j值到暫存變量中,用于暫停后停止顯示
  233.                         for(k=0;k<(speed*4);k++)                           //調速
  234.                         {  
  235.                                 for(i=1;i<17;i++)                                                                                 //一個for循環,分別選中16個列
  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]);                        //顯示內容
  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. //主函數
  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.         //循環演示
  284.         while(1)          //循環
  285.         {  
  286.                 display();                 //調用顯示函數
  287.                 dis_zhuzi();         //調用逐字顯示函數
  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)                //寫數據到595
  317. {
  318.         uchar i,data_=temp;
  319.                                                 //關閉列選
  320.         for(i=0;i<8;i++)                                //傳值8位
  321.         {
  322.                 if(data_&0x01==0x01)                //判斷低位為1
  323.                 {
  324.                         SI=1;                                        //數據腳就寫入1
  325.                 }
  326.                 else                                                 //判斷低位為0
  327.                 {
  328.                         SI=0;                                        //數據腳寫入0
  329.                 }
  330.                 //產生一個上升沿
  331.                 SCK=0;
  332.                 SCK=1;
  333.                 SCK=0;
  334.                 data_>>=1;                                        //將要寫入的數據右移一位
  335.         }
  336.         RCK=0;//顯示數據
  337.         RCK=1;
  338.         RCK=0;
  339. }
  340. void Write_byte595_c1(uchar temp)                //寫數據到595
  341. {
  342.         uchar i,data_=temp;
  343.                                                 //關閉列選
  344.         for(i=0;i<8;i++)                                //傳值8位
  345.         {
  346.                 if(data_&0x01==0x01)                //判斷低位為1
  347.                 {
  348.                         SI1=1;                                        //數據腳就寫入1
  349.                 }
  350.                 else                                                 //判斷低位為0
  351.                 {
  352.                         SI1=0;                                        //數據腳寫入0
  353.                 }
  354.                 //產生一個上升沿
  355.                 SCK1=0;
  356.                 SCK1=1;
  357.                 SCK1=0;
  358.                 data_>>=1;                                        //將要寫入的數據右移一位
  359.         }
  360.         RCK1=0;//顯示數據
  361.         RCK1=1;
  362.         RCK1=0;
  363. }
  364. void Write_byte595_l2(uchar temp)                //寫數據到595
  365. {
  366.         uchar i,data_=temp;
  367.                                                 //關閉列選
  368.         for(i=0;i<8;i++)                                //傳值8位
  369.         {
  370.                 if(data_&0x01==0x01)                //判斷低位為1
  371.                 {
  372.                         SI0=1;                                        //數據腳就寫入1
  373.                 }
  374.                 else                                                 //判斷低位為0
  375.                 {
  376.                         SI0=0;                                        //數據腳寫入0
  377.                 }
  378.                 //產生一個上升沿
  379.                 SCK0=0;
  380.                 SCK0=1;
  381.                 SCK0=0;
  382.                 data_>>=1;                                        //將要寫入的數據右移一位
  383.         }
  384.         RCK0=0;//顯示數據
  385.         RCK0=1;
  386.         RCK0=0;
  387. }
  388. void Write_byte595_c2(uchar temp)                //寫數據到595
  389. {
  390.         uchar i,data_=temp;
  391.                                                 //關閉列選
  392.         for(i=0;i<8;i++)                                //傳值8位
  393.         {
  394.                 if(data_&0x01==0x01)                //判斷低位為1
  395.                 {
  396.                         SI2=1;                                        //數據腳就寫入1
  397.                 }
  398.                 else                                                 //判斷低位為0
  399.                 {
  400.                         SI2=0;                                        //數據腳寫入0
  401.                 }
  402.                 //產生一個上升沿
  403.                 SCK2=0;
  404.                 SCK2=1;
  405.                 SCK2=0;
  406.                 data_>>=1;                                        //將要寫入的數據右移一位
  407.         }
  408.         RCK2=0;//顯示數據
  409.         RCK2=1;
  410.         RCK2=0;
  411. }

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

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



作者: heicad    時間: 2022-8-4 02:24
好資料,51黑有你更精彩!!!
作者: chlcsf    時間: 2022-11-27 09:51
51有你更精彩
作者: zsyzdx    時間: 2022-12-26 16:50
親測能用  感謝樓主
作者: hrbswf    時間: 2023-1-28 18:07

51有你更精彩
作者: hjh800512    時間: 2023-2-3 21:56
太好了,我一直只懂一些段碼的基礎東西,先收藏了,有時間慢慢學習。
作者: 哇哇哇哇阿松大    時間: 2023-4-3 14:43

太好了,我一直只懂一些段碼的基礎東西,先收藏了,有時間慢慢學習。

作者: 隱于林    時間: 2024-12-19 17:16
感謝樓主,只恨我沒早點遇見你
作者: 1732940377    時間: 2024-12-19 19:31
51有你更精彩
作者: declansang    時間: 2024-12-23 21:31
能用  感謝樓主
作者: 2650151197    時間: 2025-3-18 09:47
這個點陣在實物里面是4個8*8的吧  是共陰還是共陽啊

作者: 2650151197    時間: 2025-3-18 09:47
declansang 發表于 2024-12-23 21:31
能用  感謝樓主

這個點陣在實物里面是4個8*8的吧 是共陰還是共陽啊




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1