打印

此程序出错在哪里呢?

[复制链接]
3541|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 luo101luo 于 2009-8-31 23:15 编辑

#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
void mDelay(unsigned int DelayTime)
{   unsigned int j=0;
     for(;DelayTime>0;DelayTime--)
{  for(j=0;j<125;j++)
  {;} }}
uchar Key()
{ uchar KeyV;
uchar tmp;
P3=P3|0x3c;
KeyV=P3;
if((KeyV|0x3c )==0xff)
  return(0);
mDelay(10);
KeyV=P3;
if((KeyV|0x3c )==0xff)
  return(0);
else
{ for(;;)
{ tmp=P3;
  if((tmp|0xc3)==0xff)
   break;}
  return(KeyV);}  }
void main()
{ unsigned char OutData=0xfe;
bit UpDown=0;
bit Start=0;
uchar KValue;
for(;;)
{ KValue=Key();
  switch(KValue)
  { case 0xfb:
   { Start=1;
    break;}
   case 0xf7:
   { Start=0;
    break;}
   case 0xef:
   { UpDown=1;
    break;}
   case 0xdf:
   { UpDown=0;
    break;}
  }
if(Start)
{ if(UpDown)
OutData=_crol_(OutData,1);
else
OutData=_cror_(OutData,1);
}
else
P1=0xff;
mDelay(1000);
}
}
硬件电路描述如下:89S51单片机的P1口接有8个LED,当某一端口输出为“0”时,相应的LED点亮,P3.2、P3.3、P3.4、P3.5分别接有四个按钮K1~K4,按下按钮时,相应的引脚接地。现要求编写可键控的流水灯程序,当K1按下时,开始流动,K2按下时停止流动,全部灯灭,K3使灯由上往下流动,K4使灯由下入上流动。
此图为调试出现的错误
红色部分为什么出现两次

相关帖子

沙发
luo101luo|  楼主 | 2009-8-31 23:12 | 只看该作者

keil调试出现的错误对话框

本帖最后由 luo101luo 于 2009-8-31 23:16 编辑

EXAM4.C(58): error C100: unprintable character 0xA3 skipped
EXAM4.C(58): error C100: unprintable character 0xA8 skipped
EXAM4.C(58): error C100: unprintable character 0xA3 skipped
EXAM4.C(58): error C100: unprintable character 0xA9 skipped

使用特权

评论回复
板凳
luo101luo|  楼主 | 2009-8-31 23:12 | 只看该作者
Keil调试出现的错误对话框

使用特权

评论回复
地板
jerkoh| | 2009-8-31 23:42 | 只看该作者
这是编译的窗口吧

不是调试的对话框!

我复制 黏贴了你代码 编译完全正确!

你试下 在红色的错误 语句 那 加//可能有字显示出来

彻底删除该行,重输入该行

可能有一些  中文字体在那行 隐藏了起来

使用特权

评论回复
5
luo101luo|  楼主 | 2009-9-1 00:18 | 只看该作者
这个玩笑开大了吧!程序调试框中的程序是我自己写的,怎么可能有字出现呢?
请解释一下编译窗出错是什么意思?

使用特权

评论回复
6
luo101luo|  楼主 | 2009-9-1 00:19 | 只看该作者
况且再次验证,确实没有字的出现!

使用特权

评论回复
7
soler_z| | 2009-9-1 03:15 | 只看该作者
明天帮你看吧,没加注释,有点晕,^_^。
你的编译可以通过,但是放到我proteus仿真电路上不好使,显示不出来。
看了一下你的代码占用code小好多,明天来仔细研究下你的吧。
先贴我的吧。。。
#include <REGX51.H>
#include <intrins.h>
#define KEY_1 P3_2  //开始流动
#define KEY_2 P3_3  //停止流动,并全熄灭
#define KEY_3 P3_4  //从上往下流动
#define KEY_4 P3_5  //从下往上流动
#define crol _crol_
#define cror _cror_
static unsigned char status = 0;
unsigned char index = 0;
unsigned char lightRun[10] = {0xFE,0XFB,0X7F,0XC7,0X12,0X7F,0XFB,0X9D,0X5D,0X3F}; //开关1合上后按此表滚动
void delay(void); //延时
void directRun(void); //决定方向。

void main(void)
{
        unsigned char start;
        unsigned char i = 150;
        TCON = (TCON & 0X00) | 0X00; //开外部中断1
        IE = 0X84;                                          
        PX1 = 1;
        start = 0xFE; //显示状态初始化
        while(KEY_1 != 0); //等待开关1合上
        while(1)
        {
                directRun();
                P1 = status;
                while(i--)
                        delay();       
        }       
}

void delay(void)  //延时50ms
{
        TMOD = (TMOD & 0X0F) | 0X01;
        TL0 = (-50000)%256;
        TH0 = (-50000)/256;
        TR0 = 1;
        while(TF0 != 1);
        TR0 = 0;
}

void directRun(void)
{
        if(KEY_1 == 0 && KEY_3 != 0 && KEY_4 != 0) //仅仅按下开关1,按表循环显示。
        {
                status = lightRun[index++];
                if(index >= 10)
                        index = 0;
        }
        if(KEY_3 == 0 && KEY_4 != 0)   //合上开关3,向下移动
                status = crol(status, 1);
        if(KEY_4 == 0 && KEY_3 != 0)   //合上开关4,向下移动
                status = cror(status, 1);
}

