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

📄 lcd.c

📁 LCD320*240驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------*/
/*             AVR-ARM开发网论坛                    */
/*           http://www.avrarm.com                  */
/*            AVR生成代码测试程序                   */
/*--------------------------------------------------*/
/*     程序由AVR辅助开发工具V2.0.0自动生成          */
/*     AVR系统的处理器为:   ATMega128               */
/*     AVR系统的晶振频率:   7.3728 Mhz             */
/*--------------------------------------------------*/

#include <iom128v.h>
#include <macros.h>
#include "lcd.h"
#include "delay.h"

/**********************************************************
Name:          void LCDWriteCmd(unsigned char byte)
Description:   write a Cmd byte to the LCD
Input:         Command (Byte)
Output:        none
Misc:       
**********************************************************/
void LCDWriteCmd(unsigned char byte)
{
   DATAOUT = byte;
   A0_H;       // A0 -> 1
   WR_L;       // WR -> 0
   WDR();
   WR_H;       // WR -> 1
}

/**********************************************************
Name:          void LCDWriteData(unsigned char byte)
Description:   write a data byte to the LCD
Input:         unsigned char byte -> data to write on the LCD
Output:        none
Misc:       
**********************************************************/
void LCDWriteData(unsigned char byte)
{
   DATAOUT = byte;
   A0_L;             // A0 -> 0
   WR_L;             // WR -> 0
   WDR();
   WR_H;             // WR -> 1
}

/**********************************************************
Name:       unsigned char LCDReadData(void)
Description:   read a data byte to the LCD
Input:         none
Output:        unsigned char byte -> Data read from the LCD
Misc:       
**********************************************************/
unsigned char LCDReadData(void)
{
   unsigned char byte;
   int i;

   WDR();
   DATABUS = 0x00;           // Data Port as input
   A0_H;                     // A0 -> 1
   delay_us();
   RD_L;                     // RD -> 0
   byte = DATAIN;            // read byte
   byte = DATAIN;            // read byte
   byte = DATAIN;            // read byte
   byte = DATAIN;            // read byte
   RD_H;                     // RD -> 1
   DATABUS = 0xff;           // Data Port as output
   return byte;
}

/**********************************************************
Name:  void LCD_Init(void)
Description:   Initialize a graphic of  X & Y
Input:         #define  GUI_LCM_XMAX  ...
               #define  GUI_LCM_YMAX  ...
Output:        none
Misc:       

**********************************************************/
void LCD_Init(void)
{
   int i,j;

//LCD Data Bus
   DATAOUT = 0x00;
   DATABUS = 0xff;             // PB0-7 as output
   LCD_CS_DDR |= LCD_CS_BIT;
   CS_L;

//LCD control Bus
   //DDRC |=((1<<RES)+(1<<RD)+(1<<WR));
   LCD_RES_DDR |= LCD_RES_BIT;
   LCD_RD_DDR |= LCD_RD_BIT;
   LCD_WR_DDR |= LCD_WR_BIT;

   WR_H;                // WR -> 1
   RD_H;                // RD -> 1
   //DDRC |= (1<<A0);
   LCD_A0_DDR |= LCD_A0_BIT;
   RES_H;
   delay_nms(2);
   RES_L;               // Reset LCD
   delay_nms(2);
   delay_nms(2);
   delay_nms(2);
   delay_nms(2);
   delay_nms(2);
   delay_nms(2);
   RES_H;
   for (i=0;i<10;i++)
   {
      delay_nms(2);
   }

//SYSTEM SET COMMAND
   LCDWriteCmd(SYSTEM_SET);         // SYSTEM SET COMMAND
   LCDWriteData(0x30);        // P1   -> PRT=0, IV=1, W/S=0, M0-M2=0
   LCDWriteData(0x87);        // FX   -> WF=1, FX=7
   LCDWriteData(0x07);        // FY   -> FY=7
   LCDWriteData((GUI_LCM_XMAX/8)-1);    // C/R  -> Char per line - 1
   LCDWriteData((XTAL / 70 / GUI_LCM_YMAX) / 9);    // TC/R -> ( f_osc / f_frame / [L/F] - 1 ) / 9
   //LCDWriteData(0x2f);      // TC/R -> ( f_osc / f_frame / [L/F] - 1 ) / 9
   LCDWriteData(GUI_LCM_YMAX - 1);      // L/F  -> Line per graphic screen - 1 (127)
   LCDWriteData(GUI_LCM_XMAX/8);        // APL  -> Virtual screen low byte ( char per line)
   LCDWriteData(0x00);        // APH  -> Virtual screen low byte

//SCROLL COMMAND
   LCDWriteCmd(SCROLL);         // SCROLL COMMAND
   LCDWriteData(0x00);        // First Layer Low Byte  (0x0000)
   LCDWriteData(0x00);        // First Layer Hign Byte
   LCDWriteData(GUI_LCM_YMAX);       // 128 Line of scroll

   LCDWriteData(0x00);        // Second Layer Low Byte (0x1000)
   LCDWriteData(0x10);        // Second Layer Hign Byte
   LCDWriteData(GUI_LCM_YMAX);// 128 Line of scroll

//HORIZONTAL SCROLL POSITION
   LCDWriteCmd(HDOT_SCR);         // HORIZONTAL SCROLL POSITION
   LCDWriteData(0x00);        // no scrool offset

//OVERLAY COMMAND
   LCDWriteCmd(OVLAY);         // OVERLAY COMMAND
   LCDWriteData(0x03);        // 2 layer (1-Text 2-Graphic)
//LCDWriteData(0x01);         // 2 layer (1-Text 2-Graphic)

//DISPLAY ON/OFF COMMAND
   LCDWriteCmd(DISP_OFF);         // DISPLAY OFF COMMAND
   LCDWriteData(0x14);        // Layer 1 & 2 ON

   ClrSCR();
   GClrSCR();

//CURSOR FORMAT COMMAND
   LCDWriteCmd(CSRFORM);         // CURSOR FORMAT COMMAND
   //LCDWriteData(0x07);      // Cursor width (7)
   //LCDWriteData(0x87);      // Cursor Height(7) & Block type
   LCDWriteData(0x04);        // Cursor width (7)
   LCDWriteData(0x86);        // Cursor Height(7) & Block type

//DISPLAY ON/OFF COMMAND
   LCDWriteCmd(DISP_ON);         // DISPLAY ON COMMAND
   LCDWriteData(0x14);        // Layer 1 & 2 ON

//CURSOR DIRECTION COMMAND
   LCDWriteCmd(CSRDIR1);         // CURSOR DIRECTION COMMAND (SHIFT RIGHT)

//CURSOR WRITE COMMAND
   LCDWriteCmd(CSRW);         // CURSOR WRITE COMMAND
   LCDWriteData(0x00);        // Cursor position low byte
   LCDWriteData(0x00);        // Cursor position high byte
 
}

