自己刚刚学习msp430不久,写的一个小程序:
便是使用10位串行DA 5615将数字量转化为模拟量,用数码管显现输入10位二进制数的数值。用矩阵建模操控10位二进制数字量的输入,我设置了+1、-1、+10、-10。然后从5615的out端输出转化得到的模拟量。
//动态显现方法 P300
//例如,要在8个数码管上别离显现”1″”2″”3″”4″,动态扫描显现的C言语程序如下(共阳极方法):
//针对本开发板,修改了部分代码
#include
//共阳数码管的表格为:
//本表格经过LEDSET软件能够快速得到
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0X84, 0XBD, 0XE0, 0XB0, 0X99, 0X92, 0X82, 0XBC, 0X80, 0X90, 0X88, 0X83, 0XC6, 0XA1, 0XC2, 0XCA };
const uchar KeyCode[16]=
{
//0->key17
0xE7,
//1->key18
0xD7,
//2->key19
0xB7,
//3->key20
0x77,
//4->key21
0xEB,
//5->key22
0xED,
//6->key23
0xDB,
//7->key24
0xDD,
//8->key25
0xBB,
//9->key26
0xBD,
//10->key27
0x7B,
//11->key28
0x7D,
//12->key29
0xEE,
//13->key30
0xDE,
//14->key31
0xBE,
//15->key32
0x7E
};
uchar KeyValue=0xFF;
uchar keyscan(void);
void delay(uint i);
void da5615(uint da);
void main(void)
{
uchar i=0;
uint daben;
uint love=0x66;
WDTCTL = WDTPW + WDTHOLD; //停看门狗
P6DIR |= 0x07; //P6.1,p6.2,p6.3输出
P4DIR = 0XFF;//P4作为段输出
P5DIR = 0X0F;//P5作为位输出
P4OUT = 0XFF;//平息一切数码管
P5OUT = 0X00;//平息一切数码管
P2DIR=0xF0;//P2.4 P2.5 P2.6 P2.7设置为输出
P2OUT=0x00;//使按键按下时能发生中止
P2IE=0x0F;//P2.0 P2.1 P2.2 P2.3中止答应
P2IES=0x0F;//P2.0 P2.1 P2.2 P2.3下降沿触发中止
P1DIR |= BIT0+BIT1+BIT2;
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2敞开 LFXT1作业在低频形式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
//初始化时钟
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2敞开 LFXT1作业在低频形式 ACLK不分频 最高的标称频率
DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率
do
{
IFG1&=~OFIFG;//铲除振荡器失效标志
for(i=255;i>0;i–);
}while(IFG1&OFIFG);//判别XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频
_EINT();//翻开中止
for(;;)
{
for(i=0;i<4;i++)
{
if(KeyValue==KeyCode[0])
{
KeyValue = 0xff;
if(love+1>1023)love=1023;
else love=love+1;
delay(1000);
}
if(KeyValue==KeyCode[1])
{
KeyValue = 0xff;
if(love<1)love=0;
else love=love-1;
delay(1000);
}
if(KeyValue==KeyCode[2])
{
KeyValue = 0xff;
if(love+10>1023)love=1023;
else love=love+10;
delay(1000);
}
if(KeyValue==KeyCode[3])
{
KeyValue = 0xff;
if(love<10)love=0;
else love=love-10;
delay(1000);
}
}
delay(1000);
da5615(love);
daben=love;
P4OUT =dofly[daben/1000];
daben=daben%1000;
P5OUT = 0x01;
delay(1000);
P4OUT =dofly[daben/100];
daben=daben%100;
P5OUT = 0x02;
delay(1000);
P4OUT =dofly[daben/10];
daben=daben%10;
P5OUT = 0x04;
delay(1000);
P4OUT =dofly[daben];
P5OUT = 0x08; //点亮数码管LED1,
}
}
void delay(uint i)//延时函数
{
while(i–);
}
void da5615(uint da) //5615的驱动程序,即发生10位二进制数函数
{
uchar i;
//uchar j; //此为试验程序便于调查
//uchar k; //此为试验程序便于调查
uint han;
da<<=6;
P1OUT=0xf9;
P1OUT=0xf8;
for (i=0;i<12;i++)
{
han=(da&0x8000);
if(han==0x8000)
{P1OUT|=0xf2;}
else P1OUT&=0xfd;
//for(j=0;j<8;j++){delay(60000);} //此为试验程序便于调查
P1OUT|=0xf1;
da<<=1;
P1OUT&=0xfe;
}
P1OUT|=0xf4;
P1OUT&=0xfe;
delay(1000);
//for(k=0;k<8;k++)delay(40000); //此为试验程序便于调查
}
#pragma vector=PORT2_VECTOR
__interrupt void Port2INT(void)
{
uchar i;
uchar colpos=0x70;//列方位
uchar keytemp=0xff;
for(i=255;i>0;i–);//延时,消除颤动
for(i=0;i<4;i++)//扫描4列
{
colpos &= 0xf0;//坚持P1.4~P1.7为输出,屏蔽P1.0~P1.3
P2OUT=colpos;//输出列
_NOP();//延时
_NOP();
keytemp=P2IN & 0x0f;//获取值,屏蔽P1.4~P1.7
keytemp |= colpos;//得到队伍值,P1.0~1.3为行值,P1.4~P1.7为列值
if((keytemp&0x0f)!=0x0f) KeyValue=keytemp;//判别是否有按键按下
colpos>>=1;//右移一位,进行下一列扫描
colpos|=0x80;//高位补1,由于是低输出有用,右移时高位是补0的
}
P2OUT=0x00;//康复本来的值,使下次按键按下时能发生中止
P2IFG=0x00;//铲除中止标志位
}