新闻  |   论坛  |   博客  |   在线研讨会
MSP430单通道多次采集12864显示
Capture | 2013-08-01 23:30:13    阅读:59692   发布文章

通过光敏电阻采样外界光强,通过12864显示采样电压值

作者:Capture

液晶12864显示程序

#include "12864.h"

/*************************************************
函数名称:void Read_busy(void)
函数功能:检测液晶是否忙碌,如果忙碌
          就不让MSC进行操作,直到液晶
          将内部处理完,才允许MSC进行
          操作
入口参数:无
出口参数:无
**************************************************/
void Read_busy(void)
{
    Dat_dir_out;
    RS_0;
    RW_1;
    EN_1;
    DelayUs(100);
    Dat_dir_in;
    while((Dat_in & 0X80) != 0);
}
/**************************************************
函数名称:void Write_com(uchar com)
函数功能:向液晶中写命令
入口参数:com 命令
出口参数:无
***************************************************/
void Write_com(uchar com)
{
    Read_busy();
    Dat_dir_out;
    RS_0;
    RW_0;
    EN_1;
    DelayUs(100);
    Dat_out = com;
    DelayUs(100);
    EN_0;   
}

/*************************************************
函数名称:void Write_dat(uchar dat)
函数功能:向液晶写数据
入口参数:dat 数据
出口参数:无
**************************************************/
void Write_dat(uchar dat)
{
     Read_busy();
     Dat_dir_out;
     RS_1;
     RW_0;
     EN_1;
     DelayUs(100);
     Dat_out = dat;
//   _NOP();_NOP();_NOP();
  DelayUs(100);
     EN_0;
}   
/**************************************************
函数名称:void Lcd_init(void)
函数功能:液晶初始化
入口参数:无
出口参数:无
***************************************************/
void Lcd_init(void)
{
    Write_com(0X30);
    Delay_ms(50);
    Write_com(0X01);
    Delay_ms(50);
    Write_com(0X02);
    Write_com(0X0C);
    Delay_ms(50);
}
/**************************************************
函数名称:void Clear_DDRAM(void)
函数功能:清除液晶屏幕上的字符和汉字(字符和汉字
          是液晶库里自带的,不是自定义的)
入口参数:无
出口参数:无
***************************************************/
void Clear_DDRAM(void)
{  
    Write_com(0x01);
}
/**************************************************
函数名称:set_position(uchar x,uchar y)
函数功能:汉字显示坐标位置
入口参数:X选择行;Y所在行的位置
出口参数:无
***************************************************/
void set_position(uchar x,uchar y)
{
 uchar postion;
 switch(x)
  {
  case 0 : x = 0x80;break;//第一行
  case 1 : x = 0x90;break;//第二行
  case 2 : x = 0x88;break;//第三行
  case 3 : x = 0x98;break;//第四行
  default:break; //如果传来的值不在以上范围之内则退出循环
  }
  postion = x + y;//显示位置
  Write_com(postion);//写入液晶
}

