找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2901|回复: 2
打印 上一主题 下一主题
收起左侧

单片机如何用两个按键控制输出的8位数据进行自加自减

[复制链接]
跳转到指定楼层
楼主
ID:305694 发表于 2018-4-24 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机如何用两个按键控制输出的8位数据进行自加自减
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:46999 发表于 2018-4-24 16:50 | 只看该作者
按键接单片机的中断。中断发生后就进行相关的自加自减就行了。
回复

使用道具 举报

板凳
ID:155507 发表于 2018-4-24 17:25 | 只看该作者
  1. /*-----------------------------------------------
  2.   名称:单个独立按键控制led输出状态
  3.   内容:按下加按键,数值增加直到最大值,按减按键,数值减小,直到最小值
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含头文件,一般情况不需要改动,
  6. //头文件包含特殊功能寄存器的定义

  7. sbit KEY_ADD=P3^3;  //定义按键输入端口
  8. sbit KEY_DEC=P3^4;

  9. #define DataPort P0 //定义数据端口 程序中遇到
  10. //DataPort 则用P0 替换
  11. sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
  12. sbit LATCH2=P2^3;//                 位锁存

  13. unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  14. unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
  15. unsigned char TempData[8]; //存储显示值的全局变量
  16. /*------------------------------------------------
  17.                     函数声明
  18. ------------------------------------------------*/
  19. void DelayUs2x(unsigned char t);//函数声明
  20. void DelayMs(unsigned char t);
  21. void Display(unsigned char FirstBit,unsigned char Num);
  22. /*------------------------------------------------
  23.                     主函数
  24. ------------------------------------------------*/
  25. void main (void)
  26. {
  27.   unsigned char num=0;                  
  28.   KEY_ADD=1; //按键输入端口电平置高
  29.   KEY_DEC=1;
  30.   while (1)         //主循环
  31.   {

  32.     if(!KEY_ADD)  //如果检测到低电平,说明按键按下
  33.     {
  34.       DelayMs(10); //延时去抖,一般10-20ms
  35.       if(!KEY_ADD)     //再次确认按键是否按下,没有按下则退出
  36.       {
  37.         while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直等待
  38.         {
  39.           if(num<9)    //加操作
  40.           num++;

  41.         }
  42.       }
  43.     }

  44.     if(!KEY_DEC)  //如果检测到低电平,说明按键按下
  45.     {
  46.       DelayMs(10); //延时去抖,一般10-20ms
  47.       if(!KEY_DEC)     //再次确认按键是否按下,没有按下则退出
  48.       {
  49.         while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直等待
  50.         {
  51.           if(num>0)  //减操作
  52.           num--;
  53.         }
  54.       }
  55.     }
  56.     TempData[0]=DuanMa[num%10];
  57.     Display(0,1);
  58.     //主循环中添加其他需要一直工作的程序       
  59.   }
  60. }
  61. /*------------------------------------------------
  62. uS延时函数,含有输入参数 unsigned char t,无返回值
  63. unsigned char 是定义无符号字符变量,其值的范围是
  64. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  65. 长度如下 T=tx2+5 uS
  66. ------------------------------------------------*/
  67. void DelayUs2x(unsigned char t)
  68. {   
  69.   while(--t);
  70. }
  71. /*------------------------------------------------
  72. mS延时函数,含有输入参数 unsigned char t,无返回值
  73. unsigned char 是定义无符号字符变量,其值的范围是
  74. 0~255 这里使用晶振12M,精确延时请使用汇编
  75. ------------------------------------------------*/
  76. void DelayMs(unsigned char t)
  77. {
  78.   
  79.   while(t--)
  80.   {
  81.     //大致延时1mS
  82.     DelayUs2x(245);
  83.     DelayUs2x(245);
  84.   }
  85. }
  86. /*------------------------------------------------
  87. 显示函数,用于动态扫描数码管
  88. 输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
  89. 如输入0表示从第一个显示。
  90. Num表示需要显示的位数,如需要显示99两位数值则该值输入2
  91. ------------------------------------------------*/
  92. void Display(unsigned char FirstBit,unsigned char Num)
  93. {
  94.   unsigned char i;
  95.   
  96.   for(i=0;i<Num;i++)
  97.   {
  98.     DataPort=0;   //清空数据,防止有交替重影
  99.     LATCH1=1;     //段锁存
  100.     LATCH1=0;

  101.     DataPort=WeiMa[i+FirstBit]; //取位码
  102.     LATCH2=1;     //位锁存
  103.     LATCH2=0;

  104.     DataPort=TempData[i]; //取显示数据,段码
  105.     LATCH1=1;     //段锁存
  106.     LATCH1=0;
  107.    
  108.     DelayMs(2); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

  109.   }

  110. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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