找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2068|回复: 9
收起左侧

关于51单片机一个问题一直困扰我几天,有4个键,控制4个的状态

[复制链接]
ID:609031 发表于 2019-11-24 23:50 来自手机 | 显示全部楼层 |阅读模式
真的困扰我好久了,希望能解决这个问题。有没有大佬知道怎么做?可以大致说下思路吗?
有4个键,控制4个的状态。A键让灯闪烁,B键让闪烁停止;C键让灯从上到下移位,D键让灯从下到上移位
4913b1ed42ef6530.png
回复

使用道具 举报

ID:609031 发表于 2019-11-24 23:51 来自手机 | 显示全部楼层
中间下面那两个是与门
回复

使用道具 举报

ID:25310 发表于 2019-11-25 06:44 来自手机 | 显示全部楼层
教科书害死人,一个单片机能解决的问题竟然用了那么多芯片!
回复

使用道具 举报

ID:584814 发表于 2019-11-25 07:00 | 显示全部楼层
《51单片机原理及应用(第二版)——基于Keil C与Proteus》第四章例4.4
1146465-20170419182854431-1491475702.png
回复

使用道具 举报

ID:648876 发表于 2019-11-25 10:11 | 显示全部楼层
感觉也太麻烦了吧,不用这么多电路吧
回复

使用道具 举报

ID:378182 发表于 2019-11-25 11:14 | 显示全部楼层
一个单片机编程就能解决的问题,又何用那么多的外围硬件与或非门来实现?
可能这个例题的目的就是要说明与或非门的功能用法?
回复

使用道具 举报

ID:160500 发表于 2019-11-25 12:12 | 显示全部楼层
将这个灯和键看做一个外部RAM,P3.0可以认为是片选,选中后可以像操作外部RAM一样读写,读是键盘,写是LED。
回复

使用道具 举报

ID:302973 发表于 2019-11-25 12:35 | 显示全部楼层
用编程就可以解决
回复

使用道具 举报

ID:213173 发表于 2019-11-25 12:44 | 显示全部楼层
出这个题的目的是让学生掌握IO口作输出口的同时也做输入口,编程时按分时轮换改变IO口状态,在实际电路中检测按键时短暂关闭LED是观察不到的。仿真的效果不如实际电路好。 无标题.jpg
  1. #include <REG51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit a=P3^0;       
  5. sbit b=P3^6;       
  6. sbit c=P3^7;
  7. uchar code table1[]={0xfe,0xfd,0xfb,0xf7};
  8. uchar code table2[]={0xf7,0xfb,0xfd,0xfe};
  9. uchar key=0x0f;

  10. void delay(uint k)//延时程序
  11. {
  12.         uint i,j;
  13.         for(i=k;i>0;i--)
  14.                 for(j=125;j>0;j--);
  15. }

  16. void keyscan()//按键扫描程序
  17. {
  18.         uchar i;
  19.         P0=0xff;
  20.         i=P0&0x0f;
  21.         if(i!=0x0f)
  22.         {
  23.                 key=i;       
  24.         }
  25. }
  26. void display()//显示程序
  27. {
  28.         static uint i=0,j=0;

  29.         if(key==0x0e)
  30.         {       
  31.                 if(i<250)
  32.                         P0&=0x00;
  33.                 else P0=0x0f;
  34.         }
  35.         if(key==0x0d)
  36.         {
  37.                 P0=0x00;
  38.         }
  39.         if(key==0x0b)
  40.         {

  41.                 P0=table1[j];
  42.         }
  43.         if(key==0x07)
  44.         {
  45.                 P0=table2[j];
  46.         }

  47.         i++;
  48.         if(i>=500)
  49.         {
  50.                 i=0;
  51.                 j++;
  52.                 j%=4;
  53.         }
  54. }
  55. void main(void)
  56. {
  57.         b=0;
  58.         c=0;
  59.         while(1)
  60.         {
  61.                 a=0;
  62.                 keyscan();
  63.                 a=1;
  64.                 display();
  65.                 delay(1);
  66.         }
  67. }
复制代码




回复

使用道具 举报

ID:609031 发表于 2019-11-25 20:38 来自手机 | 显示全部楼层
wulin 发表于 2019-11-25 12:44
出这个题的目的是让学生掌握IO口作输出口的同时也做输入口,编程时按分时轮换改变IO口状态,在实际电路中检 ...

感谢大佬,已经解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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