标签:
W79A9311 单片机 AD 芯唐 华邦
/****************************************************************************/
/* 深圳恒森微电子有限公司 (华邦单片机香港及中国区代理商) */
/* 香港恒森科技有限公司 (华邦单片机香港及中国区代理商) */
/* 陈文 email:chenwen@hengsen.cn (有 bug 请提交) */
/****************************************************************************/
/* 文件名: adc.c */
/* 版本 1.0 */
/* 创建日期: 2007-10-29 10:58 */
/* 概述: 本文件为 w79a9311 ADC 测试 软件 */
/*--------------------------------------------------------------------------*/
/* 历史修改记录: */
/* 名字 日期 注释 */
/* 陈文 2008-7-14 11:11 ver 1.0 */
/****************************************************************************/
#include "W79A9311.H"
#define uint8 unsigned char
uint8 led[2];
//led code 共阳极 0 1 2 3 4 5 6 7 8 9 a b c d e f 灭 高位先出 bit顺序 h,g,f,e,d,c,b,a : Q1--a.....Q8--h
//uint8 code tab[17] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x0a,0x86,0x8e,0xff};
uint8 code tab[17] = {0x41,0xf5,0x0d,0x15,0xb1,0x13,0x03,0xd5,0x01,0x11,0x81,0x83,0xc6,0x0a,0x86,0x8e,0xff};
sbit Csg1 = P1^6;
sbit Csg0 = P1^7;
#define SEL_ADC_CLK_Div1 {ADCCON1 &= 0x04;}
#define SEL_ADC_CLK_Div2 {ADCCON1 &= 0x04;ADCCON1 |= 0x40;}
#define SEL_ADC_CLK_Div4 {ADCCON1 &= 0x04;ADCCON1 |= 0x80;}
#define EnADCExtTrig ADCCON |= 0x20;
#define DisADCExtTrig ADCCON &= ~0x20;
#define SelADC_RC_Clk ADCCON |= 0x04;
#define SelADC_CPU_Clk ADCCON &= ~0x04;
#define EnableADC AUXR1 |= 0x04;
#define DisableADC AUXR1 &= ~0x04;
#define StartADC {ADCCON&=0xef; ADCCON|=0x08;}
//ADCCON --ADCI中断请求位 --ADCS开始转换位
//当A/D准备好时ADCI被设置,当ADCI被设置,则ADCS自动清0
//若ADCI为高电平,不能再次作AD转换,若ADC中断允许则ADCI被自动清除
uint8 HexBcd(uint8 h);
void Display(void);
void Dispv(v)
{
uint8 temp1;
temp1 = HexBcd(v);
led[0] = (temp1&0x0f);
led[1] = (temp1&0xf0)>>4;
Display();
}
void Display(void)
{
bit B_disp_flag;
uint8 temp;
Csg1 = 1;
Csg0 = 1;
if(B_disp_flag == 1)
{
B_disp_flag = 0;
temp = led[0];
temp = tab[temp];
P0 &= 0xe0;
P0 |= (temp&0x1f);
P1 &= 0xe3;
P1 |= ((temp >> 3)&0x1c);
Csg1 = 1;
Csg0 = 0;
}
else
{
B_disp_flag = 1;
temp = led[1];
temp = tab[temp]&0xfe; //小数点
P0 &= 0xe0;
P0 |= (temp&0x1f);
P1 &= 0xe3;
P1 |= ((temp >> 3)&0x1c);
Csg0 = 1;
Csg1 = 0;
}
}
uint8 HexBcd(uint8 h)
{
uint8 b;
if(h > 99) return 0x99;
b=h/10*0x10 + h%10;
return b;
}
//禁止数字输入
void DisChannelInput(unsigned char Channel)
{
switch(Channel)
{
case 0:PADIDS |= 0x01;break;
case 1:PADIDS |= 0x02;break;
case 2:PADIDS |= 0x04;break;
case 3:PADIDS |= 0x08;break;
case 4:PADIDS |= 0x10;break;
case 5:PADIDS |= 0x20;break;
case 6:PADIDS |= 0x40;break;
case 7:PADIDS |= 0x80;break;
default: break;
}
}
//打开数字输入
void EnChannelInput(unsigned char Channel)
{
switch(Channel)
{
case 0:PADIDS &= ~0x01;break;
case 1:PADIDS &= ~0x02;break;
case 2:PADIDS &= ~0x04;break;
case 3:PADIDS &= ~0x08;break;
case 4:PADIDS &= ~0x10;break;
case 5:PADIDS &= ~0x20;break;
case 6:PADIDS &= ~0x40;break;
case 7:PADIDS &= ~0x80;break;
default: break;
}
}
unsigned int Read_ADC(unsigned char channel)
{
unsigned int temp;
EnableADC;
ADCCON1 &= ~0x04;
switch(channel)
{
case 0:P0M1|=0x08;P0M2&=~0x08;ADCCON=0; P0|=0x08;break;
case 1:P0M1|=0x10;P0M2&=~0x10;ADCCON=1; P0|=0x10;break;
case 2:P0M1|=0x20;P0M2&=~0x20;ADCCON=2; P0|=0x20;break;
case 3:P0M1|=0x40;P0M2&=~0x40;ADCCON=3; P0|=0x40;break;
case 4:P0M1|=0x04;P0M2&=~0x04;ADCCON=0;ADCCON1|=0x04;P0|=0x04;break;
case 5:P0M1|=0x02;P0M2&=~0x02;ADCCON=1;ADCCON1|=0x04;P0|=0x02;break;
case 6:P0M1|=0x01;P0M2&=~0x01;ADCCON=2;ADCCON1|=0x04;P0|=0x01;break;
case 7:P0M1|=0x80;P0M2&=~0x80;ADCCON=3;ADCCON1|=0x04;P0|=0x80;break;
default: break;
}
ADCCON&=0xef;
ADCCON|=0x08;//start ADC
while((ADCCON&0x18)==0x08);//查询,(可用中断实现)
ADCCON&=0xe7;
temp="ADCH";
temp <<=2;
temp |=(ADCCON >> 6);
return temp;
}
//测试通过
void main(void)
{
unsigned int temp,i;
unsigned char adc_v;
SEL_ADC_CLK_Div1;
while(1)
{
temp=Read_ADC(2);
adc_v = temp*50/1024;
Dispv(adc_v);
for(i=0;i<0xfff0;i++);
//for(i=0;i<0xfff0;i++);
}
}
系统分类:
单片机 | 用户分类:
winbond lpc单片机 | 来源:
原创 | 【推荐给朋友】 | 【添加到收藏夹】