51单片机累加累减程序与Proteus仿真图

[复制链接]
查看11 | 回复0 | 2021-6-9 18:15:05 | 显示全部楼层 |阅读模式
累加累减程序最大数值十999。
按加建KEY1数值加1并显示;
按减建KEY1数值减1并显示;
按归零键数值归零并显示;
附件包含完整程序和仿真设计

仿真原理图如下(proteus仿真工程文件和完整代码可到本帖附件中下载)
1.png
51单片机部分源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define DB P1
  5. /*************** 物理连接
  6. P2^0对应 LCD_RS;
  7. P2^1对应LCD_RW;
  8. P2^2对应LCD_E;
  9. P1对应LCD_DB;
  10. P3^0对应KEY1加键;
  11. P3^1对应KEY2减键;
  12. P3^2对应KEY3清零键;
  13. ******************/
  14. void LCD_init();                                         //1602初始函数
  15. void LCD_write_command(uchar dat);         //1602写命令函数
  16. void LCD_write_dat(uchar dat);                 //1602写数据函数
  17. void delay40us(uint n);                                //延时函数,单次40US
  18. void display(uint tt);                                //显示函数
  19. uint KEY_scan(uint num);
  20. sbit LCD_RS=P2^0;
  21. sbit LCD_RW=P2^1;
  22. sbit LCD_E=P2^2;
  23. sbit KEY1=P3^0;
  24. sbit KEY2=P3^1;
  25. sbit KEY3=P3^2;
  26. uint num,key;                                                        //全局变量
  27. uchar table[]="The num is";

  28. //**************延时函数,单次约40US************
  29. void delay40us(uint n)
  30. { uint i;
  31. uchar j;
  32. for(i=n;i>0;i--)
  33. for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
  34. } //实践证明我的LCD1602 上普
  35. //通的指令只需1次循环就能可靠完成

  36. //*************LCD初始化函数***************
  37. void LCD_init()
  38. {
  39. LCD_write_command(0x38);//设置8位格式,2行,5x7
  40. LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  41. LCD_write_command(0x06);//设定输入方式,增量不移位--------------
  42. LCD_write_command(0x01);//清除屏幕显示----------------
  43. delay40us(100);       //实践证明,我的LCD1602上,用for 循环200 次就能可靠完成清屏指令
  44. }






  45. //*****************1602写命令函数************
  46. void LCD_write_command(uchar dat)
  47. {
  48. DB=dat;
  49. LCD_RS=0;                         //写命令
  50. LCD_RW=0;                         //写容许
  51. LCD_E=1;                         //LCD_E下降沿触发写
  52. LCD_E=0;
  53. delay40us(1);         //延时确保写成功
  54. }

  55. //*************1602写数据函数*************
  56. void LCD_write_dat(uchar dat)
  57. {
  58. DB=dat;
  59. LCD_RS=1;                         //写数据
  60. LCD_RW=0;                         //写容许
  61. LCD_E=1;                         //LCD_E下降沿触发写
  62. LCD_E=0;
  63. delay40us(1);         //延时确保写成功
  64. }

  65. //****************读键盘***************
  66. uint KEY_scan(uint num )
  67. {
  68. if(KEY1==0)                                  //加键按下
  69. delay40us(25);                          //延迟1MS
  70. if(KEY1==0)                                  //确认加键按下
  71. {
  72. if(num==1000)
  73. num=0;
  74. ++num;                                         //显示当前数值
  75. display(num);
  76. while(!KEY1);                        //等待加键松开
  77. }
  78. if(KEY2==0)
  79. delay40us(25);
  80. if(KEY2==0)
  81. {
  82. if(num==0)
  83. num=1000;
  84. --num;
  85. display(num);
  86. while(!KEY2);
  87. }
  88. if(KEY3==0)
  89. delay40us(25);
  90. if(KEY3==0)
  91. {
  92. num=0;
  93. display(num);
  94. while(!KEY3);
  95. }
  96. return num;
  97. }


  98. //********************显示当前数值***********
  99. void display(uint tt)
  100. {
  101.   LCD_write_command(0x80+68);
  102.   LCD_write_dat(0x30+tt/100);
  103.   delay40us(15);
  104.   LCD_write_dat(0x30+tt/10%10);
  105.   delay40us(15);
  106.   LCD_write_dat(0x30+tt%10);
  107.   delay40us(15);
  108. }


  109. //************主函数************
  110. main()
  111. {
  112. uchar k;
  113. P3=0xff;
  114. num=0;
  115. LCD_init();
  116. LCD_write_command(0x80);
  117. for(k=0;k<12;++k)
  118. {
  119.   LCD_write_dat(table[k]);
  120.   delay40us(1500);
  121. }
  122. while(1)
  123. {
  124.    num= KEY_scan(num);
  125. }
  126. }
复制代码

完整c源码和proteus仿真文件: 累加累减.zip (62.77 KB, 售价: 3 工控币)
回复

使用道具 举报

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

本版积分规则