|  | 
 
| 本帖最后由 erteron 于 2010-5-29 04:09 编辑 
 rGPBDAT = 0x1e0;      //蜂鸣器不响,LED灭
 rSRCPND = rSRCPND | (0x1<<14);
 rINTPND = rINTPND | (0x1<<14);
 rINTMSK = ~(0x1<<14);            //打开定时器4中断(这是人家写的,不知道为撒是定时器四~我认为应该是定时器0才对`~
 
 rTCFG0 &= 0xFF00FF;
 rTCFG0 |= 0xf900;        // prescaler等于249
 rTCFG1 &= ~0xF0000;
 rTCFG1 |= 0x20000;     //divider等于8,则设置定时器4的时钟频率为25kHz
 rTCNTB0 =0xff;              //让定时器4每隔200us秒中断一次(这里原先是125000,但是觉得不对改了,乱改的,不知道咋产生一个 200us的中断)
 
 rTCON &= ~0x1F;
 rTCON |= 0xf;//死区无效,自动装载,电平反转,手动更新,定时器开启
 rTCON &= ~0x2;  //手动更新位清零,PWM开始工作
 
 pISR_TIMER4 = (U32)Timer4_ISR;
 Lcd_ClearScr( (0xff<<11) | (0xf<<5) | (0x1f) ) ;
 while(1)
 {
 Uart_Printf("rTCNTB0=%d      RTCPMB0=%d\n",rTCNTB0,rTCMPB0);
 time++;
 rTCNTB0 =0xff;//重新赋值
 if(time>25)//每20ms 调整一下占空比
 {
 time=0;
 if(ledDirection==0&&ii<=99)
 {
 rTCMPB0=rTCNTB0*((float)ii/100);
 ii++;
 if(ii>99)
 {
 ii=100;
 ledDirection=1;
 }
 }
 if(ledDirection==1&&ii>=0)
 {
 //rTCMPB0=rTCNTB0*(ii/100);
 ii--;
 if(ii<0)
 {
 ii=0;
 ledDirection=0;
 }
 }
 ledcounter=ii;
 }
 if(ledcounter>0)
 {
 rGPBDAT=~0x1e0;
 ledcounter--;
 }
 else
 {
 rGPBDAT=0x1e0;
 }
 
 }
 看了两天的pwm ,还是没有弄的特别明白,只是知道 控制占空比,实现变化~~但是我是一个地道的初学者,基础很差~~呵呵请大侠帮忙下 ,谢谢·~
 这是程序的一部分,主要目的是让led 按100级亮度从小到大在到小亮~~但是这个我不会设置定时器每200us 中断一次,中间while是自己写的,但是改了好几次,也不知道咋弄~~虽然这个是按100级亮度亮了,但是 是闪烁的,那位大侠可以改改,放上来大家学习下~~我也受教了~~
 | 
 |