/**********************************************************
Name:  void ClrSCR(void)
Description:   Clear Text Screen layer 1
Input:         none
Output:        none
Misc:       
**********************************************************/
void ClrSCR(void)
{
   int i,j;

   LCDWriteCmd(CSRW);         // CURSOR WRITE COMMAND
   LCDWriteData(0x00);        // Cursor position low byte
   LCDWriteData(0x00);        // Cursor position high byte

   LCDWriteCmd(MWRITE);         // LCD WRITE MEMORY
   DATAOUT = 0x00;
   A0_L;                      // A0 -> 0
   j = ((GUI_LCM_XMAX/8)*(GUI_LCM_YMAX/8));
   for (i=0;i<j;i++)
   {
      WR_L;                   // WR -> 0
      WDR();
      WR_H;
   }

   LCDWriteCmd(CSRW);         // CURSOR WRITE COMMAND
   LCDWriteData(0x00);        // Cursor position low byte
   LCDWriteData(0x00);        // Cursor position high byte
}

/**********************************************************
Name:  void GotoXY(unsigned char x, unsigned char y)
Description:   Goto X Y coor
Input:         X,Y
Output:        none
Misc:       
**********************************************************/
void GotoXY(unsigned char x, unsigned char y)
{
   int Address;
   unsigned char low;
   unsigned char high;

   x--;
   y--;
   Address = (y * (GUI_LCM_XMAX/8)) + x;

   low = (unsigned char) (Address & 0x00ff);
   //high = (unsigned char) ((Address & 0xff00) >> 8);
   high = (unsigned char) ((Address & 0xff00) >> 8)+0x10;

   LCDWriteCmd(CSRW);       // CURSOR WRITE COMMAND
   LCDWriteData(low);       // Cursor position low byte
   LCDWriteData(high);      // Cursor position high byte
}

/**********************************************************
Name:  void LCDWriteString(unsigned char addr_l,unsigned char addr_h,char *prt)
Description:   Write a string to the LCD
Input:         Address
               String
Output:        none
Misc:          String must be ended by \0
**********************************************************/
void LCDWriteString(unsigned char addr_l,unsigned char addr_h,char *ptr)
{
   int i;
   LCDWriteCmd(CSRW);       // CURSOR WRITE COMMAND
   LCDWriteData(addr_l);    // Cursor position low byte
   LCDWriteData(addr_h);
   
   LCDWriteCmd(MWRITE);       // LCD WRITE MEMORY
   while(*ptr != 0x00)
      LCDWriteData(*ptr++);
}

void LCDDisplay_bmp(int x,unsigned char y,unsigned char length,const unsigned char *dat)
 {
 	int startAddr=0x0000;
	unsigned char LSBa, MSBa,len,wid;
	startAddr+=40*y+x/8;
		
        for(wid=0;wid<16;wid++)
	{        	  
 	  LSBa=startAddr&0x00FF;
	  MSBa=(startAddr>>8)+0x10;   
	  LCDWriteCmd(CSRW);
	  LCDWriteData(LSBa);           
	  LCDWriteData(MSBa);
	  LCDWriteCmd(CSRDIR1);
	  LCDWriteCmd(MWRITE);
	  for(len=0;len<length/8;len++)
	  {
             LCDWriteData(*(dat++));	
	  }
	  startAddr+=40;
    }    
 }

void LCDWriteConstString(unsigned char x,unsigned char y,const char *ptr)
{

⌨️ 快捷键说明

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