[求助] 求指导 这个程序430G2553与LCD1602管教应该怎么接

cc233cc   2014-5-16 17:42 楼主
#include  //引用头文件

#define  uchar unsigned char
#define  uint unsigned int

unsigned  char  LcdBuf2[]= {" zjunit "};//第二行要显示的内容
char a[32] ={0};
int da;
int j ;
double c,data;
void delay(long unsigned int time)
{
  while(time--);    //延时子程序
}

void  WriteCommandLcd(unsigned char wdata)//向1602液晶写入命令子程序;
{
   P1OUT&=~0x01;//RS清零,代表命令;  
   
   P1OUT&=~0x04;//使能E清零;
   delay(1000); //短暂延时,代替检测忙状态
   P1OUT|= 0x04;//使能E置1;
   P2OUT=wdata;//送出命令或数据
   delay(1000);//短暂延时,代替检测忙状态
   P1OUT&=~0x04;//使能E清零,下降沿将命令或数据送入1602;   
}

void  WriteDataLcd(unsigned  char wdata)//向1602液晶写入数据子程序;
{   
   P1OUT|= 0x01;//RS置1,代表数据
   P1OUT&=~0x04;//使能E清零;
   delay(1000); //短暂延时,代替检测忙状态
   P1OUT|= 0x04;//使能E置1;
   P2OUT=wdata;//送出命令或数据
   delay(1000);//短暂延时,代替检测忙状态
   P1OUT&=~0x04;//使能E清零,下降沿将命令或数据送入1602;
}

//LCD初始化
void  lcd_init(void)
{    P2OUT = 0x00;
     delay(1000);
     WriteCommandLcd(0x38);//显示模式设置,设置为16X2显示,5X7点阵,8位数据接口
     delay(1000);
     WriteCommandLcd(0x01); //显示清屏
     //WriteCommandLcd(0x0c); //开显示,关闭光标,当然光标也就不能显示了;(1)
     //WriteCommandLcd(0x0e); //开显示,显示光标,但是光标不闪烁;(2)
     WriteCommandLcd(0x0f); //开显示,显示光标,光标闪烁;(3)
     WriteCommandLcd(0x06); //读写操作时地址自动加1
}

/**************************************************
** 函数名称: display_xy
** 入口参数:x(unsigned  char型),y(unsigned  char型)
** 出口参数:无
** 功能描述: 设置光标位置, x是行号,y是列号
****************************************************/
void  display_xy(unsigned  char x,unsigned  char y)
{
    if(y==0x01)
        {
     x = x + 0x40 + 0x80;     
        }
        else
        {
    x = x+0x80;
        }
  WriteCommandLcd(x);
}

/*********************************************************************
** 函数名称: display_string
** 入口参数:x(unsigned  char型),y(unsigned  char型),s(指针型)
** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
void  display_string(unsigned  char x,unsigned  char y,unsigned  char *s)
{
  display_xy(x,y);
  while(*s)
  {
   WriteDataLcd(*s);
   s++;
  }
}


/***************************************
函数名称:Disp1Char
功    能:在某个位置显示一个字符
参    数:X-----位置的列坐标
          Y-----位置的行坐标
          data--显示的字符数据
返回值  :无
***************************************/
void Disp1Char(uchar x,uchar y,uchar data)
{
  display_xy(x,y);
  WriteDataLcd(data);
}


/***********************************在1602LCD上显示****************
                            ***********浮点数*********************/


void Disp_float(float f_data)        
{           
            unsigned char lcd_table[3];
            unsigned long aa;
            aa=f_data*1000;                  

            lcd_table[0]= aa/1000 ;               
            
            lcd_table[1]= aa/100%10;
            lcd_table[2]= aa%100/10 ;
            lcd_table[3]= aa%100%10 ;
            
            
                 Disp1Char(5,0,(lcd_table[0]+0x30)); //显示整数部分的十位数
                 Disp1Char(6,0,(lcd_table[1]+0x30));
                 Disp1Char(7,0,(lcd_table[2]+0x30));
                 Disp1Char(8,0,(lcd_table[3]+0x30));     //显示小数部分的个位
                                 //显示小数点"."
                  //显示小数部分的十分位
                                    //加上0x30以便直接得到相应的ASCII码去显示
}


int main(void)
{

  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P2SEL = 0x00;
  P2DIR = 0xff;//设置P4为输出状态
  P1DIR = 0xfd;//设置P5为输出状态
  P1OUT = 0x00;
  lcd_init();           //初始化子程序;
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE+REF2_5V ;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
          __enable_interrupt();                     // Enable interrupts.
          TACCR0 = 30;                              // Delay to allow Ref to settle
          TACCTL0 |= CCIE;                          // Compare-mode interrupt.
          TACTL = TASSEL_2 | MC_1;                  // TACLK = SMCLK, Up mode.
          LPM0;                                     // Wait for delay.
          TACCTL0 &= ~CCIE;                         // Disable timer Interrupt
          __disable_interrupt();

          ADC10CTL1 = INCH_1;                       // input A1
          ADC10AE0 |= 0x02;                         // PA.1 ADC option select

  while(1)
  {
   display_string(0,0,"VPP:"); //显示第一行,显示提示文字
   display_string(9,0,"mV");
   display_string(9,1,LcdBuf2);  //显示第二行,从第6个位置开始
   ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
                        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exi

                        da = ADC10MEM;display_string(9,1,LcdBuf2);  //显示第二行,从第6个位置开始
                        data = ((double)da/1024)*2.5;

                        c =data;
   Disp_float(c);  //显示第一行数据
    delay(1000);
   
  }
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
   __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
   TACTL = 0;
   LPM0_EXIT;                                // Exit LPM0 on return
}

回复评论 (1)

谁写的程序?

E->P1.3
RS->p1.0
RW接地
D0~D7接P2口
点赞  2014-5-16 18:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复