微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430DA应用,可键盘程控

msp430DA应用,可键盘程控

时间:11-13 来源:互联网 点击:
自己刚刚学习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;//清除中断标志位
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top