打印

一个按键控制开关的小程序,请帮我看看如何错误的原因!

[复制链接]
3662|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maryar|  楼主 | 2008-3-19 19:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <reg52.h>
#include <absacc.h>
#define unit unsigned int
#define uchar unsigned char

sbit L0=P2^0;
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;


void delays(void)
{
uchar i;
for(i=300;i>1;i--);
}


void main(void)
{
P2=0x0f;
EA=1;IT0=1;EX0=1;

while(1)
{
delays();
if (keystate!=key)
{
L3=!L3;
L2=!L2;
L1=!L1;
L0=!L0;

}
}

}

void intersvr1(void) interrupt 2 using 1
{
key=!key;
}

运行提示keystate 和 key 没有定义,我搞不懂怎么弄,一本书上的,请前辈指点一下!感激! 

相关帖子

沙发
xhtxzxw| | 2008-3-19 20:07 | 只看该作者

嘿嘿

ANSI C还没有入门,你就搞51C?

你的keystate和key是俩变量,使用之前必须定义,这是C语言的要求,也几乎是任何高级语言的要求(BASIC除外,当然BASIC从来就不是一个实用的语言)。
建议:先把C语言搞得差不多了再提问,否则,怎么回答也没用。

使用特权

评论回复
板凳
maryar|  楼主 | 2008-3-21 11:05 | 只看该作者

感谢指点,不知道我该如何进入下一步的学习?

楼上
感谢你的提醒
我是买了一套单片机学习系统
但是他附有的教程是平凡的单片机教程/芯源的单片机教程上册
这两个都看完了,他们将的主要是汇编语言,现在有点不知道如何入手,所以买了一本书,单片机典型模块设计实例导航,这个例子就是书里的,很多年前学过一点C语言,都忘记了,这个程序大概能看懂,所以就像试一下.
您说的ANSI C 是不是就是基本的C语言?是需要这个入门才能学C51吗?
现在有点不清楚如何进一步学习了.
期望楼上及各位21ic的朋友能给予小弟几分指点,感激不尽!

使用特权

评论回复
地板
hyq.th| | 2008-3-21 12:30 | 只看该作者

加强基础学习!

c语言是基础!没定义的变量编译能通过才怪!建议好好看看c语言吧。

使用特权

评论回复
5
xhtxzxw| | 2008-4-3 10:50 | 只看该作者

嘿嘿

#include <reg52.h>
#include <absacc.h>
#define unit unsigned int
#define uchar unsigned char

sbit L0=P2^0;        //根据后面的代码分析,P2.0~3上可能是接了发光二极管吧?
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;
char key,keystate;  //程序里使用的变量要预先定义

void delays(void)  //通过无实际意义的循环实现延时,一般也称为“软件延时”
{
    uchar i;
    for(i=300;i>1;i--);
}

void main(void)
{
    P2=0x0f;
    EA=1;IT1=1;EX1=1;           //开中断总控位,外部中断1边沿触发,开外部中断1。因为你后面只写了外部中断1的中断服务函数,所以这里应该改成外部中断1

    while(1)        //一个死循环,保证主函数不会运行完了出去找不着北
    {
        delays();
        if (keystate!=key)//keystate里保存着key上一次的值
        {
            L3=!L3; //从此及以下三行使P2.0~3上的电平反相
            L2=!L2; //如果在P2.0~3上接了发光二极管,这些发光二极管就会有亮到灭或灭到亮的变化
            L1=!L1;
            L0=!L0;
            keystate = key;//本次key的值要成为“下一次的上一次”的值,放到keystate里
        }
    }
}

//在int1引脚上接了个按钮(另一端接地)吧?按一下就产生一个下降沿,引起一次外部中断1
void intersvr1(void) interrupt 2 using 1 //这是外部中断1的中断服务函数
{
    key=!key; //每中断一次(对应按一下那个按钮),key的值就取反变化
}

//注意书写格式,有规律的缩进非常重要,代码看起来就清爽了,虽然要多敲几下键,但是“手指头累点,脑袋就轻松多了!”

使用特权

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

本版积分规则

4

主题

16

帖子

1

粉丝