#include "msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
/********************************************************
函数名称:HT1621显示宏定义
功能描述: 无
全局变量:无
参数说明:无
********************************************************/
#define BIAS 0x52 //0b1000 0100 1010 1/3duty 3com
#define SYSDIS 0X00 //0b1000 0000 0000 关振系统荡器和LCD偏压发生器
#define SYSEN 0X02 //0b1000 0000 0010 打开系统振荡器
#define LCDOFF 0X04 //0b1000 0000 0100 关LCD偏压
#define LCDON 0X06 //0b1000 0000 0110 打开LCD偏压
#define TIMERDIS 0X08 //0b1000 0000 0110 禁止时基输出
#define XTAL 0x28 //0b1000 0010 1000 外部接时钟
#define RC256 0X30 //0b1000 0011 0000 内部时钟
#define TONEON 0X12 //0b1000 0001 0010 打开声音输出
#define TONEOFF 0X10 //0b1000 0001 0000 关闭声音输出
#define WDTDIS 0X0A //0b1000 0000 1010 禁止看门狗
#define HT1621_DAT_H P2OUT|=BIT3
#define HT1621_DAT_L P2OUT&=~BIT3
#define HT1621_CS_H P2OUT|=BIT1
#define HT1621_CS_L P2OUT&=~BIT1
#define HT1621_WR_H P2OUT|=BIT2
#define HT1621_WR_L P2OUT&=~BIT2
/********************************************************
函数名称:段码表
功能描述: 显示数字
全局变量:无
参数说明:无
********************************************************/
uchar Ht1621Tab[]={0x00};
uchar Ht1621Tab1[]={0x0c,0x0a,0x0c, //0 不带小数点表格
0x00,0x00,0x0c, //1
0x04,0x0e,0x08, //2
0x00,0x0e,0x0c, //3
0x08,0x04,0x0c, //4
0x08,0x0e,0x04, //5
0x0c,0x0e,0x04, //6
0x00,0x08,0x0c, //7
0x0c,0x0e,0x0c, //8
0x08,0x0e,0x0c}; //9
uchar Ht1621Tab2[]={0x0e,0x0a,0x0c, //0 带小数点表格
0x02,0x00,0x0c, //1
0x06,0x0e,0x08, //2
0x02,0x0e,0x0c, //3
0x0a,0x04,0x0c, //4
0x0a,0x0e,0x04, //5
0x0e,0x0e,0x04, //6
0x02,0x08,0x0c, //7
0x0e,0x0e,0x0c, //8
0x0a,0x0e,0x0c}; //9
uchar Ht1621Tab3[]={0x0c,0x0a,0x0e, //0 显示最前端1,LOW BATTERY CONTINUITY
0x00,0x00,0x0e, //1
0x04,0x0e,0x0a, //2
0x00,0x0e,0x0e, //3
0x08,0x04,0x0e, //4
0x08,0x0e,0x06, //5
0x0c,0x0e,0x06, //6
0x00,0x08,0x0e, //7
0x0c,0x0e,0x0e, //8
0x08,0x0e,0x0e}; //9
void Delay_nms(uint n)
{
uchar i;
while(n--)
for(i=0;i<115;i++);
}
void Init()
{
TACTL = TASSEL_2;
P1DIR&=~BIT1;
P2DIR|=BIT1+BIT2+BIT3;
}
/********************************************************
函数名称:Ht1621Wr_Data(uchar Data,uchar cnt)
功能描述: 写数据函数,cnt为传送数据位数,数据传送为低位在前
全局变量:无
参数说明:Data为写入的数据,cnt为传送的位数
********************************************************/
void Ht1621Wr_Data(uchar Data,uchar cnt)
{
uchar i;
for (i=0;i<cnt;i++)
{
HT1621_WR_L;
Delay_nms(1);
if(Data&0x80)
HT1621_DAT_H;
else
HT1621_DAT_L;
Delay_nms(1);
HT1621_WR_H;
Delay_nms(1);
Data<<=1;
}
}
/********************************************************
函数名称:void Ht1621WrCmd(uchar Cmd)
功能描述: HT1621命令写入函数
全局变量:无
参数说明:Cmd为写入命令数据
说明:写入命令标识位100
********************************************************/
void Ht1621WrCmd(uchar Cmd)
{
HT1621_CS_L;
Delay_nms(1);
Ht1621Wr_Data(0x80,4); //写入命令标志100
Ht1621Wr_Data(Cmd,8); //写入命令数据
HT1621_CS_H;
Delay_nms(1);
}
/********************************************************
函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
功能描述: HT1621在指定地址写入数据函数
全局变量:无
参数说明:Addr为写入初始地址,Data为写入数据
说明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位
********************************************************/
void Ht1621WrOneData(uchar Addr,uchar Data)
{
HT1621_CS_L;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data<<4,4); //写入数据
HT1621_CS_H;
Delay_nms(1);
}
/********************************************************
函数名称:void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
功能描述: HT1621连续写入方式函数
全局变量:无
参数说明:Addr为写入初始地址,*p为连续写入数据指针,
cnt为写入数据总数
说明:HT1621的数据位4位,此处每次数据为8位,写入数据
总数按8位计算
********************************************************/
void Ht1621WrAllData(uchar Addr,uchar *p,uchar cnt)
{
uchar i;
HT1621_CS_L;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i<cnt;i++)
{
Ht1621Wr_Data(0x00,8); //写入数据
p++;
}
HT1621_CS_H;
Delay_nms(1);
}
/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
说明:初始化后,液晶屏所有字段均显示
********************************************************/
void Ht1621_Init(void)
{
HT1621_CS_H;
HT1621_WR_H;
HT1621_DAT_H;
Delay_nms(20); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS); //1/3duty 3com
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);//关振系统荡器和LCD偏压发生器
Ht1621WrCmd(WDTDIS);//禁止看门狗
Ht1621WrCmd(TONEOFF);//关闭声音输出
Ht1621WrCmd(SYSEN); //打开系统振荡器
Ht1621WrCmd(LCDON); //打开LCD偏压
P2DIR|=BIT1+BIT2+BIT3;
}
void display(uint da)
{
uint data;
data = (double)(25*da/10.23);
volatile uchar tempint1,tempint2,tempint3,tempint4;//分别存储温度整数值,整数值的千,百,十,个位
tempint1=(data/1000)%10; //十位
tempint2=(data/100)%10; //个位
tempint3=(data/10)%10; //十分位
tempint4=data%10; //百分位
Ht1621WrOneData(0x01,Ht1621Tab1[3*tempint1]);
Ht1621WrOneData(0x03,Ht1621Tab1[3*tempint1+1]);
Ht1621WrOneData(0x05,Ht1621Tab1[3*tempint1+2]);//在此地址调用 Ht1621Tab3
Ht1621WrOneData(0x07,Ht1621Tab2[3*tempint2]);
Ht1621WrOneData(0x09,Ht1621Tab2[3*tempint2+1]);
Ht1621WrOneData(0x0b,Ht1621Tab3[3*tempint2+2]);
Ht1621WrOneData(0x0d,Ht1621Tab1[3*tempint3]);
Ht1621WrOneData(0x0f,Ht1621Tab1[3*tempint3+1]);
Ht1621WrOneData(0x11,Ht1621Tab3[3*tempint3+2]);//在此地址调用 Ht1621Tab3
Ht1621WrOneData(0x13,Ht1621Tab1[3*tempint4]);
Ht1621WrOneData(0x15,Ht1621Tab1[3*tempint4+1]);
Ht1621WrOneData(0x17,Ht1621Tab3[3*tempint4+2]); //在此地址调用 Ht1621Tab3
Delay_nms(20);
//CONTINUITY
}
void InitADC()
{
P1SEL|=0x01;
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//SREF_1+REFON +REF2_5V表示使用内部参考电压2.5v
__enable_interrupt(); // Enable interrupts.
TACCR0 = 30; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2| MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
__disable_interrupt();
ADC10CTL1 = INCH_1+CONSEQ_2; // input A1
ADC10AE0 |= 0x02; // PA.1 ADC option select
_EINT();
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;
Init();
Ht1621_Init(); //上电初始化LCD
Ht1621WrAllData(0,Ht1621Tab,16);//清除1621寄存器数据,暨清屏
InitADC();
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
ADC10CTL0&=~ENC;
uint data,count=10;
unsigned long sum=0;
uint buffer[10];
static uint index=0;
buffer[index++]=ADC10MEM;
if(index==count)
{
index=0;
uchar i;
for(i=0;i<count;i++)
sum+=buffer;
sum=sum/count;
display(sum);
}
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}
用户1849145 2016-1-18 10:46
用户593939 2012-11-16 22:54