×
嵌入式 > 技术百科 > 详情

msp430DA应用,可键盘程控

发布时间:2020-06-20 发布时间:
|
         自己刚刚学习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;//清除中断标志位
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
物联传感与Atmel强强联手 达成智能家居战略合作协议