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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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)


評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

51有你更精彩
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

8#
ID:1139803 發表于 2024-12-19 17:16 | 只看該作者
感謝樓主,只恨我沒早點遇見你
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

11#
ID:983932 發表于 2025-3-18 09:47 | 只看該作者
這個點陣在實物里面是4個8*8的吧  是共陰還是共陽啊
回復

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃毛片| 毛片久久久 | 国产视频一视频二 | 免费在线精品视频 | 精品一区二区三区入口 | 美女午夜影院 | 中文字幕一区在线观看视频 | 91麻豆久久久 | 久久av资源网 | 欧美成ee人免费视频 | 精品成人av | 永久精品 | 韩日三级| 欧美一级黑人aaaaaaa做受 | 综合精品久久久 | 青青草视频网站 | 国产精品久久久久久一区二区三区 | 成人在线免费视频 | 久久精品在线免费视频 | 亚洲精品一区二区网址 | 99久久精品免费看国产小宝寻花 | 亚洲一区二区精品 | 自拍视频一区二区三区 | 一二三四在线视频观看社区 | 欧美群妇大交群中文字幕 | 国产精品一区二区av | 国产午夜精品一区二区三区 | 亚洲情综合五月天 | 国产精品免费av | 国产亚洲精品久久久久久牛牛 | 国产日韩一区二区三免费高清 | 亚洲欧美一区二区三区国产精品 | 在线观看深夜视频 | 国产美女一区二区 | 久久国产电影 | 欧美日韩综合一区 | 日本天天操 | 日本一区二区视频 | 国产精品久久久久aaaa | 男女视频在线免费观看 | 婷婷桃色网 |