void intx1intr(void) interrupt 2  //合上开关2,全部灯灭,等待按下开关1启动。
{
        P1 = 0XFF;
        while(KEY_1 != 0);
        P1 = status;
}

使用特权

评论回复
8
jerkoh| | 2009-9-1 08:45 | 只看该作者
提示的很明显 有keil 不认识的字符

使用特权

评论回复
9
tjx727| | 2009-9-1 09:15 | 只看该作者
建议楼主先把程序写得规范点,然后再发上来,这样看着头很晕

使用特权

评论回复
10
hightech929| | 2009-9-1 11:01 | 只看该作者
2# luo101luo


楼主在输入程序的时候敲进了一些编辑工具无法显示的ASCII码,虽然你无法看到,但是编译程序是会读入那些ASCII码的,所以编译程序会报错。

使用特权

评论回复
11
luo101luo|  楼主 | 2009-9-1 20:20 | 只看该作者
终于通过了,复制到记事本上看了看,确实有一些字符“(”,现在好了已经通过了,但是仿真没有做出来。灌入程序,不管按键是否按下流水灯都在闪。不听指挥了,

使用特权

评论回复
12
luo101luo|  楼主 | 2009-9-1 20:22 | 只看该作者
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
void mDelay(unsigned int DelayTime)
{
        unsigned int j=0;
            for(;DelayTime>0;DelayTime--)
        {        for(j=0;j<125;j++)
                {;} }
}
uchar Key()
{        
        uchar KeyV;
        uchar tmp;
        P3=P3|0x3c; //四个按键所接位置
        KeyV=P3;
        if((KeyV|0x3c)==0xff) //无键按下
        return(0);        
        mDelay(10); //延时,去键抖
        KeyV=P3;  
        if((KeyV|0x3c)==0xff)
        return(0);
        else
        {        for(;;)
        {        tmp=P3;
                if((tmp|0xc3)==0xff)
                break;}
                return(KeyV);}         
}
void main()
{        
        unsigned char OutData=0xfe;
        bit UpDown=0;
        bit Start=0;
        uchar KValue;
        for(;;)
        {        KValue=Key();
                switch(KValue)
                {        case 0xfb: //P3.2=0,Start
                        {        Start=1;
                                break;}
                        case 0xf7: //P3.3=0,Stop
                        {        Start=0;
                                break;}
                        case 0xef:
                        {        UpDown=1; //P3.4=0,UP
                                break;}
                        case 0xdf:
                        {        UpDown=0; //P3.5=0,Down
                                break;}
                }
if(Start)
{        

        if(UpDown)
        OutData=_crol_(OutData,1);
        else
        OutData=_cror_(OutData,1);
        P1=OutData;

}
else
        P1=0xff;  //否则全灭,
        mDelay(1000);
     }
}

使用特权

评论回复
13
luo101luo|  楼主 | 2009-9-1 20:24 | 只看该作者
KeyV=P3;
        if((KeyV|0x3c)==0xff) //无键按下
        return(0);        
        mDelay(10); //延时,去键抖
        KeyV=P3;  
        if((KeyV|0x3c)==0xff)
        return(0);

使用特权

评论回复
14
luo101luo|  楼主 | 2009-9-1 20:25 | 只看该作者
为什么这个要出现两次,既然无键按下,延时去键抖就OK了噻。此句没有弄明白,请解释,初学单片机,谢谢!

使用特权

评论回复
15
jiajia6254| | 2009-9-1 20:37 | 只看该作者
写代码的时候要有良好习惯,不要在中文和英文输入切换平凡,确定输入了英文字符。

使用特权

评论回复
16
FDLock| | 2009-9-2 13:50 | 只看该作者
===============================================================
       KeyV=P3;
        if((KeyV|0x3c)==0xff)    return(0);        

        mDelay(10); //延时,去键抖
        KeyV=P3;  
        if((KeyV|0x3c)==0xff)  return(0);
为什么这个要出现两次,既然无键按下,延时去键抖就OK了噻。此句没有弄明白,请解释,初学单片机,谢谢!
===============================================================

无按键按下时已经return(0)了.
检测到有按键 ==> 去抖==>  去抖后再判断按键是否按着, 如果没有按着, 就是假按键操作, 则return(0).
所以就出现两次判断了.

使用特权

评论回复
17
hightech929| | 2009-9-2 16:59 | 只看该作者
===============================================================
       KeyV=P3;
        if((KeyV|0x3c)==0xff)    return(0);        

        mDelay(10); //延时,去键抖
        KeyV=P3;  
        if((K ...
FDLock 发表于 2009-9-2 13:50



===============================================================
代码要写得规范些,就可以避免一些错误或者不理解程序的问题出在哪里。      
        KeyV = P3;
        if (0xff == (KeyV|0x3c))  
        {
             return(0);        
         }
        mDelay(10); //延时,去键抖
        KeyV = P3;  
        if (0xff == (KeyV|0x3c))  
        {
             return(0);
         }

使用特权

评论回复
18
luo101luo|  楼主 | 2009-9-2 23:12 | 只看该作者
哦`~明白了`~谢谢!各位的关注!

使用特权

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

本版积分规则

28

主题

107

帖子

0

粉丝