通过矩阵键盘,用PWM来实现呼吸灯的效果

来源:互联网 发布:淘宝店铺信誉度怎么提升的 编辑:程序博客网 时间:2024/04/28 04:55
任务如标题,但是这个程序我现在并没有写对,先发上来,等到以后自己能找到问题了在进行修改
#include <hidef.h>      /* common defines and macros */#include "derivative.h"      /* derivative-specific definitions */ #define BUS_CLOCK   40000000 #define OSC_CLOCK   20000000 void INIT_PLL(void){       CLKSEL=0;     SYNR=0xc0|0x04;    REFDV=0x80|0x01;    POSTDIV=0x00;       PLLCTL_PLLON=1; //打开锁相环    _asm(nop);    _asm(nop);    while(!(CRGFLG_LOCK==1)); //判断PLL是否稳定    CLKSEL_PLLSEL=1;}void init_pwm(void){                            PWMCTL_CON01=1;      //将0 1通道级联    PWMPOL_PPOL1=1;      //设置1通道在周期开始时输出高电平    PWMCAE=0;            //设置其脉冲对齐方式为左对齐    PWMPRCLK=0x44;       //将时钟A B预分频为总线时钟的1/16    PWMSCLA=25;          //时钟SA=时钟A/50    PWMCLK=0x02;         //选择时钟SA为时钟源        PWMPER01=1400;       //0 1通道的周期为1400*时钟周期    PWMDTY01=0;          //0 1通道占空比为100    PWME_PWME1=1;        //使能PWM}void delay(void){    unsigned int i,j;    for(i=0;i<3;i++)for(j=0;j<3;j++);}                                  unsigned char keyboard()   {    unsigned char key=0;    unsigned char temp3,temp2;    unsigned int a,b,c;    DDRB=0x00;    DDRT=0xff;    PTT=0XFF;    temp3=PTT&0xff;    if(temp3!=0xff) {      delay();      temp3=PTT&0xff;      if(temp3!=0xff) {         temp3=PTT&0xff;      switch(temp3) {        case 0xef: a=1;break;        case 0xdf: a=2;break;        case 0xbf: a=3;break;        case 0x7f: a=4;break;        default: break;      }      }    }    DDRB=0xff;    DDRT=0x00;    PORTB=0XFF;    temp2=PORTB&0xff;    if(temp2!=0xff) {      delay();      temp2=PORTB&0xff;      if(temp2!=0xff) {         temp2=PORTB&0xff;      switch(temp2) {        case 0xfe: b=1;break;        case 0xfd: b=2;break;        case 0xfb: b=3;break;        case 0xf7: b=4;break;        default: break;      }      }    }    c=a*10+b;    switch(c){      case 11: key=1;break;      case 12: key=2;break;      case 13: key=3;break;      case 14: key=4;break;      case 21: key=5;break;      case 22: key=6;break;      case 23: key=7;break;      case 24: key=8;break;      case 31: key=9;break;      case 32: key=10;break;      case 33: key=11;break;      case 34: key=12;break;      case 41: key=13;break;      case 42: key=14;break;      case 43: key=15;break;      case 44: key=16;break;      default: break;    }    return key;  } void main(void) {  unsigned char key; // DisableInterrupts;  DDRB=0XFF;  PORTB=0XFF;  INIT_PLL();  init_pwm();  keyboard();//EnableInterrupts;for(;;){    if (key==1)     {      break;    }        //_FEED_COP();      break;   }         for(;;)   {  delay();  for(PWMDTY01=0;PWMDTY01<=1960;)  {    PWMDTY01=PWMDTY01+20;    //PWMDTY01+=20;    delay();  }  for(PWMDTY01=1960;PWMDTY01>0;)  {    PWMDTY01=PWMDTY01-20;    //PWMDTY01-=20;    delay();  }}   }                   

0 0