2074|3

28

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

两个循环的处理 [复制链接]

我打算用4X4矩阵键盘和DAC0832实现几种信号的产生,并改频率,但是怎么处理好不断的循环扫描键盘与波形不断产生的循环的关系呢

最新回复

我给一个思路吧 但这个思路不够稳定(建议最好是能上操作系统) 你把按键的程序交给定时器去处理,100ms的定时器扫描到按键就直接做了,主程序只做波形产生的程序   详情 回复 发表于 2016-4-27 22:35
 
点赞 关注

回复
举报

28

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
一下是我的程序

void main(void)
{
            WDTCTL = WDTPW + WDTHOLD;     // 关闭看门狗
                BCSCTL1 = CALBC1_1MHZ;//暂设1        MHZ
                DCOCTL = CALDCO_1MHZ;
                 P2DIR |= (BIT6+BIT7);                 //以下几句将P2.6,P2.7设置普通I/O口
                 P2SEL &=~(BIT6+BIT7);
             P2SEL2 &=~(BIT6+BIT7);
             P2DIR |=0xff;
             P2OUT |=0;
                 Delay_us(100);
                _BIS_SR(GIE);
        while(1)
                {
                        int l=1;
                         l = Check_Key();
                         switch(l)
                                   {
                                     case 1:triangle();break;     //三角波
                                     case 2:sin();     break;     //正弦波
                                     case 3:square();  break;     //方波
                                     case 4:saw();     break;     //锯齿波
                                     case 5:inc_f();  break;     //方波
                                     case 6:dec_f();     break;     //锯齿波
                                   }
                }
}
int Check_Key(void)
{
    int row,col,tmp1,tmp2;
    int key_val=16;
    tmp1 = 0x10;            //tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0
    for(row=0;row<4;row++)   // 行检测
     {
        P1DIR = 0xf0;
        P1OUT =~tmp1;            // 使P1.4~p1.7中有一个为0
        tmp1<<=1;             // tmp1左移一位
        if ((P1IN & 0x0f) < 0x0f)    // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测
         {
              delay_nms(100);
                  if ((P1IN & 0x0f) < 0x0f)
                 {
               tmp2 = 0x01;     // tmp2用于检测出哪一列为0
               for(col =0;col<4;col++)   // 列检测
               {
                  if((P1IN & tmp2)==0x00)  // 该列如果为低电平则可以判定为该列
                 {
                  key_val =row*4 +col; // 获取键值,识别按键;key_Map为按键的定义表
                  return (key_val);     // 退出循环
                 }
                tmp2<<=1;      // tmp2左移一位
              }
            }
        }
     }
    return (key_val);
}

void inc_f(void){
                  s++;
                        if(s>11)
                                s=1;
                        switch(l)
                        {
                        case 1:
                                   switch(s)
                                   {
                                     case 1:CCR0=1251;break; //50
                                     case 2:CCR0=626;break; //100
                                     case 3:CCR0=312;break; //200
                                     case 4:CCR0=208;break; //300
                                     case 5:CCR0=156;break; //400
                                     case 6:CCR0=125;break; //500
                                     case 7:CCR0=104;break; //600
                                     case 8:CCR0=89;break;  //700
                                     case 9:CCR0=78;break;   //800
                                     case 10:CCR0=69;break;  //900
                                     case 11:CCR0=62;break;  //1000
                                   }
                                   break;
                        case 2:
                                   switch(s)
                                   {
                                         case 1:CCR0=962;break; //50
                                         case 2:CCR0=480;break; //100
                                         case 3:CCR0=240;break; //200
                                         case 4:CCR0=160;break; //300
                                         case 5:CCR0=120;break; //400
                                         case 6:CCR0=96;break;  //500
                                         case 7:CCR0=80;break;  //600
                                         case 8:CCR0=69;break;  //700
                                         case 9:CCR0=60;break;  //800
                                         case 10:CCR0=53;break; //900
                                         case 11:CCR0=48;break; //1000
                                        }
                                        break;
                        case 3:
                                   switch(s)
                                   {
                                         case 1:CCR0=5000;break; //50
                                         case 2:CCR0=2501;break; //100
                                         case 3:CCR0=1250;break; //200
                                         case 4:CCR0=830;break;  //300
                                         case 5:CCR0=625;break;  //400
                                     case 6:CCR0=500;break;  //500
                                         case 7:CCR0=417;break;  //600
                                         case 8:CCR0=357;break;  //700
                                         case 9:CCR0=312;break;  //800
                                         case 10:CCR0=278;break; //900
                                         case 11:CCR0=250;break; //1000
                                   }
                                   break;
                        case 4:
                                   switch(s)
                                   {
                                         case 1:CCR0=2458;break; //50
                                         case 2:CCR0=1229;break; //100
                                     case 3:CCR0=614;break;  //200
                                         case 4:CCR0=409;break;  //300
                                         case 5:CCR0=306;break;  //400
                                         case 6:CCR0=245;break;  //500
                                         case 7:CCR0=204;break;  //600
                                         case 8:CCR0=175;break;  //700
                                         case 9:CCR0=153;break;  //800
                                         case 10:CCR0=136;break; //900
                                         case 11:CCR0=122;break; //1000
                                   }
                                   break;
                                   default:CCR0=100;break;
                         }
}

