找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大家麻烦帮我看一下,我看的郭天祥的书,有一块不懂

 关闭 [复制链接]
跳转到指定楼层
楼主
ID:329253 发表于 2018-5-29 23:17 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
本帖最后由 134849694164151 于 2020-3-26 16:14 编辑

已解决

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:329253 发表于 2018-5-29 23:20 来自手机 | 只看该作者
上边照片不清晰,已经更新了清晰的图在下面的楼层
回复

使用道具 举报

板凳
ID:341050 发表于 2018-5-30 01:39 | 只看该作者
这应该是实现一个秒表的功能,按键函数就是一个判断按键是否按下,大概有高低电平判断,消抖,键沿控制,具体操作就是通过读取相应引脚的数据对其数值进行判断

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:295783 发表于 2018-5-30 08:53 | 只看该作者
我的想法是:书上的函数就是一个判断按键是否按下;
应该会有高低电平判断,以及高低电平的转换吧(不是很确定);
一定要有按键消抖的过程;
主要就是看起相对应的引脚上面的数值,然后定义其显示的数值所代表的功能来进行判断的。
希望能对你有帮助。。。
回复

使用道具 举报

5#
ID:241128 发表于 2018-5-30 09:15 | 只看该作者
图片看不清,学这个东西要一步一步来,你可能还不会按键判断,所以你先要弄懂按键判断这块原理,怎么样是按键按下去了,用什么判断的,按键抬起了了又会是什么样的,真的会这个了你再去考虑按键功能的实现就简单了。不知道你是不是还不会按键判断是怎么实现的,如果是的话上面你贴出来的不适合你学,看前面简单点的,按键控制LED点亮熄灭这块。就不知道这本书有没有这样的初级引导篇。
如果你会按键判断了,那么实现加一减一功能就要看上文是怎么处理的,看别人的代码加一减一是怎么处理的,你在按键判断里可以想办法先停止原来的加一减一进程,能做到这点你就会想到办法加一减一了。
回复

使用道具 举报

6#
ID:341148 发表于 2018-5-30 09:49 | 只看该作者
看不清
回复

使用道具 举报

7#
ID:149389 发表于 2018-5-30 15:57 | 只看该作者


问题可以再具体一点。
回复

使用道具 举报

