智能车制作

标题: 脉冲累加器加nokia5110显示, PACNT值为0 [打印本页]

作者: 武狂狼    时间: 2014-5-6 23:23
标题: 脉冲累加器加nokia5110显示, PACNT值为0
用脉冲累加器和编码器测速(用的PIT中断),但加上Nokia5110之后 PACNT的值一直为0,不知为什么,不加显示一切正常。请教大神!
不加显示程序,一切正常;加上显示程序下载进去运行后示波器也没波形了

下面是程序



#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "Nokia5110ForXS128.h"
#define uint unsigned int
#define uchar unsigned char

//unsigned char CarCount = 0;
int count_L=0;

void main(void)
{


     
  // uint Dis;
//   uint Ds;

  
// PIT_Init_Flag=0;
    DisableInterrupts;
     
;
  PLL_Init();
  PORT_Init();
        LCD_Init(); //初始化  
        PACNT_init();
                EnableInterrupts;
                                    /*
    LCD_Write_String(0,0,"距离noin)mm");

    LCD_Write_String(0,2,"Motorspeed:");

    LCD_Write_String(0,4,"Smart Car12345");
  

                                       */


   
   

  for(;;)
  {
     /*
  
     if(PIT_Init_Flag)
      {
        Dis=count_L/100;
        LCD_Write_Num(20,3,Dis,4);
        Ds=count_L;
        LCD_Write_Num(0,5,Ds,5);
        PIT_Init_Flag=0;
      
      }      */
    }  
  
  
  
  
  
  
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT_ISR()
{
  PITTF_PTF0=1;         // 清中断


  //   if(CarCount==0)
    {
         
  /*----------------*左轮测速*----------------*/

      count_L=PACNTL;
      PACNT=0x0000;
    //  PIT_Init_Flag=1;
    }
//      CarCount++;
//    if(CarCount==5)
//      CarCount = 0;  
   
}
#pragma CODE_SEG DEFAULT


子程序"Nokia5110ForXS128.h"

#ifndef _Nokia5110_H
#define _Nokia5110_H

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "WordLib.h"

//宏定义
#define LCD_RST  PORTA_PA0
#define LCD_CE   PORTA_PA1
#define LCD_DC   PORTA_PA2
#define SDIN     PORTA_PA3
#define SCLK     PORTA_PA4

//函数声明
void PLL_Init(void);
void PORT_Init(void);
void Delay_ms(uint);
void Delay_us(uint);
void PIT_Init(void);
//void Pulse_accumulator_Init(void);
void PACNT_init();


void LCD_Init(void);
void LCD_clear(void);
void LCD_write_byte(uchar, uchar);
void LCD_set_XY(uchar , uchar );      
void LCD_write_char(uchar );
void LCD_Write_Char(uchar ,uchar ,uchar);
void LCD_Write_Num(uchar ,uchar ,uint,uchar);
void LCD_write_english_string(uchar ,uchar ,char *);
void LCD_write_chinese(uchar , uchar , char *);
void LCD_write_chinese_string(uchar , uchar ,char *);
void LCD_Write_String(uchar , uchar ,char *);
void LCD_draw_bmp_pixel(uchar ,uchar ,uchar *, uchar ,uchar );



//*********时钟初始化******//  
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{                   //锁相环时钟=2×16×(3+1)/(1+1)=64MHz
  CLKSEL=0;        
  PLLCTL_PLLON=1;
  REFDV=0x81;       //REFDV=1//BUS CLOCK=32MHz
  SYNR=0x43;       //SYNDIV=3
  _asm(nop);
  _asm(nop);
  while(CRGFLG_LOCK!=1)
// POSTDIV=0;
  CLKSEL_PLLSEL=1;       //选定锁相环时钟
}

//*********IO口初始化******//
void PORT_init(void)
{
  DDRA=0xff;          //A口输出   Nokia5110
//  DDRT=0X80;
// DDRB=0XFF;
}

/******延时ms******/
void Delay_ms(uint mt)    //BusClock=32MHz
{
  uint mx,my;
  for(mx=7800;mx>0;mx--)
    for(my=mt;my>0;my--);
}         

/******延时us******/
void Delay_us(uint ut)   //BusClock=32MHz
{
  uint ux,uy;
  for(ux=0;ux<=8;ux++)
     for(uy=ut;uy>0;uy--);
}



/*----------------*脉冲累加器初始化*----------------*/

void PACN_Init()
{
  PACTL=0x50;
  PACNT=0;
}

/*---------------------*定时器初始化*---------------------*/

void PIT_Init()
{
  PITCFLMT=0x00;           // 禁止PIT模块
//  PITTF_PTF0=1;            // 清中断标志
  
  PITCE_PCE0=1;            // 使能定时器通道0   
  
  PITMUX=0x00;             // 设置定时器通道0使用8位微定时器0
  PITMTLD0=250-1;          // 设置8位微定时器初值
  PITLD0=320-1;           // 设置16位定时器初值
                           // 定时周期=(PITMTLD0+1)(PITLD+1)/Fbus=1ms
                           
  PITINTE=0x01;            // 开定时器通道0中断
  PITCFLMT=0x80;           // 使能PIT模块
}








/**********************************************************************
* 函数名称:LCD_Init()               
* 函数功能:初始化nokia5110
* 入口参数:无
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Init(void)
  {           
    LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲
    Delay_us(1);
    LCD_RST = 1;
    LCD_CE = 0;// 关闭LCD  
    Delay_us(1);               
    LCD_CE = 1;// 使能LCD
    Delay_us(1);
    LCD_write_byte(0x21, 0);        // 使用扩展命令设置LCD模式
    LCD_write_byte(0xc8, 0);        // 设置偏置电压
    LCD_write_byte(0x06, 0);        // 温度校正
    LCD_write_byte(0x13, 0);        // 1:48
    LCD_write_byte(0x20, 0);        // 使用基本命令
    LCD_clear();                    // 清屏
    LCD_write_byte(0x0c, 0);        // 设定显示模式,正常显示        
    LCD_CE = 0;               // 关闭LCD  
  }
  
/**********************************************************************
* 函数名称:LCD_clear()               
* 函数功能:液晶清屏
* 入口参数:无
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_clear(void)
  {
    uint i;
    LCD_write_byte(0x0c, 0);                       
    LCD_write_byte(0x80, 0);       
    for (i=0; i<504; i++)
      LCD_write_byte(0, 1);                       
  }
  
/**********************************************************************
* 函数名称:LCD_write_byte()
* 函数功能:写一个字节
* 入口参数:data,要写入的字节;command:0为命令,1为数据
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_byte(uchar data, uchar command)
{
  uchar i;   
  LCD_CE = 0;   
  if (command == 0)     
   LCD_DC = 0;
  else   
   LCD_DC = 1;
        for(i=0;i<8;i++)
        {
                if(data&0x80)
                        SDIN = 1;
                else
                        SDIN = 0;
                SCLK = 0;
                data= data<< 1;
                SCLK = 1;
        }   
   LCD_CE = 1;
}

/**********************************************************************
* 函数名称:LCD_set_XY()
* 函数功能:光标定位x行y列
* 入口参数:X,Y   x行y列
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_set_XY(uchar X, uchar Y)
  {
    LCD_write_byte(0x40 | Y, 0);                // column
    LCD_write_byte(0x80 | X, 0);        // row
  }
  
/***********************************************************************
* 函数名称:LCD_write_char()
* 函数功能:写入1个字符
* 入口参数:c   要写入的数据
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_write_char(uchar c)
  {
    uchar line;
    c -= 32;
    for (line=0; line<6; line++)
      LCD_write_byte(font6x8[c][line], 1);//从ACSII码表中读取字节,然后写入液晶
  }
  
/***********************************************************************
* 函数名称:LCD_Write_Char()
* 函数功能:写入1个字符
* 入口参数:X:行;Y:列;asc:要写入的数据
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Write_Char(uchar X,uchar Y,uchar asc)
{
  uchar line;
  LCD_set_XY(X,Y);//光标定位
// if((asc>=0)&&(asc<=9))
//   asc = asc+16;
// else
    asc = asc-32;
  for (line=0; line<6; line++)
    LCD_write_byte(font6x8[asc][line], 1);//从ACSII码表中读取字节,然后写入液晶
}

/***********************************************************************
* 函数名称:LCD_Write_Num()
* 函数功能:显示变亮
* 入口参数:X:行;Y:列;num:变量;N:要显示的变量的位数
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Write_Num(uchar X,uchar Y,uint num,uchar N)
{
  uchar line;
  uchar i=0;
  uint n[5]={0};
  n[0]= num%10;
  n[1]=(num/10)%10;
  n[2]=(num/100)%10;
  n[3]=(num/1000)%10;
  n[4]=(num/10000)%10;
  for(i=0;i<5;i++) n[i]=n[i]+16;
  for(i=N;i>0;i--)
  {
    LCD_set_XY(X+(N-i)*6,Y);//光标定位
    for (line=0; line<6; line++)
      LCD_write_byte(font6x8[n[i-1]][line], 1);//从ACSII码表中读取字节,然后写入液晶
  }
}


/***********************************************************************
* 函数名称?LCD_write_english_string()
* 函数功能:写英文字符串
* 入口参数:X,Y,*S------x行y列*s为英文字符串
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_english_string(uchar X,uchar Y,char *s)
  {
    LCD_set_XY(X,Y);//光标定位
    while (*s)
    {
           LCD_write_char(*s);
           s++;
    }
  }

/**********************************************************************
* 函数名称:LCD_write_chinesee()
* 函数功能:写一个汉字
* 入口参数:x,横坐标;y,纵坐标;hz,要显示的汉字
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_write_chinese(uchar x, uchar y, char *hz)
{  
   uchar k,i;
   for(k=0;k<sizeof(GB_12)/sizeof(GB_12[0]);k++)//查找汉字编码表中的汉字
     {
        if((hz[0]==GB_12[k].Index[0])&&(hz[1]==GB_12[k].Index[1]))
        break;
     }
  LCD_set_XY(x,y); //光标定位
  for(i=0;i<12;i++)//先写上半字节
  LCD_write_byte(GB_12[k].Msk[i],1);
  LCD_set_XY(x,y+1);//光标定位下一行
  for(i=12;i<24;i++)//后写下半字节
  LCD_write_byte(GB_12[k].Msk[i],1);
}

/***********************************************************************
* 函数名称: LCD_write_chinese_sring()
* 函数功能:写汉字串
* 入口参数:x,横坐标;y,纵坐标;string,要显示的汉字串
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_chinese_string(uchar x, uchar y,char *string)
{
  uchar i=0,j=0,k=0;
  while(string[i])
  {
      LCD_write_chinese(x,y,&string[i]);
      x=x+12;
      i=i+2;
  }
}

/***********************************************************************
* 函数名称: LCD_Write_String()
* 函数功能:写字符串(中英文)
* 入口参数:x,横坐标;y,纵坐标;String,要显示的字符串
* 出口参数:无
* 修改人  :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_Write_String(uchar x, uchar y,char *string)
{
  uchar i=0,j=0,k=0,xh=0,yh=0;
  uchar kk,ii;
  char *cc,hz[2]={0};
  xh=x,yh=y;
  while(string[i])
  {
     for(kk=0;kk<sizeof(GB_12)/sizeof(GB_12[0]);kk++)//查找汉字编码表中的汉字
     {
      if((string[i]==GB_12[kk].Index[0])&&(string[i+1]==GB_12[kk].Index[1]))
       {
          LCD_set_XY(xh+i*6,yh); //光标定位
          for(ii=0;ii<12;ii++)//先写上半字节
          LCD_write_byte(GB_12[kk].Msk[ii],1);
          LCD_set_XY(xh+i*6,yh+1);//光标定位下一行
          for(ii=12;ii<24;ii++)//后写下半字节
          LCD_write_byte(GB_12[kk].Msk[ii],1);
          i=i+2;
       }
      else if((string[i]>=32)&&(string[i]<=121))
       {
          cc=&string[i];
          LCD_set_XY(x+i*6,y);
          LCD_write_char(*cc);
          i=i+1;
       }        
     }   
  }   
}

/***********************************************************
*函数名称:LCD_draw_bmp_pixel
*函数功能:位图绘制函数
*入口参数:X、Y    :位图绘制的起始X、Y坐标;
           *map    :位图点阵数据;
           Pix_x   :位图像素(长)
           Pix_y   :位图像素(宽)
*出口参数:无
*修改人  :BDC
*修改时间:2011/08/04
*备 注:
***********************************************************/
void LCD_draw_bmp_pixel(uchar X,uchar Y,uchar *map, uchar Pix_x,uchar Pix_y)
{
    uint i,n;
    uchar row;
                                                        //计算位图所占行数
      if (Pix_y%8==0)                 //如果为位图所占行数为整数
             row=Pix_y/8;      
      else
         row=Pix_y/8+1;                //如果为位图所占行数不是整数
   
        LCD_set_XY(X,Y);
    for (n=0;n<row;n++)                //换行
      {       
        for(i=0;i<ix_x;i++)
          {       
                     LCD_set_XY(X+i,Y+n);
             LCD_write_byte(map[i+n*Pix_x], 1);
          }                        
      }      
}



#endif



作者: 恋May    时间: 2014-5-7 12:40
没必要贴这么多代码,把关键部分贴出来就好。
作者: 武狂狼    时间: 2014-5-11 18:06
呵呵,找不到关键部分,显示正常。没有显示,脉冲累加单独使用正常,加上显示后脉冲累加就读不出数了……
作者: 武狂狼    时间: 2014-5-11 18:07
恋May 发表于 2014-5-7 12:40
没必要贴这么多代码,把关键部分贴出来就好。

呵呵,找不到关键部分,显示正常。没有显示,脉冲累加单独使用正常,加上显示后脉冲累加就读不出数了……
作者: 武狂狼    时间: 2014-5-16 00:16
问题解决了!函数初始化和IO口设置没弄好




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2