#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
uchar i;
/*.....7219寄存器宏定义.....*/
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define Decode_mode 0x09 //译码控制寄存器
#define Intensity 0x0A//亮度控制寄存器
#define Scan_limit 0x0B//扫描界限寄存器
#define Shut_down 0x0C//关段模式寄存器
#define Display_test 0x0F//测试控制寄存器
/*IO配置*/
#define DIN_0 P3OUT&=~BIT0//0xfe
#define DIN_1 P3OUT|=BIT0//0x01
#define CS_0 P3OUT&=~BIT1//0xfd
#define CS_1 P3OUT|=BIT1//0x02
#define CLK_0 P3OUT&=~BIT2 //0xfb
#define CLK_1 P3OUT|=BIT2//0x04
void delay()
{
uchar i=20;
uint j;
while(i--)
{
j=200;
while(j--);
}
}
unsigned char DHT11[5]={0,0,0,0,0};
void Get_data()
{
unsigned char j,k,r;
P4DIR|=BIT0;//P4.0输出
P4OUT&=~BIT0;//低电平
delay_ms(20);
P4OUT|=BIT0;//高电平
delay_us(30);
P4DIR&=~BIT0;//P4.0输入
if(!(P4IN&BIT0))
{
while(!(P4IN&BIT0));//输入高电平跳出
while(P4IN&BIT0);//输入低电平跳出
for(j=0;j<5;j++)
{
r=0;
for(k=0;k<8;k++)
{
r<<=1;
while(!(P4IN&BIT0));
delay_us(35);
if(P4IN&BIT0)
{
r|=0x01;
while(P4IN&BIT0);
}
}
DHT11[j]=r;
}
if(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]==DHT11[4])
{
P5OUT&=~BIT0;
}
}
}
void Write_7219(unsigned char addr,unsigned char dat)
{
unsigned char i;
CS_0;
for(i=0;i<8;i++)
{
CLK_0;
if(addr&0x80)
DIN_1;
else
DIN_0;
addr<<=1;
CLK_1;
}
for(i=0;i<8;i++)
{
CLK_0;
if(dat&0x80)
DIN_1;
else
DIN_0;
dat<<=1;
CLK_1;
}
CS_1;
}
////////-------------控制寄存器初始化------///////
void Init(void)
{
Write_7219(Decode_mode,0xfe);//选用全译码模式
Write_7219(Intensity,0x08);//初始亮度
Write_7219(Scan_limit,0x07);//8个数码管都用
Write_7219(Shut_down,0x01);//开启正常工作模式
Write_7219(Display_test,0x00);//选择工作模式
}
//////////////////////////////////////
void Clear_7219(void)
{
unsigned char k;
for(k=1;k<9;k++)
{
Write_7219(k,0x7f);//dp给1亮,其余给0亮
}
}
uchar mm[]="DHT11[0]/10,DHT11[0]%10,DHT11[2]/10,DHT11[2]%10|0x80,0x4e";
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P3DIR|=0xff;
P5DIR|=BIT0;
BCSCTL1 &= ~XT2OFF;
P3SEL |= 0xC0; // P3.6,7 = USART1 TXD/RXD
ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
UCTL1 |= CHAR; // 8-bit character
UTCTL1 |= SSEL0; // UCLK = ACLK
UBR01 = 0x03; // 32k/9600 - 3.41
UBR11 = 0x00; //
UMCTL1 = 0x4A; // Modulation
UCTL1 &= ~SWRST; // Initialize USART state machine // Enable USART1 RX interrupt
_EINT();
do
{
IFG1&=~OFIFG;
for(i=0xff;i>0;i--);
}
while(IFG1&OFIFG);
BCSCTL2|=SELM_2+SELS;
Init();
Clear_7219();
while(1)
{
Get_data();
Write_7219(7,DHT11[0]/10);
Write_7219(6,DHT11[0]%10);
Write_7219(3,DHT11[2]/10);
Write_7219(2,DHT11[2]%10|0x80);
Write_7219(1,0x4e);
while(!(IFG1&UTXIFG0));
TXBUF0=mm[i++];
if(i==(sizeof mm-1))
{
i=0;
}
delay();
delay();
}
}