8#
ID:149389 发表于 2018-5-30 16:05 | 只看该作者
  1. /****************************************************************
  2. * 例4.1.1用数码管前两位显示一个十进制数,变化范围为00~59,
  3. * 开始时显示00,每按下S2键一次,数值加1;
  4. * 每按下S3键一次,数值减1;
  5. * 每按下S4键一次,数值归零;
  6. * 按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。
  7. * (part2.2_1.c  P82)
  8. ****************************************************************/

  9. #include <reg52.h>                    //52系列单片机头文件
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. sbit key1=P3^4;
  13. sbit key2=P3^5;
  14. sbit key3=P3^6;
  15. sbit key4=P3^7;

  16. sbit dula=P2^6;                //申明U1锁存器的锁存端
  17. sbit wela=P2^7;                //申明U2锁存器的锁存端
  18. uchar code table[]={
  19.   0x3f,0x06,0x5b,0x4f,
  20.   0x66,0x6d,0x7d,0x07,
  21.   0x7f,0x6f,0x77,0x7c,
  22.   0x39,0x5e,0x79,0x71};
  23. void delayms(uint);
  24. uchar numt0,num;
  25. void display(uchar numdis)  //显示子函数
  26. {
  27.   uchar shi,ge;         //分离两个分别要显示的数
  28.   shi=numdis/10;
  29.   ge=numdis%10;

  30.   dula=1;
  31.   P0=table[shi];    //送十位段选数据
  32.   dula=0;
  33.   P0=0xff;                //送位选数据前关闭所有显示,防止打开位选锁存时
  34.   wela=1;                        //原来段选数据通过位选锁存器造成混乱
  35.   P0=0xfe;                //送位选数据
  36.   wela=0;
  37.   delayms(5);        //延时

  38.   dula=1;
  39.   P0=table[ge];  //送个位段选数据
  40.   dula=0;
  41.   P0=0xff;
  42.   wela=1;
  43.   P0=0xfd;
  44.   wela=0;
  45.   delayms(5);
  46. }
  47. void delayms(uint xms)                               
  48. {
  49.   uint i,j;
  50.   for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
  51.     for(j=110;j>0;j--);
  52. }
  53. void init()    //初始化函数
  54. {
  55.   TMOD=0x01;//设置定时器0为工作方式1(0000 0001)
  56.   TH0=(65536-45872)/256;//装初值50ms一次中断
  57.   TL0=(65536-45872)%256;
  58.   EA=1;  //开总中断
  59.   ET0=1; //开定时器0中断       
  60. }
  61. void keyscan()
  62. {
  63.   if(key1==0)
  64.   {
  65.     delayms(10);
  66.     if(key1==0)
  67.     {
  68.       num++;
  69.       if(num==60)//当到60时重新归0
  70.           num=0;
  71.       while(!key1);//等待按键释放       
  72.     }
  73.   }
  74.   if(key2==0)
  75.   {
  76.     delayms(10);
  77.     if(key2==0)
  78.     {
  79.       if(num==0)//当到0时重新归60
  80.           num=60;
  81.       num--;       
  82.       while(!key2);
  83.     }
  84.   }
  85.   if(key3==0)
  86.   {
  87.     delayms(10);
  88.     if(key3==0)
  89.     {
  90.       num=0;  //清0
  91.       while(!key3);       
  92.     }
  93.   }
  94.   if(key4==0)
  95.   {
  96.     delayms(10);
  97.     if(key4==0)
  98.     {
  99.       while(!key4);
  100.       TR0=~TR0;//启动或停止定时器0       
  101.     }
  102.   }
  103. }
  104. void main()
  105. {
  106.   init();//初始化函数
  107.   while(1)
  108.   {
  109.     keyscan();
  110.     display(num);
  111.   }
  112. }
  113. void T0_time() interrupt 1
  114. {
  115.   TH0=(65536-45872)/256;//重装初值
  116.   TL0=(65536-45872)%256;       
  117.   numt0++;       
  118.   if(numt0==20)                //如果到了20次,说明1秒时间到
  119.   {
  120.     numt0=0;                //然后把num清0重新再计20次
  121.     num++;
  122.     if(num==60)
  123.       num=0;
  124.   }               
  125. }



复制代码


回复

使用道具 举报

9#
ID:341538 发表于 2018-5-30 17:13 | 只看该作者
哪里有什么加一减一
回复

使用道具 举报

10#
ID:341842 发表于 2018-5-30 23:30 | 只看该作者
num++ 就是自加1  num--就是减1 ,这是一种简洁高效的写法,但对初学者C语不好的,比较难理解,你可以如下理解: num++    等式于 num=num+1    num-- 等式于 num=num-1  这两种写实现的功能都一样,后都比难易于理解,
回复

使用道具 举报

11#
ID:324844 发表于 2018-6-24 15:19 | 只看该作者
在keyscan()函数里面有四个按键的按下与否的检测,在本书第80页图4.1.2中可知按键按下会令该位I/O口拉为低电平,同时为了防止此次的按键按下为假(即此次只是一次抖动),写了10ms的延迟,再次判断是否按下,为真时进入if语句,num变量自加一次,若num加到等于60则清零(这是一个轮回啊哈哈)while的参数为1则等待,即key1==0,当只有key==1时(按键松开I/O口回到高电平)令程序跳出了while(1)死循环,第一次按key1按键结束num=1;同理第二次num=2。。。。num=3等等,直到60被清零轮回,同理KEY2,key3...
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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