⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 no2.c

📁 12864LCD液晶仿真
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define uint  unsigned int
#define LEFT 0
#define RIGHT 1
#define CMD 0
#define DATA 1
#define LCD_STATUS_BUSY 0x80
#define  START_LINE0   0xc0
#define  DISPLAY_ON    0x3f
#define  DISPLAY_OFF   0x3e
#define  PARA1         0x40
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/

uchar  time_logo[5][32] = {
/*--  文字:  时  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,

/*--  文字:  爱 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0xB0,0x92,0x96,0x9A,0x92,0xF2,0x9E,0x92,0x91,0x99,0x95,0x91,0x50,0x30,0x00,
0x00,0x00,0x40,0x30,0x8C,0x83,0x46,0x2A,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,0x00,

/*--  文字:  你 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x20,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,
0x00,0x00,0xFF,0x00,0x00,0x08,0x04,0x43,0x80,0x7F,0x00,0x01,0x06,0x0C,0x00,0x00,
/*--  文字:  我  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x24,0x24,0x24,0xfe,0x23,0x22,0x20,0xFF,0x20,0x22,0xac,0x20,0x30,0x20,0x00,
0x00,0x08,0x48,0x84,0x7F,0x02,0x21,0x10,0x09,0x06,0x1A,0x61,0x80,0xE0,0x00,0x00,

};

uchar  menu[5][32] = {
/*--  文字: 一 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字: 二 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x008,0x0c,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
/*--  文字: 三 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x084,0xc4,0x86,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
/*--  文字: 四 --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xfc,0x04,0x04,0x04,0xfc,0x04,0x04,0x04,0xfc,0x004,0x04,0x04,0xfe,0x04,0x00,
0x00,0x7f,0x20,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x20,0x22,0x22,0x7f,0x00,0x00,

};

 
 void delay_1us(void);                 //1us延时函数
 void delay_nus(unsigned int n);       //N us延时函数
 void delay_1ms(void) ;                //1ms延时函数
 void delay_nms(unsigned int n) ;      //N ms延时函数
 
 /***********************************************************************/
 /**********************************************************************/
void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
  
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   {
      delay_1ms();
   }   
  }
  
  void delay(uint ms)
{
        uint i,j;
	for(i=0;i<ms;i++)
	   {
	   for(j=0;j<1141;j++);
       }
}
void Lcd_Write_Byte(uchar temp)
{   
    PORTB|=BIT(0);
    PORTB&=~BIT(1);    //W
    PORTB|=BIT(4); //E使能
    DDRA=0xff; //a输出
    PORTA=temp;
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    PORTB&=~BIT(4);	 
    PORTA=0xff;
}
void Lcd_Write_COM(uchar COL)
{   
    PORTB&=~BIT(0);
    PORTB&=~BIT(1);    //W
    PORTB|=BIT(4); //E使能
    DDRA=0xff; //a输出
    PORTA=COL;
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    PORTB&=~BIT(4);	 
 
}


void set_page_L(unsigned char page)	/*设置X地址 设置页*/  //0-7
{
   Lcd_Write_COM(0xb8|page);                     
}
void set_page_R(unsigned char page)	/*设置X地址 设置页*/ //0-7
{
    Lcd_Write_COM(0xb8|page);                     
}

void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
{
     
   Lcd_Write_COM(0x40|col);                     
}

void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
{
    Lcd_Write_COM(0x40|col);                        
}


/********************************************************************************************
* 函数名称:Lcd_Set_X_Y(uchar x, uchar y )
* 功    能:LCD设置x y坐标
* 入口参数:x y
* 出口参数:无
*********************************************************************************************/
void Lcd_Set_X_Y(uchar x, uchar y)
{   
   if(y<64)
      {   PORTB&=~BIT(3);
	      PORTB|=BIT(2);
	   
		set_col_addr_L(y);
	  }
   else
      {   
		   PORTB|=BIT(3);
	    PORTB&=~BIT(2);
		set_col_addr_R(y);
	  }
   set_page_L( x);
   set_page_R( x);
}

