找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1266|回复: 1
收起左侧

C51单片机16x16点阵程序仿真(显示图形,可移动,矩阵键盘)

[复制链接]
ID:986591 发表于 2024-11-6 21:42 | 显示全部楼层 |阅读模式
内含仿真程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei图片_20241106214102.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define data1 P0//上8行数据口
  6. #define data2 P2//下8行数据口
  7. sbit x1=P1^7;                                //矩阵第1行所接端口
  8. sbit x2=P1^6;                                //矩阵第2行所接端口
  9. sbit x3=P1^5;                                //矩阵第3行所接端口
  10. sbit x4=P1^4;                                //矩阵第4行所接端口

  11. sbit y1=P1^3;                                //矩阵第1列所接端口
  12. sbit y2=P1^2;                                //矩阵第2列所接端口
  13. sbit y3=P1^1;                                //矩阵第3列所接端口
  14. sbit y4=P1^0;                                //矩阵第4列所接端口

  15. bit fangxiang;//方向标志位
  16. uchar dand1,dand2,dand3;//单独显示标志位
  17. uchar bilibili;//图1放大减小标志位
  18. uchar xiaolian;//图2放大减小标志位
  19. uchar tu3;//图3放大减小标志位
  20. uchar quanliang,quanmie,bianyan;//全亮检测,全灭检测,边沿检测标志位

  21. uchar  aa;//用于数据输出数据数组时的读取
  22. uchar sudu=5;//移动速度
  23. uint alt=0,net=0,        zishu=3;  //要写几个汉字就写几,数字和字母是1个字符,占用0.5个汉字位置,例如要显示“你好1”   那么zishu变量要复制2.5
  24. //alt  计时变量,用于控制速度的计时变量
  25. //net  显示哪个字的变量
  26. bit mode;
  27. uchar code tab[]={ //右移数组
  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  29. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/                //这两行不用动,改字时保留

  30. 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x28,0x08,0x28,0x48,0x1B,0xA8,0x08,0x28,
  31. 0x08,0x28,0x18,0x28,0x2B,0xA8,0x28,0x48,0x08,0x08,0x0F,0xF8,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\bilibili.bmp",0*/
  32.         
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x14,0x30,0x14,0x18,0x00,0x08,0x00,0x08,
  34. 0x00,0x08,0x00,0x08,0x14,0x18,0x14,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\笑脸.bmp",0*/
  35.         
  36. 0x00,0x00,0x03,0xE0,0x0C,0x38,0x10,0x0C,0x23,0xE6,0x44,0x32,0x48,0x12,0x48,0x12,
  37. 0x48,0x22,0x48,0x62,0x4F,0xF2,0x48,0x16,0x60,0x34,0x38,0xE0,0x0F,0x80,0x00,0x00,/*"C:\Users\23725\Desktop\C51_点阵(显示图形,可移动)\PCtoLCD2002完美版--字摸提取软件\@.bmp",0*/


  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",14*/
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/                //这两行不用动,改字时保留
  40. };

  41. uchar code tab1[]={//左移函数
  42. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  43. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/           //这两行不用动,改字时保留
  44.         
  45. 0x00,0x00,0x03,0xE0,0x0C,0x38,0x10,0x0C,0x23,0xE6,0x44,0x32,0x48,0x12,0x48,0x12,
  46. 0x48,0x22,0x48,0x62,0x4F,0xF2,0x48,0x16,0x60,0x34,0x38,0xE0,0x0F,0x80,0x00,0x00,/*"C:\Users\23725\Desktop\C51_点阵(显示图形,可移动)\PCtoLCD2002完美版--字摸提取软件\@.bmp",0*/
  47.         
  48. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x14,0x30,0x14,0x18,0x00,0x08,0x00,0x08,
  49. 0x00,0x08,0x00,0x08,0x14,0x18,0x14,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\笑脸.bmp",0*/

  50. 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x28,0x08,0x28,0x48,0x1B,0xA8,0x08,0x28,
  51. 0x08,0x28,0x18,0x28,0x2B,0xA8,0x28,0x48,0x08,0x08,0x0F,0xF8,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\bilibili.bmp",0*/

  52. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",14*/
  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/           //这两行不用动,改字时保留
  54. };

  55. uchar code tab2[]={ //bilibili 图案数组
  56. 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x28,0x08,0x28,0x48,0x1B,0xA8,0x08,0x28,
  57. 0x08,0x28,0x18,0x28,0x2B,0xA8,0x28,0x48,0x08,0x08,0x0F,0xF8,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\bilibili.bmp",0*/
  58. };

  59. uchar code tab3[]={ //笑脸 图案数组
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x14,0x30,0x14,0x18,0x00,0x08,0x00,0x08,
  61. 0x00,0x08,0x00,0x08,0x14,0x18,0x14,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*"C:\Users\23725\Desktop\笑脸.bmp",0*/
  62. };

  63. uchar code tab4[]={ //@ 图案数组
  64. 0x00,0x00,0x03,0xE0,0x0C,0x38,0x10,0x0C,0x23,0xE6,0x44,0x32,0x48,0x12,0x48,0x12,
  65. 0x48,0x22,0x48,0x62,0x4F,0xF2,0x48,0x16,0x60,0x34,0x38,0xE0,0x0F,0x80,0x00,0x00,/*"C:\Users\23725\Desktop\C51_点阵(显示图形,可移动)\PCtoLCD2002完美版--字摸提取软件\@.bmp",0*/
  66. };
  67. uchar code tab5[]={//bilibili放大图案
  68. 0x00,0x00,0x3F,0xFE,0x20,0x02,0xA0,0x02,0xA0,0x62,0x67,0x12,0x20,0x0A,0x20,0x0A,
  69. 0x20,0x0A,0x20,0x0A,0x20,0x0A,0x67,0x12,0xA0,0x62,0xA0,0x02,0x20,0x02,0x3F,0xFE,
  70. };
  71. uchar code tab6[]={//笑脸放大图案
  72. 0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x18,0x50,0x0C,0x50,0x04,0x00,0x04,0x00,0x04,
  73. 0x00,0x04,0x00,0x04,0x50,0x04,0x50,0x04,0x40,0x0C,0x00,0x18,0x00,0x10,0x00,0x00,
  74. };
  75. uchar code tab7[]={//@ 放大图案数组
  76. 0x03,0xE0,0x0E,0x38,0x18,0x0C,0x20,0x06,0x43,0xE2,0x47,0x31,0x84,0x11,0x88,0x11,
  77. 0x88,0x21,0x88,0x61,0x8F,0xF3,0xCE,0x12,0x40,0x10,0x60,0x30,0x38,0xE0,0x0F,0x80,
  78. };
  79. uchar code tab8[]={//全亮检测数组
  80. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  81. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  82. };
  83. uchar code tab9[]={//全灭检测数组
  84. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  86. };
  87. uchar code tab10[]={//边沿检测数组
  88. 0xFF,0xFF,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,
  89. 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFF,0xFF,
  90. };


  91. void delay(uint z)           //延时子函数
  92. {
  93.    uchar x;
  94.    for(;z>0;z--)
  95.    for(x=121;x>0;x--);
  96. }

  97. void PanDuan()//判断显示模式函数
  98. {
  99.         if(dand1)
  100.         {
  101.                 if(bilibili)
  102.                 {
  103.                         data1=tab5[aa]; //取出上8行数据输出
  104.                         aa++;
  105.                         data2=tab5[aa]; //取出下8行数据输出
  106.                         aa++;
  107.                 }
  108.                 else
  109.                 {
  110.                         data1=tab2[aa]; //取出上8行数据输出
  111.                         aa++;
  112.                         data2=tab2[aa]; //取出下8行数据输出
  113.                         aa++;
  114.                 }
  115.         }
  116.         else
  117.         {
  118.                 if(dand2)
  119.                 {
  120.                         if(xiaolian)
  121.                         {
  122.                                 data1=tab6[aa]; //取出上8行数据输出
  123.                                 aa++;
  124.                                 data2=tab6[aa]; //取出下8行数据输出
  125.                                 aa++;
  126.                         }
  127.                         else
  128.                         {
  129.                                 data1=tab3[aa]; //取出上8行数据输出
  130.                                 aa++;
  131.                                 data2=tab3[aa]; //取出下8行数据输出
  132.                                 aa++;
  133.                         }
  134.                 }
  135.                 else
  136.                 {
  137.                         if(dand3)
  138.                         {
  139.                                 if(tu3)
  140.                                 {
  141.                                         data1=tab7[aa]; //取出上8行数据输出
  142.                                         aa++;
  143.                                         data2=tab7[aa]; //取出下8行数据输出
  144.                                         aa++;
  145.                                 }
  146.                                 else
  147.                                 {
  148.                                         data1=tab4[aa]; //取出上8行数据输出
  149.                                         aa++;
  150.                                         data2=tab4[aa]; //取出下8行数据输出
  151.                                         aa++;
  152.                                 }
  153.                         }
  154.                         else
  155.                         {
  156.                                 if(quanliang)
  157.                                 {
  158.                                         data1=tab8[aa]; //取出上8行数据输出
  159.                                         aa++;
  160.                                         data2=tab8[aa]; //取出下8行数据输出
  161.                                         aa++;
  162.                                 }
  163.                                 else
  164.                                 {
  165.                                         if(quanmie)
  166.                                         {
  167.                                                 data1=tab9[aa]; //取出上8行数据输出
  168.                                                 aa++;
  169.                                                 data2=tab9[aa]; //取出下8行数据输出
  170.                                                 aa++;
  171.                                         }
  172.                                         else
  173.                                         {
  174.                                                 if(bianyan)
  175.                                                 {
  176.                                                         data1=tab10[aa]; //取出上8行数据输出
  177.                                                         aa++;
  178.                                                         data2=tab10[aa]; //取出下8行数据输出
  179.                                                         aa++;
  180.                                                 }
  181.                                                 else
  182.                                                 {
  183.                                                         if(fangxiang==0)
  184.                                                         {
  185.                                                                 data1=tab[net+aa]; //取出上8行数据输出
  186.                                                                 aa++;
  187.                                                                 data2=tab[net+aa]; //取出下8行数据输出
  188.                                                                 aa++;
  189.                                                         }
  190.                                                         else
  191.                                                         {
  192.                                                                 data1=tab1[net+aa]; //取出上8行数据输出
  193.                                                                 aa++;
  194.                                                                 data2=tab1[net+aa]; //取出下8行数据输出
  195.                                                                 aa++;
  196.                                                         }
  197.                                                 }
  198.                                         }
  199.                                 }
  200.                         }
  201.                 }
  202.                
  203.         }
  204. }

  205. void xianshi()//显示函数
  206. {
  207.         uchar i;
  208.         if(fangxiang==0)//向右移动
  209.         {
  210.                 for(i=0;i<16;i++)
  211.                 {
  212.                         P3=i; //列扫描
  213.                         PanDuan();//判断显示模式
  214.                         delay(2);        //延时
  215.                         data1=0;  //清屏
  216.                         data2=0;  //清屏
  217.                         P3=0x00;  //消除余辉
  218.                         if(aa>30)
  219.                                 aa=0;  //字模地址
  220.                 }
  221.         }
  222.         else//向左移动
  223.         {
  224.                 for(i=0;i<16;i++)
  225.                 {
  226.                         P3=i; //列扫描
  227.                         PanDuan();//判断显示模式
  228.                         delay(2);        //延时
  229.                         data1=0;  //清屏
  230.                         data2=0;  //清屏
  231.                         P3=0x00;  //消除余辉
  232.                         if(aa>30) aa=0;  //字模地址
  233.                 }
  234.         }
  235.                
  236. }



  237. void scan_key(void)//矩阵键盘按键扫描函数
  238. {
  239.         //检测第一行
  240.         x1=0; x2=1; x3=1; x4=1;
  241.         if(y1==0)//开始/停止移动按键   
  242.         {
  243.                 delay(30);  //延时消抖
  244.                 if(y1==0)
  245.                 {
  246.                         TR1=~TR1;          //按下暂停  ,暂按继续
  247.                         while(!y1) xianshi();
  248.                 }
  249.         }
  250.         else if(y2==0)//左右移动切换
  251.         {
  252.                 delay(30);                        //延时消抖
  253.                 if(y2==0)
  254.                 {
  255.                         fangxiang=~fangxiang;  //方向取反
  256.                         if(fangxiang==0) net=0;
  257.                         else net=(zishu+1)*32;
  258.                         while(!y2) xianshi();
  259.                 }
  260.         }
  261.         else if(y3==0)//增加延时,移动速度减
  262.         {
  263.                 delay(30);
  264.                 if(y3==0)
  265.                 {
  266.                                 sudu++;
  267.                                 if(sudu>10)
  268.                                 sudu=10;
  269.                                 while(!y3) xianshi();
  270.                 }
  271.         }
  272.         else if(y4==0)//减少延时,移动速度加
  273.         {
  274.                 delay(30);
  275.                 if(y4==0)
  276.                 {
  277.                         sudu--;
  278.                         if(sudu<1)
  279.                         sudu=1;
  280.                         while(!y4) xianshi();
  281.                 }
  282.         }
  283.         //检测第二行按键
  284.         x1=1; x2=0; x3=1; x4=1;
  285.         if(y1==0)        //单独显示图1            
  286.         {
  287.                 delay(30);
  288.                 if(y1==0)
  289.                 {
  290.                         dand1=!dand1;
  291.                         dand2=0;
  292.                         dand3=0;
  293.                         quanliang=0;
  294.                         quanmie=0;
  295.                         bianyan=0;
  296.                         while(!y1) xianshi();
  297.                 }
  298.         }
  299.         else if(y2==0)         //单独显示图2
  300.         {
  301.                 delay(30);
  302.                 if(y2==0)
  303.                 {
  304.                         dand1=0;
  305.                         dand2=!dand2;
  306.                         dand3=0;
  307.                         quanliang=0;
  308.                         quanmie=0;
  309.                         bianyan=0;
  310.                         while(!y2) xianshi();
  311.                 }
  312.         }
  313.         else if(y3==0)         //单独显示图3
  314.         {
  315.                 delay(30);
  316.                 if(y3==0)
  317.                 {
  318.                         dand1=0;
  319.                         dand2=0;
  320.                         dand3=!dand3;
  321.                         quanliang=0;
  322.                         quanmie=0;
  323.                         bianyan=0;
  324.                         while(!y3) xianshi();
  325.                 }
  326.         }
  327.         else if(y4==0)//放大图1
  328.         {
  329.                 delay(30);
  330.                 if(y4==0)
  331.                 {
  332.                         bilibili=1;
  333.                         while(!y4) xianshi();
  334.                 }
  335.         }
  336.         //检测第三行按键
  337.         x1=1; x2=1; x3=0; x4=1;
  338.         if(y1==0)//减小图1
  339.         {
  340.                 delay(30);
  341.                 if(y1==0)
  342.                 {
  343.                         bilibili=0;
  344.                         while(!y1) xianshi();
  345.                 }
  346.         }
  347.         else if(y2==0)//放大图2         
  348.         {
  349.                 delay(30);
  350.                 if(y2==0)
  351.                 {
  352.                         xiaolian=1;
  353.                         while(!y2) xianshi();
  354.                 }
  355.         }
  356.         else if(y3==0)//减小图2
  357.         {
  358.                 delay(30);
  359.                 if(y3==0)
  360.                 {
  361.                         xiaolian=0;
  362.                         while(!y3) xianshi();
  363.                 }
  364.         }
  365.         else if(y4==0)//放大图3
  366.         {
  367.                 delay(30);
  368.                 if(y4==0)
  369.                 {
  370.                         tu3=1;
  371.                         while(!y4) xianshi();
  372.                 }
  373.         }
  374.         //检测第四行按键
  375.         x1=1; x2=1; x3=1; x4=0;
  376.         if(y1==0)//减小图3
  377.         {
  378.                 delay(30);
  379.                 if(y1==0)
  380.                 {
  381.                         tu3=0;
  382.                         while(!y1) xianshi();
  383.                 }
  384.         }
  385.         else if(y2==0)         
  386.         {
  387.                 delay(30);
  388.                 if(y2==0)
  389.                 {
  390.                         quanliang=!quanliang;
  391.                         dand1=0;
  392.                         dand2=0;
  393.                         dand3=0;
  394.                         quanmie=0;
  395.                         bianyan=0;
  396.                         while(!y2) xianshi();
  397.                 }
  398.         }
  399.         else if(y3==0)         
  400.         {
  401.                 delay(30);
  402.                 if(y3==0)
  403.                 {
  404.                         quanmie=!quanmie;
  405.                         dand1=0;
  406.                         dand2=0;
  407.                         dand3=0;
  408.                         quanliang=0;
  409.                         bianyan=0;
  410.                         while(!y3) xianshi();
  411.                 }
  412.         }
  413.         else if(y4==0)         
  414.         {
  415. ……………………
  416. void main()     //主函数
  417. {
  418.    ET1=1;     //使能定时器0
  419.    EA=1;     //开启总中断
  420.    TR1=1;    //开始计数
  421.    TH1=0x3c;
  422.    TL1=0xb0;
  423.    while(1)     //无限循环
  424.    {
  425.        xianshi();  //显示
  426.          scan_key();
  427.      }
  428. }

  429. void timer1() interrupt 3//定时器1中断服务函数,通过改变计时的快慢改变移动的速度
  430. {
  431.     TH1=0x3C;
  432.     TL1=0xB0;
  433.   alt++;           //计时变量,用于控制速度的计时变量
  434.   if(alt>=5*sudu)           //到一定的时间加以实现左移
  435.   {
  436.         alt=0;
  437.         if(fangxiang==0)     //如果是正向 正向移动
  438.         {
  439.             net=net+2;//列左移
  440.         if(net>((zishu+1)*32))  //字移动数量
  441.                 net=0;
  442.         }
  443.      else               //否则反向移动
  444.      {
  445.          net=net-2;//列右移
  446.          if(net<2)
  447.              net=(zishu+1)*32;      //字移动数量
  448.      }
  449.   }
  450. }
复制代码

仿真程序: C51_16x16点阵(显示图形,可移动,矩阵键盘).7z (172.81 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:986591 发表于 2024-11-14 22:37 | 显示全部楼层
这个代码是根据普中得51开发板写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表