key_dis.c

来自「自己写的2262遥控解码程序」· C语言 代码 · 共 185 行

C
185
字号

//define idle flag
#define LCD_busy  0X80

/********************************************************
*  函数说明:延时函数,ATMEGA8,内部2MHz,j<276时约1ms      *
             1MHz,j<135;4MHz,j<562 
********************************************************/
void delay(uint ms)
{
    uint i,j;
	for(i=0;i<ms;i++)
	   {
	   for(j=0;j<562;j++);
       }
}

/********************************************************
*  函数说明:延时函数,ATMEGA8,内部2MHz,j<5时约50us     *
             1MHz,j<2 ;4MHz,j<19 
********************************************************/
void delay50(uint us)
{
    uint i,j;
	for(i=0;i<us;i++)
	{
	   for(j=0;j<19;j++);
    }
}

/********************************************************
*  函数说明:检测按键函数                               *
*  返回值:  有键按下为1,无键按下为0                   *
********************************************************/
uchar key_press()
{   
   uchar k;
   //uchar sreg;
   //sreg=(SREG&BIT(7));       //保存SREG bit 7
   //SREG&=~(1<<7);            //关闭CPU总中断请求
   DDRC|=((1<<DDC0)|(1<<DDC1));     //key1:PC0;key2:PC1  00000011=0x03
   PORTC|=((1<<PC0)|(1<<PC1));
   
   DDRC&=~((1<<DDC0)|(1<<DDC1));   //11111100  PB2 PB4 输入
   k=PINC;
   k=k&((1<<DDC0)|(1<<DDC1));
   if(k==0x03)
   {
       //SREG|=sreg;         //恢复SREG bit 7
	   return 0;
   }
   else
   {
       //SREG|=sreg;         //恢复SREG bit 7
   	   return 1;
   }
}

/********************************************************
*  函数说明:按键扫描函数                               *
*  返回值:  1键按下为1,2键按下为2,其他为0            *
********************************************************/
uchar key_scan()
{
    uchar key;
	//sreg=(SREG&BIT(7));       //保存SREG bit 7
	//SREG&=~(1<<7);     //关闭CPU总中断请求
    delay(10);
	if(key_press())
	{
	key=PINC;
	key=key&((1<<DDC0)|(1<<DDC1));
	switch(key)
	{
	   case 0x02: 
	       key=1;
		   break;
	   case 0x01:
	       key=2;
		   break;
	   default:	
	       key=0;     	   
	}
	while(key_press());
	}
	else
	{
	  key=0;
	}
	//SREG|=sreg;         //恢复SREG bit 7
	return key;
}

/********************************************************
*  函数说明:向1602发送指令                             *
*  输入:    需要发送的指令                             *
********************************************************/
void write_com(uchar com)
{
       PORTC&=~(1<<PC5);  //RS=0,command mode
	   PORTC&=~(1<<PC4);  //R/W=0,write mode
	   PORTD=com;
	   PORTC|=(1<<PC3);   //Enable LCD
	   delay(2);
	   PORTC&=~(1<<PC3);   //disable LCD
}

/********************************************************
*  函数说明:向1602发送数据                             *
*  输入:    需要发送的数据(一个字符)                 *
********************************************************/
void write_dat(uchar dat)
{     
       PORTC|=(1<<PC5);   //RS=1,data mode
	   PORTC&=~(1<<PC4);  //R/W=0,write mode
	   PORTD=dat;
	   PORTC|=(1<<PC3);    //Enable LCD
	   delay(2);
	   PORTC&=~(1<<PC3);   //disable LCD

}

/********************************************************
*  函数说明:等待1602空闲状态函数                        *
********************************************************/
void wait1602ready()
{
	PORTC|=(1<<PC4);  //R/W=1,read mode
	PORTC&=~(1<<PC5);  //RS=0,command mode
	
	PORTC|=(1<<PC3);    //Enable LCD
    PORTD=0xff;
	DDRD=0x00;
	//DelayUs(10);	
	while(!(PIND&LCD_busy)); //wait LCD idle	
	DDRD=0xff;
	PORTC&=~(1<<PC3);   //disable LCD
}

/********************************************************
*  函数说明:1602初始化函数                              *
********************************************************/
void init_1602()
{
      DDRD=0XFF;
	  DDRC|=(1<<PC3)|(1<<PC4)|(1<<PC5);	    
	  PORTC&=~(1<<PC3);   //disable LCD
	  
	  write_com(0X38);   //display mode:16X2,5X7dot
	  wait1602ready();
	  write_com(0X01);   //display clear
	  wait1602ready();
	  write_com(0X0C);   //open dis,no cursor
	  wait1602ready();
	  write_com(0X06);   //point+1,cursor+1 when read or write a char
	  wait1602ready(); 
}

/********************************************************
*  函数说明:显示一串字符                    *
********************************************************/
void write_str(char *ucstr)
{	
	while(*ucstr)
	{
	    write_dat(*ucstr);				
		ucstr++;
		wait1602ready();
	}	
}

/********************************************************
*  函数说明:设置显示坐标函数                           *
********************************************************/
void setxy_1602(uchar x,uchar y)
{
	uchar addr;	
	if(y == 0)
		addr = 0x80 + x;
	else
		addr = 0xc0 + x;		
	write_com(addr);
	wait1602ready();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?