/****************************************************************************************
* KF8F系列单片机开发板演示程序
* 标 题: ADC转换采样
* 项目名: 02-ADC_TEST
* 开发环境: ChipON IDE
* 作 者:上海芯旺微电子技术有限公司
* 功能简述: ADC转换采样,数码管显示采样得到的值(16进制显示) 按键key2可切换采样通道,同时P12指示通道
* 亮灯时指示P20口的AN8,否则指示P21口的AN7,跳线处LED相关的还需要J12的P20、P21、P26口以及J21的控制D4指示灯
****************************************************************************************/
#include<KF8F4156.h>
/*********************宏定义******************************/
#define uchar unsigned char
#define uint unsigned int
#define COM1 P0LR0
#define COM2 P0LR1
#define COM3 P0LR3
#define COM4 P0LR4
#define SMG_A P3LR0
#define SMG_B P3LR1
#define SMG_C P3LR2
#define SMG_D P3LR3
#define SMG_E P3LR4
#define SMG_F P3LR5
#define SMG_G P3LR6
#define SMG_P P3LR7
#define Key2 P26
uint KeyCount;
uchar KeyState;
/*********************宏定义结束****************************/
/**************定义全局变量(注:为节省内存空间,全局变量尽量不要赋初值)*********/
uchar const Arr_num[] = {
0X3F, // 0
0X06, // 1
0X5B, // 2
0X4F, // 3
0X66, // 4
0X6D, // 5
0X7D, // 6
0X07, // 7
0X7F, // 8
0X6F, // 9
0X77, // a
0X7C, // b
0X58, // c
0X5E, // d
0X79, // E
0X71, // F
0X40, // -
0X00, // 空
};//共阴接法
uchar Unit, Decade, Hundred, Thousand; //定义数码管的个十百千位
uchar com_temp; //查表结果
/***********************全局变量定义结束**************************************/
/*****************函数声明(注:中断和main函数不需声明)*************************/
void Init_fun();
void Delay_200us();
uint Adc_fun(void);
uint Adc_read(void);
void input_smg();
void Display();
/********************函数声明结束************************************/
/************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
************************/
void main()
{
uint Dis_adc = 0 ; //采样接收变量
Unit = 0;
Decade = 0;
Hundred = 0;
Thousand = 0;
Init_fun(); //初始化
P1LR2=1; // 默认指示采样通道AN8 亮灯
while(1)
{
Dis_adc = Adc_read(); //将ADC采样返回值赋予Dis_adc
Unit = Dis_adc&0x0f; //将Dis_adc的最低4位赋予数码管的个位
Decade = Dis_adc&0xf0;
Decade >>= 4; //将Dis_adc的第7-4位赋予数码管的十位
Dis_adc >>= 8; //右移8位,取Dis_adc的高8位
Hundred = Dis_adc&0x0f; //将此时的Dis_adc的最低4位赋予数码管的百位
Thousand = Dis_adc&0xf0;
Thousand >>= 4; //将此时的Dis_adc的第7-4位赋予数码管的千位
Display(); //显示
//按键判断,切换通道
if(Key2)
{
KeyCount=0;
}
else
{
if(KeyCount<2)
{
KeyCount++;
if(KeyCount==2 )
{
if(KeyState)
{
ADCCTL0 = 0xA1; // P20 AN8
KeyState=0;
P1LR2=1;
}
else
{
ADCCTL0 = 0x9D; // P21 AN7
KeyState=1;
P1LR2=0;
}
}
}
}
}
}
/************************
* 函数名 :Init_fun
* 函数功能:初始化函数
* 入口参数:无
* 返回 :无
************************/
void Init_fun()
{
OSCCTL = 0x50; //设置为4M
/*********端口初始化***********/
TR0 = 0x04; //P02仅输入 LED片选
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x43; //P20 P21 AD输入 P26 key2输入
TR3 = 0X00; //LED 输出
P0 = 0;
P1 = 0;
P2 = 0;
P3 = 0;
P0LR=0;
P1LR=0;
P2LR=0;
P3LR=0x00;
/****初始化AD寄存器****/
ANSEH = 0x01; //设置通道AN8 P20为模拟口
ANSEL = 0x80; //设置通道AN7 P21为模拟口
ADCCTL1 = 0x94; //ad校准使能,8分频,VDD作为参考电压
ADCCTL0 = 0xA1; //右对齐,通道8, AD使能打开
}
/************************
* 函数名 :Adc_fun
* 函数功能:ADC函数,模数转换
* 入口参数:无
* 返回 :返回ADC采样值
************************/
uint Adc_fun(void)
{
uint Adc_num = 0 ; //ADC转换缓冲变量
START = 1; //启动ADC
while(START); //等待转换结束
Adc_num = ADCDATA0H; //将高位加进去
Adc_num <<=8;
Adc_num |= ADCDATA0L; //将低位加进去
return Adc_num; //返回转换值
}
/************************
* 函数名 :Adc_read
* 函数功能:ADC求均值函数,adc读取函数
* 入口参数:无
* 返回 :返回ADC采样8次均值
************************/
uint Adc_read(void)
{
uint Adc_sum = 0 ; //adc采样累加变量
uchar i = 0;
for(i = 0; i < 8; i++)
{
Adc_sum += Adc_fun(); //累加八次采样值
}
Adc_sum+=4; // 四舍五入
Adc_sum >>= 3; //右移动3位 除8求均值
return Adc_sum;
}
/************************
* 函数名 :Display
* 函数功能:数码管显示
* 入口参数:显示数字
* 返回 :无
************************/
void Display()
{
uchar i;
for(i = 0; i < 10; i++) // 控制显示的时长,计数速度控制
{
//打开数码管的 个位
com_temp = Arr_num[Unit];
input_smg();
COM1 =0;
COM2 =1;
COM3 =1;
COM4 =1;
Delay_200us();
COM1 =1; //消隐
COM2 =1;
COM3 =1;
COM4 =1;
//打开数码管的 十位
com_temp = Arr_num[Decade];
input_smg();
COM1 =1;
COM2 =0;
COM3 =1;
COM4 =1;
Delay_200us();
COM1 =1; //消隐
COM2 =1;
COM3 =1;
COM4 =1;
//打开数码管的 百位
com_temp = Arr_num[Hundred];
input_smg();
COM1 =1;
COM2 =1;
COM3 =0;
COM4 =1;
Delay_200us();
COM1 =1; //消隐
COM2 =1;
COM3 =1;
COM4 =1;
//打开数码管的 千位
com_temp = Arr_num[Thousand];
input_smg();
COM1 =1;
COM2 =1;
COM3 =1;
COM4 =0;
Delay_200us();
COM1 =1; //消隐
COM2 =1;
COM3 =1;
COM4 =1;
//结束当前,等待下次刷新
Delay_200us();
}
}
/************************
* 函数名 :input_smg
* 函数功能:将结果输出到对应IO口上
* 入口参数:无
* 返回 :无
************************/
void input_smg() //数码管段显
{
#if 1
P3=com_temp;
#else
if(com_temp&0x01)
{
SMG_A=1;
}
else
{
SMG_A=0;
}
if(com_temp&0x02)
{
SMG_B=1;
}
else
{
SMG_B=0;
}
if(com_temp&0x04)
{
SMG_C=1;
}
else
{
SMG_C=0;
}
if(com_temp&0x08)
{
SMG_D=1;
}
else
{
SMG_D=0;
}
if(com_temp&0x10)
{
SMG_E=1;
}
else
{
SMG_E=0;
}
if(com_temp&0x20)
{
SMG_F=1;
}
else
{
SMG_F=0;
}
if(com_temp&0x40)
{
SMG_G=1;
}
else
{
SMG_G=0;
}
if(com_temp&0x80)
{
SMG_P=1;
}
else
{
SMG_P=0;
}
#endif
}
/************************
* 函数名 :Delay_200us
* 函数功能:短时间延时
* 入口参数:无
* 返回 :无
************************/
void Delay_200us()
{
// uchar i = 60;
// while(--i);
uchar i = 250;
while(--i);
i = 250;
while(--i);
}
|