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

📄 12864.c

📁 该设备是一款基于AVR mega16L单片机的电子书阅读器
💻 C
字号:
#include <mega16.h>
#include <delay.h> 
#include <12864.h> 
#define RS PORTA.0
#define RW PORTA.1
#define E PORTA.2
/*1--GND
  2--VCC
  3--V0--kong
  4--RS--PA0
  5--RW--PA1
  6--E---PA2
  7---14   PC0---PC7
  15--PSB---VCC选并口
*/

void lcd_init(void)               //初始化
{      
        DDRC=0xff;
        PORTC=0x00;
        DDRA=0xff;
        PORTA=0x00;
        delay_ms(50);
        lcd_write_command(0x30);          // //选择基本指令集
        delay_ms(1);
        lcd_write_command(0x0c);           //开显示(无游标、不反白)
        delay_ms(1);
        lcd_write_command(0x01);           //清除显示,并且设定地址指针为00H
        delay_ms(1);
        lcd_write_command(0x06);        //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
        delay_ms(1);
        lcd_write_command(0x80);        //
}   

void lcd_write_command(unsigned char cmdcode)     //写指令RS=0,RW=0,下降沿打入。
{
        chek_busy ();       
        RS = 0;
        RW = 0;
        E = 1;
         #asm("nop");
        PORTC = cmdcode;
         #asm("nop");                      
        E = 0;      
}      

void chek_busy(void)                    //判忙, RS=0,RW=1,E=1,读指令。
{      
        DDRC &= 0x7f;
        RS = 0;
        RW = 1;        
        E = 1;
         #asm("nop");
        while(PINC&0x80);       
         #asm("nop");
        E = 0;
        DDRC |= 0x80;                
}       

void lcd_write_data(unsigned char disdata)        //写数据,RS=1,RW=0,下降沿打入。
{
        chek_busy ();
        RS = 1;
        RW = 0;
        E = 1;
        #asm("nop");
        PORTC = disdata;
         #asm("nop");         
        E = 0;
        #asm("nop");
}     
void lcd_set_xy( unsigned char x, unsigned char y )     //写地址函数 
{ 
       unsigned char address; //x范围是0~7  y范围0~3
       switch ( y )
        {
          case 0 : address=0x80+x;
          break;
          case 1 : address=0x90+x;
          break;
          case 2 : address=0x88+x;
          break;
          case 3 : address=0x98+x;
          break;
          default: break;
        }        
      lcd_write_command(address);  
} 