/****************************************************************************
* 名称:Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )
* 功能:显示16*16字符(汉字)       
* 入口参数:x y data
* 出口参数:无
*说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
****************************************************************************/
void Lcd_Character_16X16( uchar bit_flag, uchar x, uchar y, uchar  *point )
{
   uchar i,j,temp ;
   temp=y;
   if( bit_flag )
   {
      for( i=0; i<2; i++ )
      {
         x+=i;
	     y=temp;
         for( j=0;j<16;j++ )
         {
            Lcd_Set_X_Y( x, y ); y++;
            Lcd_Write_Byte( point[ i*16 + j] );  
         } 
      }
   }
   else
   {
      for( i =0; i<2; i++ )
      {
         x+=i;
         y=temp;
         for( j = 0; j < 16; j++ )
         {
            Lcd_Set_X_Y( x, y );
			y++;
            Lcd_Write_Byte( ~ point[ i * 16 + j ] );
			
         }
		
      }
   }
}
uchar key_press()
{
    uchar j;
    DDRD|=0X0F;
	PORTD|=0X0F;
	
	DDRD&=0XF0;
	
	j=PIND;
	j=j&0X0F;//00001111
	if(j==0X0F)
	{
	  return 0;
	}
	else
	{
	 return 1;
	}
	
}

uchar key_scan()
{
    uchar key;
    delay(10);
	if(key_press())
	{
	key=PIND;
	key&=0X0F;
	switch(key)
	{
	   case 0X0E: 
	       key=1;
		   break;
	   case 0X0D:
	       key=2;
		   break;
	   	 case 0X0B: 
	       key=3;
		   break;
	   case 0X07:
	       key=4;
		   break; 
	   default:	
	       key=16;     	   
	}
	  while(key_press());
	}
	else
	{
	  key=16;
	}
	return key;
}

void Lcd_Function( uchar temp )
{
   uchar time_flag = 0;
   uchar alarm_flag = 0;
   uchar m=0;
   uchar n=0;
    switch(temp)
	{case 1:
	  time_flag = 1; break;
	 case 2:
	  alarm_flag= 1; break;
	 case 3:
	   m=1; break;
	 case 4:
	   n=1; break;
	 default:
	  ;

	}

   //时间设置
   Lcd_Character_16X16( time_flag, 0, 0, time_logo[3] );
   Lcd_Character_16X16( time_flag, 0, 16, time_logo[1] );
   Lcd_Character_16X16( time_flag, 0, 32, time_logo[2] );
   Lcd_Character_16X16( time_flag, 0, 48, menu[0] );
   //闹钟设置
   Lcd_Character_16X16( alarm_flag, 2, 0, time_logo[3] );
   Lcd_Character_16X16( alarm_flag, 2, 16, time_logo[1] );
   Lcd_Character_16X16( alarm_flag, 2, 32, time_logo[2] );
   Lcd_Character_16X16( alarm_flag, 2, 48, menu[1] );
   
   Lcd_Character_16X16( m, 4, 0, time_logo[3] );
   Lcd_Character_16X16( m, 4, 16, time_logo[1] );
   Lcd_Character_16X16( m, 4, 32, time_logo[2] );
   Lcd_Character_16X16( m, 4, 48, menu[2] );
   
   Lcd_Character_16X16( n, 6, 0, time_logo[3] );
   Lcd_Character_16X16( n, 6, 16, time_logo[1] );
   Lcd_Character_16X16( n, 6, 32, time_logo[2] );
   Lcd_Character_16X16( n, 6, 48, menu[3] );
}
void main()
{
    unsigned int i,j,k=1;
   //init_port();//自己加,主要是控制线所在端口为输出
    DDRB = 0xff; 
	Lcd_Function(1);
	
	while(1)
	{   i=key_press();
	if(i)
	{
	 j=key_scan();
	switch(j)
	  {
	   case 1: 
	       k=k+1;
		   break;
	   case 2:
	       k=k-1;
		   break;
		default:
		;
		
	  }  
	  
	 if(k>4) k=1;
	 if(k<1) k=4;
     
	Lcd_Function(k);
	}
	 
   }
}

⌨️ 快捷键说明

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