标签:
无标签
/*****************************************************************************\
文件名:KuangJia.c
描述:MSP430框架程序。适用于MSP430F149,其他型号需要适当改变。
不使用的中断函数保留或者删除都可以,但保留时应确保不要打开不需要的中断。
保留中断函数,编译器将会为BSL密码填充所有的字节。
版本:1.1
\*****************************************************************************/
//头文件
#include <MSP430x14x.h>
//函数声明
#define max7219_shutdown 0x0c //0 关闭 1 开启
#define max7219_decodemode 0x09 //0 ndecode all
//1 decode 0
//0f decode 0-3
//ff decode all
#define max7219_intensity 0x0a //亮度控制寄存器 0-f
/*显示位控制寄存器*********************************************/
/*0-第一位 1-第一、二位 ......7-全显示***********************/
#define max7219_scanlimit 0x0b
#define max7219_testreg 0x0f //测试模式 0 普通模式 1显示测试模式
#define max7219_dataaddr 0x01 //显示基址
/*MAX7219寄存器功能说明结束************************************/
//#define max7219_set0(x) x=0
//#define max7219_set1(x) x=1
#define max7219_clk BIT2
#define max7219_load BIT1
#define max7219_din BIT0
unsigned int m;
unsigned char display_buf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
//----------------------------------
//功能:us 级别延时
// n="10",则延时10*5+6=56uS
//----------------------------------
void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟
{
//int nCount;
int i;
// int j;
// nCount =1;
for(i = nValue;i > 0;i--)
{
//for(j = nCount;j > 0;j--);
_NOP();
_NOP();
_NOP();
}
return;
}
//-----------------------------------
void max7219_set1(x)
{
// 设定管脚为输出方向
P1DIR |= x;
// 将DQ管脚拉高
P1OUT |= x;
}
void max7219_set0(x)
{
// 设定管脚为输出方向
P1DIR |= x;
// 将DQ管脚拉低
P1OUT &= ~x;
}
void max7219_senddata(unsigned char addr,unsigned char data_send) //两个无符号字符型
{
unsigned char i,a;
max7219_set0(max7219_load);
for(i=0;i<4;i++)
{
max7219_set0(max7219_clk);
max7219_set1(max7219_clk);
}
addr=addr<<4;
for(i=0;i<4;i++)
{
max7219_set0(max7219_clk);
a=addr&0x80;
if(a) max7219_set1(max7219_din);
else max7219_set0(max7219_din);
addr=addr<<1;
max7219_set1(max7219_clk);
}
for(i=0;i<8;i++)
{
max7219_set0(max7219_clk);
a=data_send&0x80;
if(a) max7219_set1(max7219_din);
else max7219_set0(max7219_din);
data_send=data_send<<1;
max7219_set1(max7219_clk);
}
max7219_set1(max7219_load);
}
//向max7219送数据函数
void sent_data (m)
{
unsigned int max7219_data;
max7219_data =m;
max7219_set0(max7219_clk);
Delay_us(1);
max7219_set0(max7219_din);
Delay_us(1);
max7219_set0(max7219_load);
Delay_us(1);
for ( max7219_data=0x8000; max7219_data>=0x0001; max7219_data=max7219_data>>1 )
{
if ( ( m&max7219_data) == 0 ) max7219_set0(max7219_din); else max7219_set1(max7219_din);
max7219_set1(max7219_clk);
Delay_us(1);
max7219_set0(max7219_clk);
Delay_us(1);
}
max7219_set1(max7219_load);
Delay_us(1);
}
// max7219寄存器设置, 初始化
void max7219_init (void)
{
/* sent_data( 0x0C01 ); // 置LED为正常状态
sent_data( 0x0A04 ); // 置LED亮度为9/32
sent_data( 0x0B03 ); // 置LED扫描范围DIGIT0-3
sent_data( 0x0900 ); // 置LED显示为不译码方式 */
sent_data(0x0C01); //shutdown register format
sent_data(0x09FF); //decode mode code B 7-0
sent_data(0x0A0F); //intensity register format
sent_data(0x0B07); //sacan limit register format
sent_data(0x0F00); //display test register format
}
// 显示选项送显示器及输出控制函数
void display_out (void)
{
//显示数据送显示器
// max7219_senddata(0x01,0x01);
// max7219_senddata(0x02,0x01);
// max7219_senddata(0x03,0x01);
// max7219_senddata(0x04,0x01);
// max7219_senddata(0x05,0x01);
//max7219_senddata(0x06,0x01);
//max7219_senddata(0x07,0x01);
// max7219_senddata(0x08,0x01);
sent_data(0x0100+display_buf[0]);
sent_data(0x0200+display_buf[1]);
sent_data(0x0300+display_buf[2]);
sent_data(0x0400+display_buf[3]);
sent_data(0x0500+display_buf[4]);
sent_data(0x0600+display_buf[5]);
sent_data(0x0700+display_buf[6]);
sent_data(0x0800+display_buf[7]);
}
void max7219_initial()
{
max7219_set0(max7219_clk);
max7219_set0(max7219_load);
max7219_set0(max7219_din);
}
/*MAX7219驱动程序结束**********************************************/
void InitSys();
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初始化
//start:
//以下填充用户代码
//max7219_initial();
//max7219_data=1;
max7219_init ();
display_out ();
for(int i="1000";1>0;i--)
{Delay_us(1000);}
//LPM3; //进入低功耗模式n,n:0~4。若不希望进入低功耗模式,屏蔽本句
///goto start;
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
unsigned int iq0;
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
//以下填充用户代码,对各种模块、中断、外围设备等进行初始化
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
系统分类:
汽车电子 | 用户分类:
无分类 | 来源:
转贴 | 【推荐给朋友】 | 【添加到收藏夹】