void SetLCDCursor( unsigned char x,unsigned char y )
{
   lcd_cursor_flash(1);
   lcd_set_xy(x,y);
}
void lcd_write_stringf(unsigned char flash *s)
{   
  while(*s>0)
   {  
      lcd_write_data(*s);
      s++;     
   }
}
void lcd_write_string(unsigned char  *s)
{   
  while(*s>0)
   {  
      lcd_write_data(*s);
      s++;     
   }
}
void lcd_clear(void)
{
 lcd_write_command(0x01);
}
void lcd_cursor_flash(unsigned char i)
{
  if(i==1)
  {
   lcd_write_command(0x0f);
  }
  else if (i==0)
         {
          lcd_write_command(0x0c);
         }
}
void lcd_write_full(unsigned char *s)
{
  unsigned char i;
  for (i=0;i<64;i++)
  { 
   if (i==0)
     lcd_write_command(0x80);
     else if(i==16)
           lcd_write_command(0x90);
           else if(i==32) 
                  lcd_write_command(0x88);
                  else if (i==48)
                          lcd_write_command(0x98); 
        lcd_write_data(*s);
        s++;         
  }
}  
/*------------------自定义一个字符代码(一个星星和月亮)--------------------------*/
/*
void CGRAM()
{ int i;
     lcd_write_command(0x30); 
     lcd_write_command(0x40);
     for(i=0;i<16;i++)
     {
      lcd_write_data(zk[i*2]);
      lcd_write_data(zk[i*2+1]);
      }
}      
/*------------------显示字符串--------------------------*/
/*void hzkdis(unsigned char flash *s)
{ while(*s>0)
   { lcd_write_data(*s);
      s++;
      delay_ms(1);
   }
}

/*------------------显示图片------------------------2005.11.14.21:20修改---benladn911---*/
/*void Disp_Img(unsigned char flash *img)
{ unsigned int j=0;
   unsigned char x,y,i;
       for(i=0;i<9;i+=8)
       for(y=0;y<32;y++)/*原来 为 y<26 ,上下两个半屏不能正常对接显示,导致显示的图片中间有空隙*/
     /*    for(x=0;x<8;x++)
         {  lcd_write_command(0x36);//功能设置---8BIT控制界面,扩充指令集
            lcd_write_command(y+0x80);        //行地址
            lcd_write_command(x+0x80+i);     //列地址
            lcd_write_command(0x30);   //基本指令集
            lcd_write_data(img[j++]);
            lcd_write_data(img[j++]);
         }   
           
}


*/
/*------------------清整个GDRAM空间----------------------------*/
/*void clrgdram()
{ unsigned char x,y;
        for(y=0;y<64;y++)
         for(x=0;x<16;x++)
         { lcd_write_command(0x34);
            lcd_write_command(y+0x80);        //行地址
            lcd_write_command(x+0x80);     //列地址
            lcd_write_command(0x30);
            lcd_write_data(0x00);
            lcd_write_data(0x00);
                               }
   }
/*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
/*void lcdfill(unsigned char disdata)
{ unsigned char x,y;
        for(y=0;y<32;y++)
         for(x=0;x<16;x++)
         { lcd_write_command(0x36);
            lcd_write_command(y+0x80);        //行地址
            lcd_write_command(x+0x80);     //列地址
            lcd_write_command(0x30);
            lcd_write_data(disdata);
            lcd_write_data(disdata);
            }
   lcd_write_command(0x34);                            
   lcd_write_command(0x36);
   }
/*------------------显示横-----------------------------*/
/*void Disp_H_Line()
{ unsigned char x,y;
   unsigned char k=0x00; 
       for(y=0;y<32;y++)
         { k=~k;
           for(x=0;x<16;x++)
         { lcd_write_command(0x36);
            lcd_write_command(y+0x80);      //行地址
            lcd_write_command(x+0x80);     //列地址
            lcd_write_command(0x30);
            lcd_write_data(k);
            lcd_write_data(k);
           };
         }
     lcd_write_command(0x34);                          
   lcd_write_command(0x36);
}

 
/*绘图显示的步骤
 1 关闭绘图显示功能
 2 先将垂直的坐标(Y)写入绘图RAM地址
 3 再将水平的位元组坐标(X)写入绘图RAM地址
 4 将D15-D8写入RAM中
 5 将D7-D0写入到RAM中
 6 打开绘图显示功能*/
//整屏显示竖条
//当ii=0时显示上面128×32,当ii=8时显示下面128×32
/*void LcdFill_Vertical()
{  unsigned char x,y,ii;
   for(ii=0;ii<9;ii+=8)   
     for(y=0;y<0x20;y++)     
      for(x=0;x<8;x++)
      { 
      lcd_write_command(0x36);//扩充指令 绘图显示
         lcd_write_command(y+0x80);        //行地址
         lcd_write_command(x+0x80+ii);     //列地址     
         lcd_write_data(0x55); //写数据 D15-D8 
         lcd_write_data(0x55); //写数据 D7-D0  
   lcd_write_command(0x30);
      } 
}
//当ii=0时显示上面128×32,当ii=8时显示下面128×32
//整屏显示横条线
void LcdFill_Level()
{  unsigned char x,y,ii;
   unsigned char k;   
   for(ii=0;ii<9;ii+=8)    
      for(y=0;y<0x20;y++)
      {     if((y%2)==1)
               k=0xff;
            else
               k=0;
            for(x=0;x<8;x++)
            {  lcd_write_command(0x36);  //扩充指令 绘图显示
               lcd_write_command(y+0x80);    //行地址
               lcd_write_command(x+0x80+ii);    //列地址            
               lcd_write_data(k);
               lcd_write_data(k);
               lcd_write_command(0x30);
            }
       }     
} 

⌨️ 快捷键说明

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