MEGA16 1602液晶显示与PWM生成冲突问题

2019-03-24 20:36发布

最近我在写一个程序,T1两路输出比较口生成PWM波,两路外部中断输入分别是对应PWM波电压升高,第三路外部中断输入为同时减小两路PWM波电压,另外我还加了一块1602液晶显示数据,数据端口为PA口,控制端口为PC4,5,6口。所有子程序均是正确的,因为我以前都成功使用过。现在的问题是如果我删掉下面主程序注释的几行,则脉宽生成与控制能够正常执行,一旦加上后不但液晶屏不亮,而且脉宽生成与控制也不能够正常工作。我曾考虑过JTAGEN熔丝位,烧为1或0都试过。请问哪位高手能解决这个问题?是程序构架问题还是哪个细节没有注意到?
//======================================
const uchar str0[]={"-L_Revo: ,   rm-"};
const uchar str1[]={"-R_Revo: ,   rm-"};
//========函数声明=========
void ePutstr(uchar x,uchar y,uchar const *ptr);
void LocateXY(char posx,char posy);
void DisplayOneChar(uchar x,uchar y,uchar Wdata);
void InitLcd(void);
void LcdWriteCommand(uchar CMD,uchar Attribc);
void LcdWriteData(uchar W);
void WaitForEnable(void);

void init_devices(void);
void port_init(void);
void timer1_init(void);
void timer0_init(void);
//void adc_init(void);
void delay_ms(unsigned int time);
void delay_us(int time);
/*********************************************/

//**********************显示指定座标的一串字符子函数**************
void ePutstr(uchar x,uchar y,uchar const *ptr)
{
uchar i,l=0;
        while(ptr[l]>31){l++;}
        for(i=0;i<l;i++){
        DisplayOneChar(x++,y,ptr);
        if(x==16){
                x=0;y^=1;
        }
  }
}
/*********************************************/
void init_devices(void)
{
CLI();
port_init();
//adc_init();
timer0_init();                       
timer1_init();
TIMSK = 0x01;

MCUCR =0x00;
MCUCSR=0X40;
GICR  = 0x00;
ACSR=0x80;  
SREG=0x80;
}

/******************端口初始化**********************/
void port_init(void)
{
PORTA = 0xFF;//初始化输出1111 1111
DDRA  = 0xFF;//PA为输出

PORTB = 0xFF;//PB2必须为高
DDRB  = 0x0F; //PB0,1,2,3输入其他为输出

PORTC = 0xFF; //初始化输出1111 1111
DDRC  = 0xFF; //PC全部设为输出

PORTD = 0xFF;        //PD2,3必须为高
DDRD  = 0xB3;//PD2,3,6输入其他为输出
}
//***************************
void timer1_init(void)               
{
TCCR1A = 0xA3;       
TCCR1B = 0xC2;
}

//***************************
void timer0_init(void)
{                                                       
TCNT0 = 0x83;        
TCCR0 = 0x03;        
}                               
//**************T/C0中断服务子函数*************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)       
{                                                       
TCNT0 = 0x83;
if(++key_cnt>100)key_cnt=0;

if(key_cnt==0)       
{
if(SINT0==0){if(Wide1<1023)Wide1=Wide1+15;}
if(SINT1==0){if(Wide2<1023)Wide2=Wide2+15;}
if(SINT2==0){if(Wide1>0)Wide1=Wide1-15;}
if(SINT2==0){if(Wide2>0)Wide2=Wide2-15;}
}
}
/****************************************************/
//***************************
void main(void)                               
{
        init_devices();
            delay_ms(2);
        InitLcd();//LCD初始化
        LcdWriteCommand(0x01,1); //清屏
        LcdWriteCommand(0x0c,1); //显示开
        ePutstr(0,0,str0);  //字符串一
        delay_ms(2);
        ePutstr(0,1,str1);  //显示字符串二
        delay_ms(2);
        /********************************************/
        /********************************************/
                while(1)            
                {
                OCR1AH=(uchar)(Wide1>>8);
            OCR1AL=(uchar)(Wide1&0x00ff);
                OCR1BH=(uchar)(Wide2>>8);
            OCR1BL=(uchar)(Wide2&0x00ff); }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
落日归侠
2019-03-25 09:23
InitLcd();//LCD初始化
        LcdWriteCommand(0x01,1); //清屏
        LcdWriteCommand(0x0c,1); //显示开
        ePutstr(0,0,str0);  //字符串一
        delay_ms(2);
        ePutstr(0,1,str1);  //显示字符串二
就是这几行

一周热门 更多>