Exemplo n.º 1
0
//打点绘图,适用于在屏幕上打稀疏的几个点,不能用于横行连续打点
void LCD_draw_point(uchar x, uchar y) 
 {
   uchar x_byte, x_bit;         //在横坐标的哪一个字节,哪一个位
   uchar y_byte, y_bit;    //在纵坐标的哪一个字节,哪一个位
   x_byte=x/16;                   //算出它在哪一个字节(地址)
                                      //注意一个地址是16位的
   x_bit=x%16;                    //(取模)算出它在哪一个位
   y_byte=y/32;                    //y是没在哪个字节这个说法
                             //这里只是确定它在上半屏(32行为一屏)还是下半屏
                                     //0:上半屏 1:下半屏
   y_bit=y%32;                    //y_bit确定它是在第几行
   LCD_write_com(0x34);         //打开扩展指令集
  
 LCD_write_com(0x80+y_bit);       //垂直地址(上)   貌似与说明书正好相反
   LCD_write_com(0x80+x_byte+8*y_byte);  //先写水平坐标(下)   貌似与说明书正好相反    ???????
 
                                      //具体参照数据手册 
                                               //下半屏的水平坐标起始地址为0x88
                                     //(+8*y_byte)就是用来确定在上半屏还是下半屏
   if(x_bit<8)                              //如果x_bit位数小于8
   {
       LCD_write_dat(0x01<<(7-x_bit));    //写高字节。因为坐标是从左向右的
                                                //而GDRAM高位在左,低位在右
    LCD_write_dat(0x00);                   //低字节全部填0
   }
   else
   {
       LCD_write_dat(0x00);                   //高字节全部填0
       LCD_write_dat(0x01<<(15-x_bit));
   } 
   LCD_write_com(0x36);                     //打开绘图显示
   LCD_write_com(0x30);               //回到基本指令集
 }
Exemplo n.º 2
0
void Display_photo1(const uchar *img1)           //写上半屏图形数据函数
{
   int i,j;     

   for(i=0;i<32;i++)                             //上半屏32行
    {  
	LCD_write_com(FUN_MODEK);                //扩展指令,开绘图显示
        delay_us(50);
     
 	LCD_write_com(Yaddress+i);               //先写垂直地址,即Y地址,不能自动加一
        delay_us(50);

        LCD_write_com(X1address);                //再写水平地址,即X地址
        delay_us(50);
      
 	for(j=0;j<8;j++)                         //连续写入2个字节的数据,一共8次,为一行,即16*8位数据
        {  			                                     
		LCD_write_data(img1[i*16+j*2]);
		delay_us(50);                     //这个延时是必须的,因为没有对液晶进行判忙操作,所以进行延时
		LCD_write_data(img1[i*16+j*2+1]); 
		delay_us(50);          
        }

    }
}
Exemplo n.º 3
0
void LCD_init(void)
{        
 LCD_write_com(0x30);             //选择基本指令集   
 LCD_write_com(0x0c);       //开显示,无游标,不反白
 LCD_write_com(0x01);       //清除显示屏幕,把DDRAM位址计数器调整为00H
 Delay_nms(5);         //清屏操作时间较长1.6ms 因此加此延时
 LCD_write_com(0x02);       //清DDRAM位址归位,此处貌似与清屏重复
 LCD_write_com(0x06);       //设定光标右移,整体显示不移动
}
Exemplo n.º 4
0
//***********************************************************************
//	显示屏初始化函数
//***********************************************************************
void LCD_init(void) 
{
  LCD_write_com(FUN_MODE);			//显示模式设置
  delay_ms(1);
  LCD_write_com(FUN_MODE);			//显示模式设置
  delay_ms(1);
  LCD_write_com(DISPLAY_ON);			//显示开
  delay_ms(1);
  LCD_write_com(CLEAR_SCREEN);			//清屏
  delay_ms(1);
}
Exemplo n.º 5
0
/*отй╬фа╣╔вж╥Шп╢хК╨╞йЩ*/
void LCD_write_char(uchar x,uchar y,uchar data) 
{
    if (y == 0) 
	{
    	LCD_write_com(0x80 + x);
    }
    else 
	{
    	LCD_write_com(0xC0 + x);
    }
    	LCD_write_data(data);  
}
Exemplo n.º 6
0
void LCD_draw_clr(void)
{ 
uchar i,j;
     LCD_write_com(0x34);      //8Bit扩充指令集,即使是36H也要写两次
    LCD_write_com(0x36);      //绘图ON,基本指令集里面36H不能开绘图 
     for(i=0;i<32;i++)            //12864实际为256x32
     {
           LCD_write_com(0x80+i);      //行位置    貌似与说明书正好相反 (上)
           LCD_write_com(0x80);      //列位置     貌似与说明书正好相反    (下)
           for(j=0;j<32;j++)            //256/8=32 byte
     LCD_write_dat(0);
  }
  LCD_write_com(0x30);     //开基本指令集
}
Exemplo n.º 7
0
/*отй╬фавж╥Ш╢╝п╢хК╨╞йЩ*/
void LCD_write_str(uchar x,uchar y,uchar *s) 
{
    if (y == 0) 
	{
    	LCD_write_com(0x80 + x);
    }
    else 
	{
    	LCD_write_com(0xC0 + x);
    }
    while (*s) 
	{
    	LCD_write_data( *s);
    	s ++;
    }
}
Exemplo n.º 8
0
//***********************************************************************
//函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
  LCD_write_com(addr);
  delay_ms(1);
  while(*hz != '\0')  
  {
    LCD_write_data(*hz);
    hz++;
    delay_ms(1);
  }

} 
Exemplo n.º 9
0
void LCD_draw_word(uchar *x, uchar y) 
 {
  uchar i,j,k,m,n,count=0;
   uchar hdat, ldat;         
   uchar y_byte, y_bit;    //在纵坐标的哪一个字节,哪一个位
    uchar   a[16];
   LCD_write_com(0x34);         //打开扩展指令集
    y_byte=y/32;                    //y是没在哪个字节这个说法
    y_bit=y%32;                    //y_bit确定它是在第几行
   for(j=0;j<8;j++)
 {
  hdat=0, ldat=0;     //此处清零是很必要的
  n=j*16;
  for(k=n;k<n+16;k++)
   {
   if(x[k]==y)
      {
    a[count]=k;
    count++;
    }
    } 
 for(m=0;m<count;m++)
   {
    i=a[m]-n;
       if(i<8)                              //如果x_bit位数小于8
          hdat=hdat|(0x01<<(7-i));    //写高字节。因为坐标是从左向右的
       else
        ldat=ldat|(0x01<<(15-i));
      }
   
   LCD_write_com(0x80+y_bit);       //垂直地址(上)   貌似与说明书正好相反
     LCD_write_com(0x80+j+8*y_byte);  //水平坐标(下)   貌似与说明书正好相反   
   LCD_write_dat(hdat);
    LCD_write_dat(ldat);
  }
   LCD_write_com(0x36);                     //打开绘图显示
   LCD_write_com(0x30);               //回到基本指令集
 }
