打印

关于keilC编程时遇到的奇怪问题

[复制链接]
2108|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happywxg|  楼主 | 2009-3-26 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序要实现的目的:上位机发送的3个字符能在1602上显示。
程序如下:
顶层文件:
#include "reg52.h"
#include "string.h"
#include"lcd1602.h"

//#include "mscom.h"

#define uint unsigned int
#define uchar unsigned char

uchar code  LCD1[]={"StepMotorContorl:"};
uchar code  LCD2[]={"Speed:"};
unsigned int  LCD3[];    
unsigned int  re_dat[3];

unsigned int count;
unsigned char temp0,temp1,temp2;
unsigned int speed;
 
//*****************************************
//      电机初始化  
//*****************************************
/*
void init()
{
    RE=0;
    HA=1;  // 整部 
    CW=1;  // 正传 
    EN=1;  // 电机使能 
    CON=0; // 电机绕组限流控制 
    CL=1;
    RE=1;
}
*/
//*****************************************
//      串口初始化  
//*****************************************
void init_serialcomm(void)        
{
    SCON  = 0x50;       //确定串口控制:方式1(10位异步收发,波特率由定时器1控制),允许串口接收
    TMOD  = TMOD|0x20;  //确定定时器1的工作方式:方式2(常数自动装如的8位T/C,TH寄存8位初值,TL进行8位计数)
    PCON  = 0x80;       //串口波特率加倍位SMOD=1 
    TH1   = 0xf3;       //计算装入初始值使波特率=4800(fosc=12MHz )       
    TL1   = 0xf3;
    TR1   = 1;          //启动定时器1                                    
    IE    = 0x9A;       //串口在中断方式工作时,开CPU和源中断            

}

//*****************************************
//        LCD1602初始化                                                             
//*****************************************
void LCD_Init(void)
{
    
    WriteOrder(0X01);        // clear display 
    WriteOrder(0x38);       //两行显示     
    WriteOrder(0x0C);        // open display 
    WriteOrder(0x06);       //set the way of input :AC++ 

    
}

//*****************************************
//        串口中断                                                      
//*****************************************

void serial () interrupt 4
{

    if(RI)
       {
             re_dat[count]=SBUF;
             RI=0;
         
             count++;
       }
     
}

//*****************************************
//        主程序 
//*****************************************

void main()
{
    delayms(10);
    init_serialcomm();
    
    
    LCD_Init();    
    WriteData(0,0,LCD1);
    WriteData(1,0,LCD2);
    WriteData(1,6,"0");
    WriteData(1,10,"r/min");
    while(1)
    {    
        count=0;
        while(RI==0);
        //comm_re();
        
    
     WriteDat(2,49);
        

      }
}

1602显示程序:
#include"reg52.h"
#include "string.h"
#include"lcd1602.h"
#define uint unsigned int
#define uchar unsigned char

//*************************************
//        延时程序          
//*************************************
void delayms(uint t)
{
    uint i;
    while(t--)
    {
        for(i=0;i<100;i++);
    }
}
//*************************************
//       LCD1602 判忙函数
//*************************************
Is_busy()
{
    rs=1;
    rw=0;
    en=0;
    LCD_Data=0xff;
    rs=0;
    rw=1;
    en=0;
    delayms(10);
    en=1;
    while(busy);

}
//************************************
//        写命令           
//************************************
void WriteOrder(uchar Order)
{

    rs=0;
    rw=0;
    en=0;
    delayms(10);
    en=1;
    LCD_Data=Order;

}
//************************************
//        写字符串 
//************************************
void WriteData(uchar y,uchar x,unsigned char LcdData[])
{
    uchar j,len;
    len= strlen (LcdData);
    if(0==y) 
    {
        WriteOrder(x+0x80);
    }
    else
    { 
        WriteOrder(x+0xC0);    
    }
    
    rs=0;
    rw=0;
    en=0;
    delayms(10);
    en=1;
    for(j=0;j<len;j++)
    {
        LCD_Data=LcdData[j];
        Is_busy();
        en=1;
    }
        
}    

//**************************************
//        写数字 
//**************************************
void WriteDat(unsigned char x,unsigned char dat)
{
      //LCD_Data=0x00;
      WriteOrder(x+0xC0);
       Is_busy();
      rs=0;
      rw=0;
      en=0;
      delayms(10);
      en=1;
      LCD_Data=dat;
     
      en=1;
      delayms(10);
      en=0;
      rs=0;
      rw=1;

}

现在遇到的问题是:顶层文件有串口中断函数的嘛,1602初始化不显示,但是把中断函数给注释掉,1602初始化显示正常。
实在是显不出为什么,调了一星期了,没有进展。。。

相关帖子

沙发
asyahe| | 2009-3-27 20:00 | 只看该作者

会不会是因为一直在发生中断?

使用特权

评论回复
板凳
happywxg|  楼主 | 2009-3-27 21:28 | 只看该作者

但是初始化的时候给RI清零了啊

但是我单独调试串口的时候用的就是串口中断,就可以的。
我感觉不会一直发生中断啊??我初始化的时候给RI清0了啊?为什么还发生中断呢??

使用特权

评论回复
地板
李冬发| | 2009-3-28 09:57 | 只看该作者

count没初始化,count也不能无限增长啊。

还有:
while(RI==0);
之类的还是不用为好啊,至少得有个"超时"吧。

使用特权

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

本版积分规则

70

主题

136

帖子

0

粉丝