英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4373|回复: 0
打印 上一主题 下一主题

液晶显示A/D采样电压值,并将其显示在液晶上转

[复制链接]
跳转到指定楼层
1#
发表于 2012-8-21 14:29:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* ****************************************************************
** 功能描述: 液晶显示程序;用A/D采样电压值,并将其显示在液晶上
*************************************************************** */

#include "pic18.h"  /* 所有PIC18系列的头文件 */
const char shu[160]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,  //"0"
      0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,  //"1"
      0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,  //"2"
      0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,  //"3"
      0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,  //"4"
      0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,  //"5"
      0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,  //"6"
      0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,  //"7"
      0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,  //"8"
      0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,};  //"9"

const char d[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,} ;  //小数点
                                                                                                                                
const char mao[16]={0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,};  //"冒号"

const char dian[32]={0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
      0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,};  //"电"

const char ya[32]={0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
       0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,};  //"压"

char *ARRAY;
char ppp[34];
char i;

unsigned int  Adresult=0;    /* AD转换计算结果 */
unsigned long int  Ad_Sample_result=0; /* AD转换采样结果 */
unsigned char AD_Flag=0;    /* AD转换完成标志,=1有新的AD数据转换完成 */

/* **************************************************************
** 函 数 名: AD_Initial()
** 功能描述:A/D转化初始化子程序
****************************************************************** */
void AD_Initial()
{
INTCON=0X00;    /* 禁止总中断和外围中断 */
ADCON0=0x51;    /* 选择A/D通道为RA2,A/D转换器在工作状态,且使A/D转换时钟为8tosc */               
ADCON1=0X82;    /* 转换结果右移,及ADRESH寄存器的高6位为"0"且把RA2(AN2)设置 */
ADIF=0;        /* 清除A/D转换标志 */
ADIE=1;        /* A/D转换中断允许 */
ADIP=1;        /* AD中断高优先级 */
IPEN=1;        /* 使能中断优先级 */
TRISA=TRISA |0x04;   /* 设置RA2(AN2通道)为输入方式 */
}
/* **************************************************************
** 函 数 名: YJ_initial()
** 功能描述:液晶显示初始化子程序
****************************************************************** */
void YJ_initial()
{
CMCON=0x07;      /* 关比较器 */
ADCON1=0X07;    /* 设置数字输入输出口 */
INTCON=0X00;    /* 禁止总中断和外围中断 */  
WDTCON=0;     /* 清看门狗 */
TRISE=TRISE&0XF8;   /* 设置RE0,RE1,RE2为输出 */
TRISB=TRISB&0XFE;   /* 设置RB0为输出 */
    TRISA=TRISA&0XF7;   /* 设置RA3为输出 */

}
/* **************************************************************
** 函 数 名: Deal_AD()
** 功能描述:AD转换完成后处理数据子程序
****************************************************************** */
void Deal_AD()
{
unsigned  temp;
Ad_Sample_result=ADRESL+(ADRESH<<8); /* 读取并存储A/D转换结果(10位,高6位为0) */
AD_Flag=0;         /* AD转换完成标志清0 */

Adresult=(Ad_Sample_result*50)>>10;
/*将AD采样结果转换为以两位数表示的值,即放大10倍,乘以满该度值5V,除以满刻度转换值10位(1024)*/
temp=Adresult;
Adresult=(((temp/10)<<4)&0xf0)+(Adresult % 10);
/*转换为带一位小数的BCD码实际值如25表示2.5V,在实验板上将J13跳针插上,2通道采样口输入0-5V的直流电压*/

}
/* ****************************************************************
** 函 数 名: interrupt HI_ISR()
** 功能描述: 高优先级中断子程序:AD转换完成中断      
*************************************************************** */
void interrupt HI_ISR()
{
if(ADIF==1)      //AD转换完成
{
  ADIF=0;      //清除中断标志
  AD_Flag=1;    //置AD转换完成标志
}
}

