// ***两者的电路连接:P4.0--DIO P4.1--STB P4.2--CLK tm1638的VCC和GND接5V的电源箱***
// STB=0 ---> P4OUT &= 0x05
// STB=1 ---> P4OUT |= 0x02
// CLK=0 ---> P4OUT &= 0x02
// CLK=1 ---> P4OUT |= 0x06
// DIO=0 ---> P4OUT &= 0x06
// DIO=1 ---> P4OUT |= 0x01
#include<TM1638_zj.h>
#include"msp430f5438a.h"
#define STB_0 P4OUT &= 0x05
#define STB_1 P4OUT |= 0x02
#define CLK_0 P4OUT &= 0x03
#define CLK_1 P4OUT |= 0x06
#define DIO_0 P4OUT &= 0x06
#define DIO_1 P4OUT |= 0x01
#define DIO_IN P4DIR &= ~BIT0
#define DIO_OUT P4DIR |= BIT0 //CLK STB 一直为输出 P4DIR |= BIT0 + BIT1 + BIT2
unsigned char tap1[16] = {0x6f, 0x00, 0xf3, 0x00, 0xbf, 0x00, 0x6d, 0x00, 0x45, 0x00, 0x1d, 0x00, 0x7d, 0x00, 0x01, 0x00}; //12345678,从地址00H写入
unsigned char tap2[16] = {0xf6, 0x00, 0xcf, 0x00, 0xfd, 0x00, 0xb6, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0xae, 0x00, 0x01, 0x00}; //87654321,从地址00H写入
unsigned int j;
/****延时程序*******/
void delay_zj(unsigned long time)
{
while(time--) ;
}
void DigitalTube1(void) //数码管显示,地址自动增加,12345678
{
unsigned char i;
Write_COM(0x8a); // 打开显示,脉冲宽度4/16
Write_COM(0x40); // 写数据到显示寄存器,地址自动增加模式
STB_0; // 变低为了写命令字节(地址),然后需要直接开始传送数据,传送完成后,才能再次置1
TM1638_Write(0xc0); // 地址从 00H 开始
j=0;
for(i=0;i<16;i++)
{
TM1638_Write(tap1[j]);
j++;
}
STB_1;
}
void DigitalTube2(void) //数码管显示,固定地址,87654321
{
unsigned char i, ads;
Write_COM(0x8a);
Write_COM(0x8a); // 打开显示,脉冲宽度4/16(只用了一条命令语句,和初始化函数不同)
Write_COM(0x44); // 写数据到显示寄存器,固定地址模式
ads = 0xc0;
j=0;
for(i=0;i<8;i++)
{
STB_0;
TM1638_Write(ads); // 地址从 00H 开始
TM1638_Write(tap2[j]);
STB_1;
ads = ads + 2;
j = j + 2;
}
}
void TM1638_Write(unsigned char DATA) //写数据函数
{
unsigned char i;
DIO_OUT;
for(i=0;i<8;i++)
{
CLK_0;
if(DATA&0X01) //从最低位开始写入
DIO_1;
else
DIO_0;
DATA>>=1;
CLK_1; //给一个上升沿,完成写入
}
}
void Write_COM(unsigned char cmd) //发送命令字,后面不需要传送数据的子程序调用
{
STB_0; //在STB下降沿后由DIO输入的第一个字节作为一条指令。
TM1638_Write(cmd); //经过译码,取最高B7、B6两位比特位以区别不同的指令。
STB_1; //上升沿写入,STB为高时,CLK被忽略
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4DIR |= BIT0 + BIT1 + BIT2; //P4.0--DIO P4.1--STB P4.2--CLK
P7SEL |= BIT0 + BIT1; //Enable XT1
UCSCTL6 &= ~(XT1OFF);
UCSCTL6 |= XCAP_3; // 到底是把这个电容接到哪里???
do
{
UCSCTL7 &= ~XT1LFOFFG;
}while(UCSCTL7&XT1LFOFFG);
while(1)
{
DigitalTube1();
delay_zj(50000);
DigitalTube2();
delay_zj(50000);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
都改了 不知道为什么还是不可以 不过还是谢谢 你一直耐心的回答
一周热门 更多>