分贝测试仪
#include
#include "display_share.h" #include "ad.h"
void DelayMS(UINT iMs);
//按键初始化
void PortInit()
{
P1DIR |= BIT5 + BIT6 + BIT7;
P1SEL |= BIT1;
P1SEL2|= BIT1;
}
//初始化AD
void ad10_Init()
{
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled
ADC10CTL1 = INCH_1; // input A1
ADC10AE0 |= BIT1; // PA.1 ADC option select
}
//显示
void disp()
{
UCHAR i;
_DINT(); //禁用中断
adget1[0] = adget/10000%10;
adget1[1] = adget/1000%10;
adget1[2] = adget/100%10;
adget1[3] = adget/10%10;
adget1[4] = adget/10%10;
adget1[5] = adget/2%10;
for(i=0;i<3;i++)
{
display(i+1,adget1[i],0);
}
display(4,adget1[3],1); //小数点
display(5,adget1[4],0);
display(6,adget1[5],0);
_EINT();
}
//主程序
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关狗
PortInit();
ad10_Init();
Ht1621Clr(); //清屏
Ht1621_Init();
_EINT(); //使能中断
while(1)
{
DelayMS(100);
adget = ADC10MEM;
disp();
// ADC10CTL0 &=~(ENC + ADC10SC);
_NOP();
_NOP();
_NOP();
ADC10CTL0 |= ENC + ADC10SC;
LPM0;
}
}
#pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) {
ADC10CTL0 &=~(ENC + ADC10SC);
LPM0_EXIT;
}
#ifndef DISPLAY_SHARE_H_ #define DISPLAY_SHARE_H_
void Ht1621_Init(void);
void display(unsigned char site,unsigned char num,unsigned char dian);
void Ht1621Clr();
#endif /* DISPLAY_SHARE_H_ */
#ifndef DISPLAY_H_
#define DISPLAY_H_
typedef unsigned char UCHAR;
typedef unsigned int UINT;
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
#define HT1621_DAT1 P1OUT |= BIT7 //HT1621数据引脚 #define HT1621_DAT0 P1OUT &=~BIT7 #define HT1621_WR1 P1OUT |= BIT6 //HT1621时钟引脚 #define HT1621_WR0 P1OUT &=~BIT6 #define HT1621_CS1 P1OUT |= BIT5 //HT1621使能引脚 #define HT1621_CS0 P1OUT &=~BIT5
#define BIAS 0x52 //0b1000 0101 0010 1/3duty 4com
#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 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 禁止看门狗
UCHAR
Ht1621Tab[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0
0,0x00};
UCHAR
Ht1621CLR[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x
00,0x00};
UCHAR SEG_7[10][2]=
{
0xc4,0xc8,//00 就是 SEG_7[0][0]; SEG_7[0][1]; SEG_7[i][0]; SEG_7[i][1]; 所以调用的时候直接调用:SEG_7[i][0]; SEG_7[i][1]
0x04,0x40,//01 就是 SEG_7[1][0]; SEG_7[1][1];
0x4c,0x88,//02就是 SEG_7[2][0]; SEG_7[2][1];
0x4c,0x48,//03
0x8c,0x40,//04
0xc8,0x48,//05
0xc8,0xc8,//06
0x44,0x40,//07
0xcc,0xc8,//08
0xcc,0x48,//09
};
#endif
#include
#include "display.h"
#include "display_share.h"
/******************************************* 功 能:延时微秒级
********************************************/ void Delay(UCHAR us) //5,7,9
{
while(us--)
{
__delay_cycles(1);
}
}
/******************************************* 功 能:延时毫秒级
********************************************/ void DelayMS(UINT iMs)
{
while(iMs--)
{
__delay_cycles(1000);
}
}
/******************************************************
功 能:写数据函数,cnt为传送数据位数,数据传送为低位在前
*******************************************************/
void Ht1621Wr_Data(UCHAR Data,UCHAR cnt) {
UCHAR i;
for (i=0;i参数说明:Addr为写入初始地址,Data为写入数据
********************************************************/
void Ht1621WrOneData(UCHAR Addr,UCHAR Data)
{
HT1621_CS0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
Ht1621Wr_Data(Data<<4,4); //写入数据
HT1621_CS1;;
Delay(2);
}
/********************************************************
功能描述: HT1621连续写入方式函数
参数说明:Addr为写入初始地址,*p为连续写入数据指针, ********************************************************/
void Ht1621WrAllData(UCHAR Addr,UCHAR *p,UCHAR cnt)
{
UCHAR i;
HT1621_CS0;
Ht1621Wr_Data(0xa0,3); //写入数据标志101
Ht1621Wr_Data(Addr<<2,6); //写入地址数据
for (i=0;i