原创 msp430 && lcd1602 && adc0809系统的测试模块

2011-8-13 21:42 1416 5 5 分类: MCU/ 嵌入式

//*****************************ADC0809.c模块*********************

#include "msp430x54x.h"
#define OE    P3OUT|=BIT0   //OE = P3.0=1
#define ST    P3OUT|=BIT2     //ST=p3.2
//#define EOC   P3IN&BIT1    //EOC=p3.1
#define ALE   P3OUT|=BIT7    //ale=p3.7
//#define CLK   P2OUT|=BIT7   //clk=p2.7

#define OE_OFF    P3OUT&=~BIT0  
#define ST_OFF    P3OUT&=~BIT2    
#define ALE_OFF   P3OUT&=~BIT7   
 
void initial_time(void)
{
  TA1CTL=TASSEL1+TACLR;
  TA1CCTL0=CCIE;
  TA1CCR0=2;
  TA1CTL|=MC0;
 
  P2DIR=0;
  P2SEL=0;
  P2DIR|=BIT7;
}
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{
  if(P2OUT & BIT7) P2O &=~BIT7;
  else P2OUT |=BIT7;
}


void adc0809_io_set(void)
{
   P4DIR=0;               //transfer digital data in,D0~D7;
   P4SEL=0;               //normal io port;
  
   P3DIR=1;               //signal out
   P3SEL=0;               //normal io port;
   P3DIR|=~BIT1;         //ad0809's EOC signal into msp
    
   P2DIR=1;               //clock signal out
   P2SEL=0;
  
   P3DIR&=BIT4;         //A         ALE ADDR
   P3DIR&=BIT5;         //B         ""
   P3DIR&=BIT6;         //C         ""
  
   P3OUT|=~BIT4;        //always choose INT0  channel,ABC:000;
   P3OUT|=~BIT5;
   P3OUT|=~BIT6;
}

void adc0809_initial(void)
{
  ST_OFF;
  OE_OFF;
  ALE_OFF;
}

unsigned int single_adc0809(void)
{
  unsigned int res; 
 
  while(!(P2OUT & BIT7))
    ;
  ALE;
  _NOP();
  ST;
  ALE_OFF;
  _NOP();
  ST_OFF;
 
  while(!((P3IN&BIT1)==BIT1))
    ;
    OE;
    res=P4IN;
    OE_OFF;
  return res; 
}

//**********************************

//**********************************lcd1602液晶模块***************************

//===================================LCD.h头文件模块========================================
#include "msp430x54x.h"
#define DataDir     P9DIR             
#define DataPort    P9OUT 
//==============================================================================
#define Busy     0x80
//==============================================================================
#define CtrlDir     P8DIR
#define CLR_RS P8OUT&=~BIT7    //RS = P8.7 
#define SET_RS P8OUT|=BIT7 
//==============================================================================
#define CLR_RW P8OUT&=~BIT6 //RW = P8.6
#define SET_RW P8OUT|=BIT6 
//==============================================================================
#define CLR_EN P8OUT&=~BIT5 //EN = P8.5
#define SET_EN P8OUT|=BIT5 
//==============================================================================
#define         WRITE_BURST         0x40  //连续写入
#define  READ_SINGLE         0x80  //读
#define  READ_BURST          0xC0  //连续读
#define  BYTES_IN_RXFIFO     0x7F    //接收缓冲区的有效字节数
#define  CRC_OK              0x80   //CRC校验通过位标志

 

//********************************lcd.c子函数模块

#include "LCD.h"


//******************************************************************************
//系统初始化
//******************************************************************************
//void InitSys()
//{
//   unsigned int iq0;
//   _DINT();
//   BCSCTL1 &=~XT2OFF;
//   do
//   {
//      IFG1 &= ~OFIFG;           // 清除振荡器失效标志
//  for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
//   }
//   while ((IFG1 & OFIFG) != 0);  // 判断XT2是否起振  
//   BCSCTL2 =SELM0+SELS;                      //MCLK,SMCLK时钟为XT2
//}

//==============================================================================

void Delay5ms(void)
{
  int i,j;
  for(i=0;i<200;i++)
    for(j=0;j<100;j++)
      ;
}
void LCD_IO_set(void)
  {
    CtrlDir |= 0x07;                 //控制线端口设为输出状态
    DataDir  = 0xFF;                 //数据端口设为输出状态
    P5SEL=0x00;                    //设置P5为一般数字IO口  
    P6SEL&=0x8f;                  //设置P6为一般数字IO口 
  }
        
