搜索

此程序出错在哪里呢?

[复制链接]
3286|17
luo101luo|  楼主 | 2009-8-31 23:11 | 显示全部楼层 |阅读模式
本帖最后由 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使灯由下入上流动。
出错情况.JPG 此图为调试出现的错误
红色部分为什么出现两次

相关帖子

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 | 显示全部楼层
这是编译的窗口吧

不是调试的对话框!

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

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

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

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

使用特权

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

使用特权

评论回复
luo101luo|  楼主 | 2009-9-1 00:19 | 显示全部楼层
况且再次验证,确实没有字的出现!

使用特权

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

  14. void main(void)
  15. {
  16.         unsigned char start;
  17.         unsigned char i = 150;
  18.         TCON = (TCON & 0X00) | 0X00; //开外部中断1
  19.         IE = 0X84;                                          
  20.         PX1 = 1;
  21.         start = 0xFE; //显示状态初始化
  22.         while(KEY_1 != 0); //等待开关1合上
  23.         while(1)
  24.         {
  25.                 directRun();
  26.                 P1 = status;
  27.                 while(i--)
  28.                         delay();       
  29.         }       
  30. }

  31. void delay(void)  //延时50ms
  32. {
  33.         TMOD = (TMOD & 0X0F) | 0X01;
  34.         TL0 = (-50000)%256;
  35.         TH0 = (-50000)/256;
  36.         TR0 = 1;
  37.         while(TF0 != 1);
  38.         TR0 = 0;
  39. }

  40. void directRun(void)
  41. {
  42.         if(KEY_1 == 0 && KEY_3 != 0 && KEY_4 != 0) //仅仅按下开关1,按表循环显示。
  43.         {
  44.                 status = lightRun[index++];
  45.                 if(index >= 10)
  46.                         index = 0;
  47.         }
  48.         if(KEY_3 == 0 && KEY_4 != 0)   //合上开关3,向下移动
  49.                 status = crol(status, 1);
  50.         if(KEY_4 == 0 && KEY_3 != 0)   //合上开关4,向下移动
  51.                 status = cror(status, 1);
  52. }

  53. void intx1intr(void) interrupt 2  //合上开关2,全部灯灭,等待按下开关1启动。
  54. {
  55.         P1 = 0XFF;
  56.         while(KEY_1 != 0);
  57.         P1 = status;
  58. }
复制代码

使用特权

评论回复
jerkoh| | 2009-9-1 08:45 | 显示全部楼层
提示的很明显 有keil 不认识的字符

使用特权

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

使用特权

评论回复
hightech929| | 2009-9-1 11:01 | 显示全部楼层
2# luo101luo


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

使用特权

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

使用特权

评论回复
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);
     }
}

使用特权

评论回复
luo101luo|  楼主 | 2009-9-1 20:24 | 显示全部楼层
KeyV=P3;
        if((KeyV|0x3c)==0xff) //无键按下
        return(0);        
        mDelay(10); //延时,去键抖
        KeyV=P3;  
        if((KeyV|0x3c)==0xff)
        return(0);

使用特权

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

使用特权

评论回复
jiajia6254| | 2009-9-1 20:37 | 显示全部楼层
写代码的时候要有良好习惯,不要在中文和英文输入切换平凡,确定输入了英文字符。

使用特权

评论回复
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).
所以就出现两次判断了.

使用特权

评论回复
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);
         }

使用特权

评论回复
luo101luo|  楼主 | 2009-9-2 23:12 | 显示全部楼层
哦`~明白了`~谢谢!各位的关注!

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥170.00
  • 2 小叶三千 得到打赏 ¥160.00
  • 3 最美葫芦娃 得到打赏 ¥155.00
  • 4 呐咯密密 得到打赏 ¥115.00
  • 5 hk386 得到打赏 ¥80.00
  • 6 laocuo1142 得到打赏 ¥80.00
  • 7 wzx1994 得到打赏 ¥60.00
  • 8 年轻的国王 得到打赏 ¥60.00
  • 9 jlc317 得到打赏 ¥55.00
  • 10 bjs1688 得到打赏 ¥55.00
在线客服 快速回复 返回顶部 返回列表