Exemplo n.º 10
0
void Display_photo2(const uchar *img2)           //写下半屏图形数据
{
	int i,j;

	for(i=0;i<32;i++)                        //下半屏32行
	{  

	 LCD_write_com(Yaddress+i);       //先写垂直地址,即Y地址,不能自动加一
	 delay_us(50);
	 LCD_write_com(X2address);        //再写水平地址,即X地址
	 delay_us(50);
	 	 for(j=0;j<8;j++)         //连续写入2个字节的数据,一共8次,为一行,即16*8位数据
	    {
			
			LCD_write_data(img2[i*16+j*2]);
			delay_us(50);                    
			LCD_write_data(img2[i*16+j*2+1]);  
			delay_us(50);  
      
		}

	}

}
Exemplo n.º 11
0
/*отй╬фаЁУй╪╩╞╨╞йЩ*/
void LCD_Init(void)
{
	DDRC = 0xFF;										/*I/O©з╥╫оРиХжц						*/
	DDRD |= (1 << PD2) | (1 << PD3) | (1 << PD6);
	LCD_write_com(0x38);								/*отй╬дёй╫иХжц						*/
	delay_ms(5);
	LCD_write_com(0x38);
	delay_ms(5);
	LCD_write_com(0x38);
	delay_ms(5);
	LCD_write_com(0x38);
	
	LCD_write_com(0x08);								/*отй╬╧ь╠у							*/
	LCD_write_com(0x01);								/*отй╬гЕфа							*/
	LCD_write_com(0x06);								/*отй╬╧Б╠Йрф╤╞иХжц					*/
	delay_ms(5);
	LCD_write_com(0x0C);								/*отй╬©╙╪╟╧Б╠ЙиХжц					*/
}
Exemplo n.º 12
0
void LCD_Setaddress(uchar x,uchar y)
{              //地址从第1行第1列开始不从0开始
  uchar addr;
  switch(x)
  {
   case 1: addr=0x80+y-1;
           break;
   case 2: addr=0x90+y-1;
           break;
   case 3: addr=0x88+y-1;
           break;
   case 4: addr=0x98+y-1;
           break;
   default : break;
  }
   LCD_write_com(addr);    //字符显示开始地址
}
Exemplo n.º 13
0
void LCD_clear(void) 
{
  LCD_write_com(0x01);
  delay_ms(1);
}