程序仿真问题

2019-07-18 10:38发布

按键后没有反应,不知道哪里的问题,急啊!!!那位大神帮帮忙,不胜感激!!!

// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}
void time0_init(void)
{
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x4E;
TIMSK |=0x02;
TIFR |=0x02;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
time0_init();
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

/*************************************************************************
用    途:LCD1602显示
Taget   :mega8
crystal :8M
介    绍:用PB做端口,
         PC0-D0
   PC7-D7
   ------
   PA4-6
   PA3-5
   PA2-4----456为控制引脚
入口参数:
出口参数:
*************************************/
//延时程序
void delay(unsigned int ms)
{
   unsigned int i,j;
  for(i=0;i<ms;i++)
   {for(j=0;j<200;j++);}
}

//送指令子程序
void com_lcd(unsigned char com)
{
   PORTA&=~(1<<PA4);
  PORTA&=~(1<<PA2);
  PORTA&=~(1<<PA3);
  PORTC=com;
  PORTA|=(1<<PA4);
  delay(5);
  PORTA&=~(1<<PA4);
}
//送数据子程序
void data_lcd(unsigned char data)
{
   PORTA&=~(1<<PA4);
  PORTA|=(1<<PA2);
  PORTA&=~(1<<PA3);
  PORTC=data;
  PORTA|=(1<<PA4);
  delay(5);
  PORTA&=~(1<<PA4);
}
//初始化
void LCD1602_init()
{
   DDRC=0XFF;
  DDRA|=0X1C;
  PORTA&=~(1<<PA4);

  delay(15);
  com_lcd(0x38);
  delay(5);
  com_lcd(0x38);
  delay(5);
  com_lcd(0x38);
  delay(5);
  com_lcd(0x38);//5*7,2行显示
  delay(5);
  com_lcd(0x08); //清屏
  delay(5);
  com_lcd(0x01); //清屏
  delay(5);
  com_lcd(0x06);//文字不动,光标自动右移
  delay(5);
  com_lcd(0x0C);//开显示
  delay(5);
}
//定位x,y(x-列,y-行)
void LCD1602_goxy(unsigned char line,unsigned char row)
{
if (row==0)
  line+=0x80;
else
  line+=0xc0;
com_lcd(line);//第二行首地址
delay(5);
}
//显示字符串
LCD1602_print(char *str)
{
while(*str)
{
  data_lcd(*str);
  delay(10);
  str++;
}
}

//**************************************************************************
/************************************************
按键初始化
*******************************/
unsigned char get_key0(void)
{
static unsigned char key_flag = 0;
if (key_flag == 0)
{
  if((PINA & 0x20)==0x00 )
  {
   key_flag = 1;
  }
}
else if (key_flag == 1)
{
  if((PINA & 0x20) == 0x20 )
  {
   key_flag = 0;
   return (1);
  }
}
return (0);
}
unsigned char key0_flag =0;
unsigned char nokey_flag =0;
#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr()
{
  static unsigned int key_count = 0;//compare occured TCNT0=OCR0
  TIFR |=0x02;
  TCNT0=0x00;
  if (get_key0()==1)
  {  
   key_count = 0;
   key0_flag = 1;
  }
}
/*********************************************************
主函数
**************************************************/

void main()
{
unsigned char i=23;
init_devices();
LCD1602_init();

LCD1602_goxy(0,0);
LCD1602_print("nokey is pressed");

while(1)
{
  if (key0_flag == 1)
  {
   
   LCD1602_print("key0 is pressed");
   key0_flag = 0;
  }
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。