void dec_f(void){
                  s--;
                        if(s<=0)
                                s=11;
                        switch(l)
                        {
                        case 1:
                                   switch(s)
                                   {
                                     case 1:CCR0=1251;break; //50
                                     case 2:CCR0=626;break; //100
                                     case 3:CCR0=312;break; //200
                                     case 4:CCR0=208;break; //300
                                     case 5:CCR0=156;break; //400
                                     case 6:CCR0=125;break; //500
                                     case 7:CCR0=104;break; //600
                                     case 8:CCR0=89;break;  //700
                                     case 9:CCR0=78;break;  //800
                                     case 10:CCR0=69;break; //900
                                     case 11:CCR0=62;break; //1000
                                   }
                                   break;
                        case 2:
                                   switch(s)
                                   {
                                         case 1:CCR0=962;break; //50
                                         case 2:CCR0=480;break; //100
                                         case 3:CCR0=240;break; //200
                                         case 4:CCR0=160;break; //300
                                         case 5:CCR0=120;break; //400
                                         case 6:CCR0=96;break;  //500
                                         case 7:CCR0=80;break;  //600
                                         case 8:CCR0=69;break;  //700
                                         case 9:CCR0=60;break;  //800
                                         case 10:CCR0=53;break; //900
                                         case 11:CCR0=48;break; //1000
                                        }
                                        break;
                        case 3:
                                   switch(s)
                                   {
                                         case 1:CCR0=5000;break; //50
                                         case 2:CCR0=2501;break; //100
                                         case 3:CCR0=1250;break; //200
                                         case 4:CCR0=830;break;  //300
                                         case 5:CCR0=625;break;  //400
                                     case 6:CCR0=500;break;  //500
                                         case 7:CCR0=417;break;  //600
                                         case 8:CCR0=357;break;  //700
                                         case 9:CCR0=312;break;  //800
                                         case 10:CCR0=278;break; //900
                                         case 11:CCR0=250;break; //1000
                                   }
                                   break;
                        case 4:
                                   switch(s)
                                   {
                                         case 1:CCR0=2458;break; //50
                                         case 2:CCR0=1229;break; //100
                                     case 3:CCR0=614;break;  //200
                                         case 4:CCR0=409;break;  //300
                                         case 5:CCR0=306;break;  //400
                                         case 6:CCR0=245;break;  //500
                                         case 7:CCR0=204;break;  //600
                                         case 8:CCR0=175;break;  //700
                                         case 9:CCR0=153;break;  //800
                                         case 10:CCR0=136;break; //900
                                         case 11:CCR0=122;break; //1000
                                   }
                                   break;
                                   default:CCR0=100;break;
                        }
}


/***************************************************************************************************/
/***************************************定时器中断服务函数***********************************************/
/***************************************************************************************************/

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
   //三角波
   if(l==1)
   {
           switch(k)
                   {
                     case 1:
                                write_dac(i);
                                i+=4;
                            if(i>=252)
                            {
                                    k=2;
                                    i=255;
                            }
                            break;

                     case 2:
                                write_dac(i);
                                i-=4;
                            if(i<=3)
                            {
                              k=1;
                              i=0;
                            }
                            break;
                     default:k=1;break;
                   }
   }
   //正弦波
   if(l==2)
   {
                j++;
                if(j==164)
                j=0;
                write_dac(sin_a[j]);
                CCR1=0;
   }
   //方波
   if(l==3)
   {
           m++;
           switch(m)
                  {
                          case 1:write_dac(0xff);break;
                          case 2:write_dac(0x00);m=0;break;
                          default:m=0;break;
                  }
   }
   //锯齿波
   if(l==4)
   {
           n+=2;
           if(n==256)
           i=0;
           write_dac(n);
   }
}
/***************************************************************************************************/
/******************************************子函数:***************************************************/
/***************************************************************************************************/

/********************DAC部分*************************/
//DAC数据口
void write_dac(uint data)
{
        P2OUT = data;
}

//三角波
void triangle(void)
{
        BCSCTL1 = CALBC1_16MHZ;       //DCO频率为16MHz
        DCOCTL = CALDCO_16MHZ;
        CCTL0 = CCIE;
        CCR0 = 62;
        TACTL = TASSEL_2 + MC_3;      // SMCLK, 增减计数模式
        _EINT();
}

//正弦波
void sin(void)
{
        BCSCTL1 = CALBC1_16MHZ;
        DCOCTL = CALDCO_16MHZ;
        CCTL0 = CCIE;
        CCR0 = 48;
        TACTL = TASSEL_2 + MC_3;
        _EINT();
}

//方波
void square(void)
{
        BCSCTL1 = CALBC1_1MHZ;
        DCOCTL = CALDCO_1MHZ;
        CCTL0 = CCIE;
        CCR0 =250;

        TACTL = TASSEL_2 + MC_3;
        _EINT();
}

//锯齿波
void saw(void)
{
        BCSCTL1 = CALBC1_16MHZ;
        DCOCTL = CALDCO_16MHZ;
        CCTL0 = CCIE;
        CCR0 =122;
        TACTL = TASSEL_2 + MC_1;
        _EINT();
}


 
 

回复

1234

帖子

4

TA的资源

纯净的硅(高级)

板凳
 
我给一个思路吧 但这个思路不够稳定(建议最好是能上操作系统)

你把按键的程序交给定时器去处理,100ms的定时器扫描到按键就直接做了,主程序只做波形产生的程序

点评

ymh
那我就要用两个定时器了,一个用来扫面按键,一个用来产生波形  详情 回复 发表于 2016-4-28 08:50
 
个人签名天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

4
 
ywlzh 发表于 2016-4-27 22:35
我给一个思路吧 但这个思路不够稳定(建议最好是能上操作系统)

你把按键的程序交给定时器去处理,100ms ...

那我就要用两个定时器了,一个用来扫面按键,一个用来产生波形
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表