/**************************************************
函数名称: lcd_st(uchar *st)
函数功能: 显示字符串和汉字
入口参数: st
出口参数:无
***************************************************/
/*********显示字符串和汉字*******/
void lcd_st(uchar *st) 
{
while(*st != '\0')//如果判断一个汉字没结束时,则执行while语句
 {
 Write_dat(*st);
 st++;//每显示一个汉字,地址指针+1,以便显示下一个汉字
 }
}
/**************************************************
 * 函 数 名:LCD_WR_Num
 * 功能描述:液晶写入一个十进制数;
 * 输入参数:num:要写入的数
 * 返 回 值:无
***************************************************/
void LCD_WR_Num(uchar num)
{
   Write_dat(0x30 + num);

/*******************************************
函数名称:Draw_PM
功    能:在整个液晶屏幕上画图
参    数:无
返回值  :无
********************************************/
void Draw_PM(const uchar *ptr)
{
    uchar i,j,k;
   
 Write_com(0x34);        //打开扩展指令集
 i = 0x80;           
 for(j = 0;j < 32;j++)
 {
        Write_com(i++);
        Write_com(0x80);
    for(k = 0;k < 16;k++)
    {
         Write_dat(*ptr++);
    }
 }
 i = 0x80;
  for(j = 0;j < 32;j++)
 {
      Write_com(i++);
        Write_com(0x88);   
    for(k = 0;k < 16;k++)
    {
          Write_dat(*ptr++);
     }
 } 
    Write_com(0x36);        //打开绘图显示
 Write_com(0x30);        //回到基本指令集
}

/**********************************************
函数名称:void Clear_GDRAM(void)
函数功能:清除因液晶产生的随机数而产生的乱点
入口参数:无
出口参数:无
***********************************************/
void Clear_GDRAM(void)
{
    uchar i,j,k;
    Write_com(0X36);
    i = 0X80;
    for(j=0;j<32;j++)
    {
        Write_com(i++);
        Write_com(0X80);
        for(k=0;k<16;k++)
        {
            Write_dat(0X00);
        }
        DelayUs(10);
    }
    i = 0X80;
    for(j=0;j<32;j++)
    {
        Write_com(i++);
        Write_com(0X88);
        for(k=0;k<16;k++)
        {
            Write_dat(0X00);
        }
        DelayUs(10);
    }
    Write_com(0X30);
}

液晶显示头文件

#ifndef __12864_H__
#define __12864_H__

#include "MSP430x14x.h"
#include "delay.h"


#define  RS_1   (P3DIR |= BIT0,P3OUT |=  BIT0)
#define  RS_0   (P3DIR |= BIT0,P3OUT &= ~BIT0)

#define  RW_1   (P3DIR |= BIT1,P3OUT |=  BIT1)
#define  RW_0   (P3DIR |= BIT1,P3OUT &= ~BIT1)

#define  EN_1   (P3DIR |= BIT2,P3OUT |=  BIT2)
#define  EN_0   (P3DIR |= BIT2,P3OUT &= ~BIT2)

#define  Dat_dir_out  P4DIR |= 0xFF
#define  Dat_out      P4OUT

#define  Dat_dir_in   P4DIR &= 0x00
#define  Dat_in       P4IN

#define uchar unsigned char
#define uint  unsigned int

 

void Read_busy(void);
void Write_com(uchar com);
void Write_dat(uchar dat);
void Lcd_init(void);
void Clear_DDRAM(void);
void set_position(uchar x,uchar y);
void lcd_st(uchar *st);
void LCD_WR_Num(uchar num);
void Draw_PM(const uchar *ptr);
void Clear_GDRAM(void);
void LCDStartInterface1();

#endif

————————————————————————————

内部AD单通道多次采样

/*******************************************************************************
文件名称:ADC12.c
功能描述:ADC12单通道采样
*******************************************************************************/
#include "ADC12.h"

uchar Trans_FLAG;
unsigned long sum;
/*******************************************************************************
函数名称:Init_ADC  单通道
功    能:初始化ADC12
参    数:无      
返回值  :无
*******************************************************************************/
void Init_ADC(void)
{
   ADC12CTL0 &= ~ENC;      //改变设置前停止A/D转换
 P6SEL |= BIT0;                          // 使能ADC通道0
 
    ADC12CTL0 |= ADC12ON + MSC + SHT0_8;    // 打开ADC,允许多次采样转换
    ADC12CTL1 |= SHP + CONSEQ_2;            // 使用采样定时器,设置转换模式
    ADC12IE  = BIT0;                        // 使能ADC通道0中断
 ADC12MCTL0 |= INCH_0 + SREF_0 +EOS;  // 通道选择,参考电压选择
 
    ADC12CTL0 |= ENC + ADC12SC;             // 开AD转换
 
}

/*******************************************************************************
函数名称:ADC12ISR    单通道
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无      
返回值  :无
*******************************************************************************/
#pragma vector = ADC_VECTOR
__interrupt void ADC12ISR (void)
{
    static uint index = 0;
 static uint results[Num_of_Results];     //保存ADC转换结果的数组
 
    results[index++] = ADC12MEM0;               // 把结果存入数组
 
    ADC12CTL0 |= ADC12SC;                // 开始新一轮转换
 
    if(index == Num_of_Results)
    {
    index = 0;
  ADC12CTL0 &= ~ENC;      //停止转换
//        unsigned long sum = 0;
        for(uchar i=0; i < Num_of_Results; i++) //求和
        {
           sum += results[i];
        }
    for(uchar i=0; i < Num_of_Results; i++) //
        {
            results[i] = 0;
        }
        sum >>= 5;                            //除以32求平均

  Trans_FLAG = 1;
  
    }
 
}

/*******************************************************************************
函数名称:Trans_val     单通道
功    能:将16进制ADC转换数据变换成三位10进制
          真实的模拟电压数据,并在液晶上显示
    精确到毫伏
参    数:Hex_Val--16进制数据
          n--变换时的分母等于2的n次方      
返回值  :无
调用模块:
*******************************************************************************/
void Trans_val(uint Hex_Val)
{
    static unsigned long caltmp = 0;
 static uint volt_val = 0;   //当前电压

 
 /****************扩**大**1000**倍********************/
    caltmp = Hex_Val;
    caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33
    caltmp = (caltmp << 3) + (caltmp << 1);    //caltmp=caltmp * 10
 caltmp = (caltmp << 3) + (caltmp << 1);    //caltmp=caltmp * 10
    volt_val = caltmp >> 12;                    //volt_val = caltmp / 2^n
 
    Disp_Volt(volt_val);
 
 
}


/*******************************************************************************
函数名称:Disp_Volt
功    能:显示电压  
参    数:volt_val--电压值
    addr--地址
返回值  :无
*******************************************************************************/
void Disp_Volt(uint volt_val)
{  
 const uchar table[] = {"0123456789.mV "};
 uchar ptr[6];
 uchar volt[6];
 
   if(volt_val >= 100)
 {  
  ptr[0] = volt_val / 1000;                  
  ptr[2] = volt_val / 100 - volt_val / 1000 * 10;
  ptr[3] = volt_val / 10 - volt_val / 100 * 10;
  ptr[4] = volt_val - volt_val / 10 * 10;
  ptr[1] = 10;
  ptr[5] = 12;
 }
 else
 {
  ptr[0] = volt_val / 100;                  
  ptr[1] = volt_val / 10 - volt_val / 100 *10;
  ptr[2] = volt_val - volt_val / 10 * 10;
  ptr[3] = 11;
  ptr[4] = 12;
  ptr[5] = 13;
 }
 
 for(uchar i=0; i < 6; i++)     //保存10进制
 {
  volt[i]=table[ptr[i]];
 }
 Write_com(0x92);
 Write_dat(volt[0]);
 Delay_ms(20);
 Write_dat(volt[1]);
 Delay_ms(20);
 Write_dat(volt[2]);
 Delay_ms(20);
 Write_dat(volt[3]);
 Delay_ms(20);
 Write_dat(volt[4]);
 Delay_ms(20);
 Write_dat(volt[5]);
 Delay_ms(20);
}

 

AD采样头文件

 

#ifndef __ADC12_H__
#define __ADC12_H__

#include 
#include  "12864.h"

//typedef unsigned char uchar;
//typedef unsigned int  uint;
#define uchar unsigned char
#define uint unsigned int

#define   Num_of_Results   32   //采样次数


extern uchar Trans_FLAG;
extern unsigned long sum;
/************函数声明****************/
void Trans_val(uint Hex_Val);   //电压转换
void Init_ADC(void);
void Disp_Volt( uint volt_val);

#endif

 

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客