/* ****************************************************************
** 函 数 名: DELAY()
** 功能描述: 软件延时子程序
*************************************************************** */
void DELAY()
{
unsigned  int  i;
for(i = 11535; i>0;i--)
    i=i;
}
/* ****************************************************************
** 函 数 名: LCDSTA1(int E)
** 功能描述: 读液晶显示器状态子程序,行参E代表液晶的边,用来查询液晶边是否处于空闲状态
*************************************************************** */
void LCDSTA1(int E)
{
int E1FLAG;
TRISD=0XFF;      /* 设置D口为输入 */
while(1)
{
  if(E==1)
  {
   PORTA=PORTA|0X08;  /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。*/
   PORTE=(PORTE|0X01)&0XF9;/* RE0/RW=1,RE1/DI=0,设置为读状态 */
  }
  else
  {
   PORTA=PORTA&0XF7;  /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
   PORTE=(PORTE|0X05)&0XFD;/* RE0/RW=1,RE1/DI=0,设置为读状态*/
  }
  PORTB=PORTB|0X01;   /* RB0/E=1 */
  E1FLAG=PORTD&0X80;   /* 取DB7的值 */
  PORTB=PORTB&0XFE;   /* RB0/E=0,先将E设置为1,让数据被读出,该指令用来查询液晶显示模块内部控制器的状态;
         之后又将E设置为0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
  if(E1FLAG==0X0000) break; /* 如果RD7=0,则处于正常工作状态,退出循环 */
}
}
/* ****************************************************************
** 函 数 名: TRANS1(int TRANS,int E)
** 功能描述: 对液晶显示器发指令子程序,行参E代表处理的液晶的边,可以设置行和页。当RE0/RW=0,RE1/DI=0时,DB7=1,DB6=1,
    设置了对应液晶屏最上一行的显示RAM 的行号;DB7=1,DB6=0, 设置页值。
*************************************************************** */
void TRANS1(int TRANS,int E)
{
TRISD=0X00;         /* RD为输出 */
if(E==1)      /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。*/
{
  PORTA=PORTA|0X08;   
  PORTE=PORTE&0XF8;   /* RE0/RW=0,RE1/DI=0 */
}
else       /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
{
  PORTA=PORTA&0xF7;
  PORTE=(PORTE|0X04)&0XFC; /* RE0/RW=0,RE1/DI=0 */
}
PORTD=TRANS;     /* 将所需要的行值或页值赋值给D口 */
PORTB=PORTB|0X01;    /* RB0/E=1,让数据被读出 */
PORTB=PORTB&0XFE;    /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */  
}
/* ****************************************************************
** 函 数 名: WRITE1(char WRITE,int CLMADD,int E)
** 功能描述: 对液晶显示器写数据子程序
*************************************************************** */
void WRITE1(char WRITE,int CLMADD,int E)
{
TRANS1(CLMADD,E);       /* 设置列地址 */
TRISD=0X00;      /* RD为输出 */
if(E==1)      /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。RE0/RW=0,RE1/DI=1,写数据指令 */
{
  PORTA=PORTA|0X08;
  PORTE=(PORTE|0X02)&0xFA;
}
else       /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。RE0/RW=0,RE1/DI=1,写数据指令 */
{
  PORTA=PORTA&0xF7;
  PORTE=(PORTE|0X06)&0xFE;
}
PORTD=WRITE;     /* 将要写入数据赋值 */
PORTB=PORTB|0X01;    /* RB0/E=1,让数据被读出 */
PORTB=PORTB&0XFE;    /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
}
/* ****************************************************************
** 函 数 名: DISP1(int E)
** 功能描述: 开E边显示子程序,用于检查液晶显示是否被打开
*************************************************************** */
void DISP1(int E)
{
int E1FLAG;
while(1)
{
  TRANS1(0X03F,E);    /* 送出控制命令,LED显示RAM中的内容 */
      LCDSTA1(E);      /* 判断液晶是否为空闲状态 */
  TRISD=0XFF;        /* 设置D口为输入 */
  if(E==1)      /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。 */
  {
   PORTA=PORTA|0X08;
   PORTE=(PORTE|0X01)&0xF9;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
  }
  else       /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
  {
   PORTA=PORTA&0xF7;
   PORTE=(PORTE|0X05)&0xFD;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
  }
PORTB=PORTB|0X01;     /* RB0/E=1,让数据被读出 */
E1FLAG=PORTD&0X20;     /* 取RD5的值 */
PORTB=PORTB&0XFE;     /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
if(E1FLAG==0X00)break;   /* 如果RD5=0,则表示液晶显示被打开,退出循环,否则继续打开 */
}
}
/* ****************************************************************
** 函 数 名: CLEAR1(int E)
** 功能描述: E边清屏子程序,将液晶显示屏清屏
*************************************************************** */
void CLEAR1(int E)
{
int PAGEADD,PAGENUM,CLMSUM;
for(PAGENUM=0X08,PAGEADD=0X0B8AGENUM>0AGENUM--,PAGEADD++)
      {           /* PAGEADD含页设置指令,中bit7:bit3为10111表示页设置指令 */
             /* bit2:bit000-111为页号的取值范围 */
          TRANS1(PAGEADD,E);       /* 设置相应的页地址 */
          for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++) /* CLMSUM含列地址设置指令,bit7:bit6为01 */
             /* 表示设置列地址,bit5:bit0从0-63为列地址得取值范围 */
           {
              LCDSTA1(E);      /* 判断液晶空闲状态 */
              WRITE1(0X00,CLMSUM,E);   /* 送0清屏 */
            }
        }
}

