/*************************************************************
程序功能:P1.0采集电位器电压 通过两片74HC595在数码管上显示
P1.1~3连第一片控制数码管段选的595
P1.4~6连第二片控制数码管位选的595
测试问题:数码管上数字显示不全,但通过调节电位器可以使数据发生改变
*************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define NixieDIR P1DIR
#define SCK1_SET P1OUT|=BIT1; //P1.1
#define SCK1_CLR P1OUT&=~BIT1;
#define RCK1_SET P1OUT|=BIT2; //P1.2
#define RCK1_CLR P1OUT&=~BIT2;
#define DATA1_SET P1OUT|=BIT3; //P1.3
#define DATA1_CLR P1OUT&=~BIT3;
#define SCK2_SET P1OUT|=BIT4; //P1.4
#define SCK2_CLR P1OUT&=~BIT4;
#define RCK2_SET P1OUT|=BIT5; //P1.5
#define RCK2_CLR P1OUT&=~BIT5;
#define DATA2_SET P1OUT|=BIT6; //P1.6
#define DATA2_CLR P1OUT&=~BIT6;
uint Aver;
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar DispBuf[4] = {0,0,0,0};
//记录显示位数的全局变量
uchar cnt = 0;
uchar temp;
void datawrite595_1(uchar DATA)//将数据送入74HC595内部移位寄存器
{
uchar j;
for (j=0;j<8;j++)
{
if(DATA&0x80)
{
DATA1_SET;
}
else
{
DATA1_CLR;
}
DATA <<= 1;
SCK1_SET ; //上升沿发生移位
_NOP();_NOP();
SCK1_CLR ;
}
}
void dataout595_1()//将移位寄存器内的数据锁存到输出寄存器并显示
{
RCK1_CLR;
RCK1_SET;//上升沿将数据送到输出锁存器
RCK1_CLR;
}
void datawrite595_2(uchar DATA)//将数据送入74HC595内部移位寄存器
{
uchar j;
for (j=0;j<8;j++)
{
if(DATA&0x80)
{
DATA2_SET;
}
else
{
DATA2_CLR;
}
DATA <<= 1;
SCK2_SET ; //上升沿发生移位
_NOP();_NOP();
SCK2_CLR ;
}
}
void dataout595_2()//将移位寄存器内的数据锁存到输出寄存器并显示
{
RCK2_CLR;
RCK2_SET;//上升沿将数据送到输出锁存器
RCK2_CLR;
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
CCTL0=CCIE;
CCR0=5000;
TACTL=TASSEL_2+MC_1;
P1SEL |= 0x01; // Enable A/D channel A0
ADC10CTL0 |= ADC10ON + ADC10SHT_3 +MSC +ADC10IE; // Turn on ADC10, set sampling time
ADC10CTL1 |= CONSEQ_2; // Use sampling timer, set mode
ADC10AE0 |= 0x01; // Enable ADC10IFG.0
ADC10CTL0 |= ENC; // Enable conversions
ADC10CTL0 |= ADC10SC; // Start conversion
NixieDIR = 0X7e;
SCK1_CLR ;
RCK1_SET ;
SCK2_CLR ;
RCK2_SET ;
datawrite595_1(0); //段选消影
dataout595_1();
datawrite595_2(0); //位选消影
dataout595_2();
_EINT();
while(1)
{
Aver = ADC10MEM;
__bis_SR_register(CPUOFF + GIE); // Enter LPM0, Enable interrupts
DispBuf[0] = Aver / 1000 % 10; //更新数码管显示
DispBuf[1] = Aver / 100 % 10 ;
DispBuf[2] = Aver / 10 % 10;
DispBuf[3] = Aver % 10;
}
}
/*******************************************
函数名称:ADC12ISR
功 能:ADC12的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10ISR (void)
{
_bic_SR_register_on_exit(CPUOFF); // Clear LPM0
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER_A(void)
{
if(cnt == 4) cnt = 0;
temp = 0xff;
temp &= ~(1 << cnt); //输出位选信号
datawrite595_2(temp);
dataout595_2();
datawrite595_1(DispBuf[cnt]); //输出段选信号
dataout595_1();
datawrite595_1(0); //段选消影
dataout595_1();
cnt++; //位计数变量在0~3之间循环
}
数码管上数字显示不全,总是缺胳膊少腿的,通过调节电位器可以使数码管上数字发生变化,关于595的函数程序和数码管的显示程序我单独测过是没有问题的
希望高手能帮我解决疑难,真的十分感谢!