打印

我懂硬件,但不懂软件,在这里求个程序,请大家帮忙

[复制链接]
2073|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
it_yuan|  楼主 | 2013-3-19 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新注册的分数不多,请谅解.

是这样的,我懂硬件但不懂软件.想做点东东出来玩玩,硬件已经搭好,就差个程序,汇编, C 都行

电路连接:K0-K15矩阵按键 接P2,P2.0-P2.3行 P2.4-P2.7列   
      我想达到的效果:
上电状态  P0  P1(除P1.7外)口全输出高电平
P1.7外接LED 亮一秒 灭一秒  

K0 按一下 P0.0 输出低电平并保持 按键长按无效  尽量避免误动作
K0 再按一下P0.0输出高电平并保持 按键长按无效,如此循环
K1按一下P0.1输出低电平并保持
K1再按一下P0.1输出高电平并保持 按键长按无效,
K2......P0.2
K3......P0.3
K4......P0.4
K5......P0.5
K6......P0.6
K7......P0.7
K8......P1.0
K9......P1.1
K10......P1.2
K11......P1.3
K12......P1.4
K13......P1.5
K14......P1.6
K15......按下,P0  P1(除P1.7外)口全输出高电平  再次按下,无任何动作/

另外,P1.5 P1.6能否延时(就是当K13按下后P1.5输出低电平,如果K13没有再次按下
P1.5延时10分钟就输出高电平,当K13再次按下,如果没到10分钟P1.5也马上输出高
电平,如果10分钟后就再次输出低电平,)  P1.6同上  时间不需要很精确。

相关帖子

沙发
老老实实| | 2013-3-19 22:55 | 只看该作者
有时间告诉你方法,但是没时间帮你写代码

使用特权

评论回复
板凳
huangxz| | 2013-3-19 23:01 | 只看该作者
虽然不复杂,但也是需要不少时间的呢,给学弟们练练到是不错

使用特权

评论回复
地板
zhangcheng@| | 2013-3-19 23:07 | 只看该作者
看着不是很难,可以分解出来,一步一步实现

使用特权

评论回复
5
zj28000| | 2013-3-19 23:17 | 只看该作者
慢慢写,

使用特权

评论回复
6
hlzhaowu| | 2013-3-19 23:48 | 只看该作者
楼主想用什么单片机做呢

使用特权

评论回复
7
it_yuan|  楼主 | 2013-3-20 16:05 | 只看该作者
单片机是 at89s52  现在在试一些简单程序,如果我自己能写好,那就好了。再慢慢学学。我在想用那些现成的键扫描程序加上执行程序不就行了吗?但怎么加不知道呢?

使用特权

评论回复
8
it_yuan|  楼主 | 2013-3-22 15:22 | 只看该作者
本帖最后由 it_yuan 于 2013-3-22 15:27 编辑

我抄了一段按键扫描程序,稍微改了一下,编译也没错误,基本看懂了。但是我要加上比如 当返回值k=1时 P0.1=~P0.1,要加在什么地方怎么写这个代码。谢谢指点!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P0.1=P0^1;
uchar  x,y;
void delay(uint c)
{
uint a,b;
for(a=c;a>0;a--)
for(b=110;b>0;b--)
  }
uchar key_scan()
{
  uchar k;
  uchar z;
  x=0x00;
  y=0x00;
  P3=0xf0;
if(P3!=0xf0)
  {
   delay(10);
   if(P3!=0xf0)
     {
      x=P3;
      P3=0x0f;
      y=P3;
      z=x|y;
     switch(z)
        {
          case 0xee:k=0;break;
          case 0xed:k=1;break;
          case 0xeb:k=2;break;
          case 0xe7:k=3;break;
          case 0xde:k=4;break;
          case 0xdd:k=5;break;
          case 0xdb:k=6;break;
          case 0xd7:k=7;break;
          case 0xbe:k=8;break;
          case 0xbd:k=9;break;
          case 0xbb:k=10;break;
          case 0xb7:k=11;break;
          case 0x7e:k=12;break;
          case 0x7d:k=13;break;
          case 0x7b:k=14;break;
          case 0x77:k=15;break;
          }
       }
    }
   return(k);
   }

void main()
{
  uchar dat;
  while(1)
     {
       P3=0xf0;
       while(P!=0xf0)
         {
           dat=key_scan();
           P1=0;
          }
      }
  }


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