找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机实验,IO口的使用,P3.3输入,P1口输出

[复制链接]
回帖奖励 150 黑币 回复本帖可获得 50 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
本帖最后由 水各 于 2020-5-8 00:27 编辑

实验要求如下:P3.3口做输入口,外接一脉冲,每输入一个脉冲,P1口按16进制加一方式点亮发光二极管。P3口接的是一个开关。
电路图流程图如下


本菜鸟不太理解这题,写的C语言程序问题很大。
希望有大神能指点一下
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. sbit key=P3^3;
  4. uchar code seg[]=
  5. {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
  6. void delayms(uchar ms)
  7. {
  8. uchar i;
  9. while(ms--)
  10. for(i=0;i<123;i++);
  11. }
  12. uchar key_scan(void)
  13. {
  14. static bit kp=0;
  15. if((P3&0x0f)!=0x0f)
  16. {
  17. delayms(10);
  18. if(((P3&0x0f)!=0x0f)&&(kp==0))
  19. {
  20. kp=1;
  21. return 1;
  22. }
  23. }
  24. else kp=0;
  25. return 0;
  26. }
  27. void main(void)
  28. {
  29. uchar key_val;
  30. uchar num=0;
  31. while(1)
  32. {
  33. key_val=key_scan();
  34. if(key_val==1)
  35. {
  36. if(++num==16)
  37. num=0;
  38. }
  39. P2=seg[num];
  40. }
  41. }
复制代码




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

使用道具 举报

沙发
ID:282850 发表于 2020-5-8 01:17 | 只看该作者
指点一下?一下在哪里?是MCU不懂?还是74LS345不懂?还是C的每个语句都不懂?还是某句不懂?点亮一个LED做过吗?
回复

使用道具 举报

板凳
ID:746607 发表于 2020-5-8 09:32 | 只看该作者
这是学校考试题吧,, seg[]数组下标值的范围是0~14,你把36行的if(++num==16)改成if(++num==15) 就运行正常了。还有个办法是在seg[]数组里在首数据的位置再添个0x00也行
回复

使用道具 举报

地板
ID:746607 发表于 2020-5-8 09:34 | 只看该作者
这是学校考试题吧,, seg[]数组下标值的范围是0~14,你把36行的if(++num==16)改成if(++num==15) 就运行正常了。还有个办法是在seg[]数组里在首数据的位置再添个0x00也行.
最好的办法是把uchar code seg[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
改为
uchar code seg[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
回复

使用道具 举报

5#
ID:722868 发表于 2020-5-8 10:22 | 只看该作者
f556 发表于 2020-5-8 01:17
指点一下?一下在哪里?是MCU不懂?还是74LS345不懂?还是C的每个语句都不懂?还是某句不懂?点亮一个LED做 ...

点亮一个LED是做过的。
就是这一题根据师傅的讲解,是要根据P3.3的中断特性来判断开关拨动的次数,然后开关拨动一个来回,LED灯根据16进制加一(16进制比较困难也可以用2进制)。我主要不懂的地方时,这个判断拨动次数的程序怎样写
回复

使用道具 举报

6#
ID:213173 发表于 2020-5-8 10:58 | 只看该作者
用P1的8个LED显示0x00~0xff

#include<reg51.h>
#define uchar unsigned char
sbit key=P3^3;

void delayms(uchar ms)
{
        uchar i;
        while(ms--)
        for(i=0;i<123;i++);
}

bit key_scan(void)
{
        static bit kp=0;
        if((P3&0x0f)!=0x0f)
        {
                delayms(10);
                if(((P3&0x0f)!=0x0f)&&(kp==0))
                {
                        kp=1;
                        return 1;
                }
        }
        else kp=0;
        return 0;
}

void main(void)
{
        uchar num=0;
        P1=0x00;
        while(1)
        {
                if(key_scan())
                        num++;
                P1=num;//0x00~0xff
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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