//========================等待1602液晶完成内部操作==============================
void WaitForEnable(void)
{
    P5DIR &= 0x00;  //将P5口切换为输入状态
    CLR_RS;
    SET_RW;
    _NOP();
    SET_EN;
    _NOP();
    _NOP();
    while((P5IN & Busy)!=0);  //检测忙标志
    CLR_EN;
    P5DIR |= 0xFF;  //将P5口切换为输出状态
}                  
//==========================向液晶模块写入命令==================================
//=================cmd--命令,chk--是否判忙的标志,1:判忙,0:不判=============
void LcdWriteCommand(char cmd,char chk)
{

    if (chk) WaitForEnable();   // 检测忙信号?
   
    CLR_RS; 
    CLR_RW;
    _NOP();

    DataPort = cmd;             //将命令字写入数据端口
    _NOP();     
   
    SET_EN;                     //产生使能脉冲信号
    _NOP();
    _NOP();
    CLR_EN;   
}
//=====================向液晶显示的当前地址写入显示数据=========================
void LcdWriteData(char data )
{
    WaitForEnable();        //等待液晶不忙
    SET_RS;
    CLR_RW;
    _NOP();
    DataPort = data;        //将显示数据写入数据端口
    _NOP();
    SET_EN;                 //产生使能脉冲信号
    _NOP();
    _NOP();
    CLR_EN;  
}
//==================向液晶输入显示字符位置的坐标信息============================
void LocateXY(char x,char y)
{
   char temp;
    x&= 0x01;
    temp = y&0x0f;
    if(x)   temp |= 0x40;  //如果在第2行
    temp |= 0x80;
    LcdWriteCommand(temp,0);
}
//==========================在某个位置显示一个字符==============================
//============x--位置的列坐标   y--位置的行坐标data--显示的字符数据=============
void DisoneChar(char x,char y,char data)
{
    LocateXY( x, y );   
    LcdWriteData( data );  
}
//==============================让液晶从某个位置起连续显示一个字符==============
//==============================y--位置的列坐标  x--位置的行坐标================
void DispStr(char x,char y,char *ptr)
{
   char *temp;
   char i,n = 0;
   
    temp = ptr;
    while(*ptr++ != '\0')   n++;    //计算字符串有效字符的个数
   
    for (i=0;i<n;i++)
    {
        DisoneChar(x++,y,temp);
        if (x == 0x0f)
        {
           x  = 0;
           y ^= 1;
        }
    }
}
//让液晶从某个位置起连续显示N个字符
void DispNChar(char x,char y,char n,char *ptr)
{
   char i;
   
    for (i=0;i<n;i++)
    {
        DisoneChar(x++,y,ptr);
        if (x == 0x0f)
        {
           x = 0;
           y ^= 1;
        }
    }
}
//========================对1602液晶模块进行复位操作============================
void LcdReset(void)
{
    LcdWriteCommand(0x38, 0);     //规定的复位操作
    Delay5ms();
    LcdWriteCommand(0x38, 0);  
    Delay5ms();
    LcdWriteCommand(0x38, 0);
    Delay5ms();
    LcdWriteCommand(0x38, 1);  //显示模式设置
    LcdWriteCommand(0x08, 1);  //显示关闭
    LcdWriteCommand(0x01, 1);         //显示清屏
    LcdWriteCommand(0x06, 1);  //写字符时整体不移动
    LcdWriteCommand(0x0c, 1);  //显示开,不开游标,不闪烁
  
}
//===================================lcd初始化
void Lcd_initial(void)
{
  LcdWriteCommand(0x38, 1);  //显示8位格式,2行,5x7
  LcdWriteCommand(0x0c, 1);  //显示开,不开游标,不闪烁
  LcdWriteCommand(0x06, 1);  //写字符时整体不移动
  LcdWriteCommand(0x01, 1);         //显示清屏
  //delay();                              //函数需要另外写40um
}


void Display(char temp[])
{
    char tishi[] = {"The gain is :"};
     //char Auto[]={"Auto"};
     //char Hand[]={"Hand"};
    
     DisoneChar(1,0,0x58) ;                               //第一排零号位显示字符
     DispNChar(1,0,12,tishi);
     DisoneChar(1,13,temp[0]) ;                           //第一排一号位显示字符
     DisoneChar(1,14,temp[1]) ;                           //第一排二号位显示字符
}

//*****************************非常简单的主函数*************************

 

//msp430 with adc0809 test programs
#include "ADC0809.c"
#include "BoardConfig.h"
#include "LCD.h"
#include "LCD.c"
#include "msp430x54x.h"

void main(void)
{
   unsigned int data,num[3];
   adc0809_io_set();
   LCD_IO_set;
   adc0809_initial();
   Lcd_initial();
  
   while(1)
   { 
     data=single_adc0809();
     num[0]=data/100;
     num[1]=data/10%10;
     num[2]=data%10;
    
     DisoneChar(1,0,0x58) ;                               //第一排零号位显示字符
   
     DisoneChar(1,0,num[0]) ;                           //第一排一号位显示字符
     DisoneChar(1,1,num[1]) ;                           //第一排二号位显示字符
     DisoneChar(1,2,num[2]) ;
   }
}


以上属于原创程序,希望有错误或者可以优化的地方细致指出,谢谢交流,也希望对你们有帮助!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /1 下一条