/*******************************************************************************
* 标 题: PIC_ST_V3.0学习板演示程序--LCD1602&ADC
* 文 件 名: LCD1602&ADC
* 建立日期: 2011.10.20
* 修改日期: 2011.10.20
* 版 本: V1.0
* 作 者: simomli
www.simomli.taobao.com
********************************************************************************
* 跳线接法:短接蜂鸣器P2的1、2
* 功能描述: 采集AD电压值,并显示到LCD1602液晶上
********************************************************************************
*【版权】Copyright(C) 2009-2019 All Rights Reserved
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*******************************************************************************/
//#include <pic1687x.h>
//#include <htc.h>
#include <pic.h>
#include "LCD1602.h"
#include "main.h"
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
uint16 AD_Result; //ADC转换结果变量
uint16 count;
long AD_Result_temp;
uint8 tab[] ={"AD_Value: V"};
/*******************************************************************************
* 函 数 名: DelayUS(uint8 delay)
* 函数功能: 微秒延时 for 20MHZ
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void DelayUS(uint8 delay)
{
while(--delay);
}
/*******************************************************************************
* 函 数 名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时 for 20MHZ
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void DelayMS(uint16 delay)
{
uint16 i;
for(;delay>0;delay--)
for(i=0;i<453;i++);
}
/******************************************************************************
* 函 数 名: HC595_Init(void)
* 函数功能: 74HC595初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void HC595_Init(void)
{
ADCON1 = 0x8E;
TRISA5 = 0;
TRISE0 = 0;
TRISC0 = 0;
}
/******************************************************************************
* 函 数 名: HC595_Write_Byte(uint8 data)
* 函数功能: 74HC595写8位数据
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void HC595_Write_Byte(uint8 data)
{
uint8 i;
for(i=0;i<8;i++)
{
if(data&0x80)
{
SER_595 = 1;
}
else
{
SER_595 = 0;
}
SCK_595 = 0;
data <<= 1;;;
SCK_595 = 1;
}
RCK_595 = 0;
;;
RCK_595 = 1;
}
/******************************************************************************
* 函 数 名: PIC_IO_Init(void)
* 函数功能: IO口初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void PIC_IO_Init(void)
{
ADCON1 = 0x87; //设置PORTE为普通IO口
TRISA2 = 0;
TRISA3 = 0;
TRISA4 = 0;
TRISD = 0x00; //设置PORTD为输出
TRISE = 0x00; //设置PORTE为输出
TRISC1 = 0;
}
/******************************************************************************
* 函 数 名: ADC_Init(void)
* 函数功能: ADC初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void ADC_Init(void)
{
TRISA0 = 1; //模拟通道0设置为输入
ADCON1 = 0x8E; //10001110 Vref+ = VDD Vref- = VSS
ADCON0 = 0x01; //选择通道0,使能AD
ADIF = 0; //中断标志清零
ADIE = 1; //ADC中断使能
}
/*******************************************************************************
* 函 数 名: Time2_Init(void)
* 函数功能: 定时器2初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void Time2_Init(void)
{
T2CON = 0x01; //postscale 1:1 prescale 1:4
PR2 = 250; //匹配寄存器 1*4*250*200ns = 200us
TMR2IF = 0; //定时器2中断标志位清零
GIE = 1; //开总中断
PEIE = 1; //开外设中断
TMR2IE = 1; //开定时器中断
}
/******************************************************************************
* 函 数 名: mian()
* 函数功能: LCD显示AD采集电压
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main(void)
{
long temp;
PIC_IO_Init();
HC595_Init();
HC595_Write_Byte(0x00);
LCD1602_Init();
ADC_Init(); //ADC初始化
Time2_Init(); //定时器2初始化
GIE = 1; //总中断使能
PEIE = 1; //外设中断设能
ADGO = 1; //启动ADC转换
TMR2ON = 1; //启动定时器2计时
while(1)
{
temp = AD_Result_temp;
tab[12] = temp%10+0x30;
temp /= 10;
tab[11] = temp%10+0x30;
temp /= 10;
tab[10] = '.';
tab[9] = temp%10+0x30;
Write_LCD_Mult_Byte(0x80,tab,0x00,14);
DelayMS(10);
}
}
/******************************************************************************
* 函 数 名: interrupt PIC_Init(void)
* 函数功能: 中断函数
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void interrupt PIC_Init(void)
{
if(ADIF == 1)
{
ADIE = 0; //关AD中断
ADIF = 0; //AD中断标志清零
AD_Result = ADRESL & 0x00FF; //读取ADC采样结果
AD_Result |= ADRESH <<8 ;
AD_Result_temp = AD_Result*50; //5V为VDD电压,根据不同的电压作修改
AD_Result_temp = AD_Result_temp*10/1023; //再放大10倍,方便计算显示
ADIE = 1; //开启AD中断
}
if(TMR2IF == 1)
{
TMR2IE = 0; //关定时器0中断
TMR2IF = 0; //清标志位
count++; //计数值加1
if(count >= 500) //200us*500 = 100ms,即0.1s启动采样一次
{
count = 0;
ADGO = 1; //启动ADC转换
}
TMR2 = 0x00;
TMR2IE = 1; //开中断
}
}