/* ****************************************************************
** 函 数 名: DISOFF1(int E)
** 功能描述: 关E边显示子程序,用于检查液晶显示是否被关闭
**************************************************************** */
void DISOFF1(int E)
{
int E1FLAG;
while(1)
{
  TRANS1(0X3E,E);    /* 发送控制命令,关闭显示 */
  LCDSTA1(E);     /* 判断液晶是否为空闲状态 */
  TRISD=0XFF;     /* 设置RD为输入 */
  if(E==1)     /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。 */
  {
   PORTA=PORTA|0X08;
   PORTE=(PORTE|0X01)&0xF9;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/  
  }
  else      /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
  {
   PORTA=PORTA&0xF7;
   PORTE=(PORTE|0X05)&0xFD;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
  }
PORTB=PORTB|0X01;    /* RB0/E=1,让数据被读出 */
E1FLAG=PORTD&0X20;    /* 取RD5的值 */
PORTB=PORTB&0XFE;    /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
if(E1FLAG==0X20)break;   /* 如果RD5=0,则表示液晶显示被关闭,则退出循环,否则继续关闭 */
}
}
/* ****************************************************************
** 函 数 名: LCD1INIT(int E)
** 功能描述: LCD的E边初始化子程序
*************************************************************** */
void LCD1INIT(int E)
{
DISOFF1(E);       /* 关E边显示 */
    CLEAR1(E);       /* 清屏 */
    DISP1(E);       /* 开E边显示 */
}
/* ****************************************************************
** 函 数 名: DISPLAY1(int E,int PAGADD,int CLMADD)
** 功能描述: 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址和选中的E边数
*************************************************************** */
DISPLAY1(int E,int PAGADD,int CLMADD)
{
int K;
    char TEMP;
    TRANS1(0X0C0,E);     /* 从0行开始显示 */
    TRANS1(PAGADD,E);     /* 从PAGADD页开始 */
    for(K=0;K<16;K++,CLMADD++,ARRAY++) /* 汉字占16列 */
     {   
  TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);   /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */  
      }
  CLMADD=CLMADD-16;     /* 从原来的列地址开始 */
    PAGADD=PAGADD+1;     /* 进入下一页 */
    TRANS1(PAGADD,E);
    for(;K<32;K++,CLMADD++,ARRAY++)
{
   TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);   /* TEMP写入数据线的值,CLMAA设置列地址abcdefab值,E选择液晶块 */
    }
}

