最近我在写一个程序,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); }
}
此帖出自小平头技术问答
LcdWriteCommand(0x01,1); //清屏
LcdWriteCommand(0x0c,1); //显示开
ePutstr(0,0,str0); //字符串一
delay_ms(2);
ePutstr(0,1,str1); //显示字符串二
就是这几行
一周热门 更多>