/* ****************************************************************
** 函 数 名: DISPLAY2(int E,int PAGADD,int CLMADD)
** 功能描述: 数字和字母显示子程序,入口为存储字母或数字的数组的首地址,页地址,起始列地址选中的E边数
    或显示汉字的“左半”或“右半”
*************************************************************** */
DISPLAY2(int E,int PAGADD,int CLMADD)
{
int K;
    char TEMP;
    TRANS1(0X0C0,E);     /* 从0行开始显示 */
    TRANS1(PAGADD,E);     /* 从PAGADD页开始 */
    for(K=0;K<8;K++,CLMADD++,ARRAY++)  /* 数字和字母占8列 */
    {
        TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);   /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
    }
CLMADD=CLMADD-8;     /* 从原来的列地址开始 */
    PAGADD=PAGADD+1;     /* 进入下一页 */
    TRANS1(PAGADD,E);
    for(;K<16;K++,CLMADD++,ARRAY++)
{
        TEMP=*ARRAY;
        WRITE1(TEMP,CLMADD,E);   /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
    }
}

/* ****************************************************************
** 函 数 名: DISPLAY3(int E,int PAGADD,int CLMADD)
** 功能描述: 显示数字和字母的“左半”或“右半”,在这个程序中这一部分并没有
    用到但在其他的情况中可能用到
*************************************************************** */
DISPLAY3(int E,int PAGADD,int CLMADD)
{
int K;
    char TEMP;
    TRANS1(0X0C0,E);     /* 从0行开始显示 */
    TRANS1(PAGADD,E);     /* 从PAGADD页开始 */
    for(K=0;K<4;K++,CLMADD++,ARRAY++)   /* 半个数字和字母占4列 */
     {
         TEMP=*ARRAY;
         WRITE1(TEMP,CLMADD,E);  /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
        }
CLMADD=CLMADD-4;     /* 从原来的列地址开始 */
    PAGADD=PAGADD+1;     /* 进入下一页 */
    TRANS1(PAGADD,E);
    for(;K<8;K++,CLMADD++,ARRAY++)
       {
         TEMP=*ARRAY;
         WRITE1(TEMP,CLMADD,E);  /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
       }
}

/* ****************************************************************
** 函 数 名: xianshi()
** 功能描述: 液晶显示汉字的程序,电压:
*************************************************************** */
void xianshi()
{   
unsigned char data;
int j;
   for(i=0;i<32;i++)
  ppp=dian;    //显示汉字“电”
ARRAY=&ppp[0];
    DISPLAY1(1,0x0BC,0x58);  //第一块液晶,第四页,第24列
   for(i=0;i<32;i++)
  ppp=ya;    //显示汉字“压”
ARRAY=&ppp[0];
    DISPLAY1(1,0x0BC,0x68);  //第一块液晶,第四页,第40列
  for(i=0;i<16;i++)
  ppp=mao;    //显示“冒号”
ARRAY=&ppp[0];
    DISPLAY2(1,0x0BC,0x78);  //第一块液晶,第四页,第56列

/* *********显示AD转换结果****************** */
data=Adresult&0x0f;
data=data*16;
for(j=0,i=data;i<16+data;i++,j++)       /* 显示小数位 */
  ppp[j]=shu;
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x50);

for(i=0;i<16;i++)           /* 显示小数点 */
  ppp=d;
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x48);

data=(Adresult&0xf0)>>4;
data=data*16;
for(j=0,i=data;i<16+data;i++,j++)       /* 显示个位数 */
  ppp[j]=shu;
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x40);
}


/* **************** 主函数 ***************************** */
main()
{
YJ_initial();    /* 液晶显示初始化 */
    LCD1INIT(1);    /* LCD的1边初始化 */
    LCD1INIT(2);    /* LCD的2边初始化 */
AD_Initial();    /* A/D转化初始化 */
   INTCON=INTCON|0xc0;   /* 开总中断、开外围接口中断 */
  while(1)
    {   
   xianshi();
   if(AD_Flag==1)   /* AD采样完成 */
   Deal_AD();    /* 处理AD数据 */
      DELAY();     /* 间隔一定时间启动AD采样,间隔时间是不使AD采样过于频繁 */
   ADCON0=ADCON0|0x04;  /* 将ADCON0的bit2,设置为1,即启动A/D转换 */   
     }
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-5-1 03:07 , Processed in 0.055013 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表