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

📄 1.c

📁 这是个lcd12864液晶的串行驱动程序
💻 C
字号:
//mega8515 lcd of ks108 
// 
//----------------------------------------------------------------------------- 
// Includes 
//----------------------------------------------------------------------------- 
#include <iom16v.h>                
#include <macros.h> 
typedef unsigned char uchar; 
typedef unsigned int  uint; 
//----------------------------------------------------------------------------- 
//  DB0-DB7=PA  
//  CSA      = PC7               // Select left or right LCD. 
//  CSB      = PC6               // Select left or right LCD. 
//  DI       = PB2               // Select Rigster LCD. 
//  RW       = PB1               // Read or Write LCD. 
//  EN       = PB0;  
//----------------------------------------------------------------------------- 
/*   定义12864端口   */ 
//DATA_PORT=PORTA 
#define DATA PORTA 
//CSA=PC7 
#define CSA_H asm("sbi 0x15,7") 
#define CSA_L asm("cbi 0x15,7") 
//CSB=PC6 
#define CSB_H asm("sbi 0x15,6") 
#define CSB_L asm("cbi 0x15,6") 
//DI=PB2 
#define DI_H asm("sbi 0x18,2") 
#define DI_L asm("cbi 0x18,2")  
//RW=PB1 
#define RW_H asm("sbi 0x18,1") 
#define RW_L asm("cbi 0x18,1")  
//EN=PB0 
#define EN_H asm("sbi 0x18,0") 
#define EN_L asm("cbi 0x18,0")  

//----------------------------------------------------------------------------- 
// Data for display. 
//----------------------------------------------------------------------------- 
const uchar Dig[] = { 
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,   // 0 
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,   // 1 
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,   // 2 
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,   // 3 
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,   // 4 
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,   // 5 
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,   // 6 
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,   // 7 
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,   // 8 
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,   // 9 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,   // .[10] 
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,   // %[11] 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00    //  [12] 
}; 

const uchar HZK[] = { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x48,0x56,0xD4,0x54,0xD4,0x54,0x54,   // 氧量:[0] 
0x54,0xD4,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x7C,0x54,0x54,0x54,0x54,0x54,0x54, 
0x54,0x7E,0x44,0x40,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x15,0x15,0x15,0x7F,0x15,0x15,0x15, 
0x00,0x1F,0x20,0x40,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x50,0x5F,0x55,0x55,0x55,0x7F,0x55,0x55, 
0x55,0x5F,0x50,0x40,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xC2,0x0C,0xC0,0x00,0xFC,0x94,0x94,0x94,   // 温度:[4] 
0x94,0x94,0xFE,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x28,0x28,0xF8,0xAA,0xAC,0xA8, 
0xF8,0x28,0x2C,0x08,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7C,0x03,0x40,0x7E,0x42,0x42,0x7E,0x42, 
0x7E,0x42,0x42,0x7E,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x0F,0x40,0x42,0x42,0x26,0x2A,0x12,0x2A, 
0x26,0x42,0x40,0x40,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0xFE,0x50,0x10,0x40,0x90,   // 热电势[8] 
0x7E,0x10,0x10,0xF8,0x10,0x80,0x00,0x00,0x00,0xF0,0x90,0x90,0x90,0xFE,0x90,0x90, 
0x90,0x90,0xF8,0x10,0x00,0x00,0x48,0x48,0x48,0xFE,0x28,0x28,0x80,0x48,0xBE,0x08, 
0x08,0xF8,0x00,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x34,0x07,0x10,0x64,0x02,0x11, 
0x61,0x02,0x00,0x13,0x64,0x07,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x3F,0x44,0x44, 
0x44,0x44,0x47,0x40,0x70,0x00,0x40,0x44,0x45,0x25,0x14,0x0F,0x04,0x04,0x24,0x44, 
0x3E,0x04,0x01,0x03,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x48,0x56,0xD4,0x54,0xD4,0x54,   // 氧电势[12] 
0x54,0x54,0xD4,0x04,0x04,0x00,0x00,0x00,0x00,0xF0,0x90,0x90,0x90,0xFE,0x90,0x90, 
0x90,0x90,0xF8,0x10,0x00,0x00,0x48,0x48,0x48,0xFE,0x28,0x28,0x80,0x48,0xBE,0x08, 
0x08,0xF8,0x00,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x15,0x15,0x15,0x7F,0x15,0x15, 
0x15,0x00,0x1F,0x20,0x40,0x78,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x3F,0x44,0x44, 
0x44,0x44,0x47,0x40,0x70,0x00,0x40,0x44,0x45,0x25,0x14,0x0F,0x04,0x04,0x24,0x44, 
0x3E,0x04,0x01,0x03,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x18,0x24,0x24,0x18,0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x00,0x00,   // C:[16] 
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00,    
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,   // mv[17] 
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00    
}; 
//----------------------------------------------------------------------------- 
// LCD:Write instraction code at left. 
//----------------------------------------------------------------------------- 
void Wleft_Cmad(unsigned char Lcmd) 
{ 
   unsigned char Lstate; 
   CSA_L;  CSB_H; 
   DI_L;   RW_H; 
   DDRA=0x00;//a口设为输入 
   PORTA=0x00; 
   do 
   { EN_H; 
     Lstate  = PINA; 
     EN_L;   
   }while(Lstate & 0x80) ; 
   DDRA=0xff; 
   RW_L; 
   DATA     = Lcmd; 
   EN_H; 
   EN_L; 
} 
//----------------------------------------------------------------------------- 
// LCD:Write Data at left. 
//----------------------------------------------------------------------------- 
void Wleft_Data(unsigned char Ldat) 
{ 
   unsigned char Lstate; 
   CSA_L;  CSB_H; 
   DI_L; 
   RW_H; 
   DDRA=0x00; 
   PORTA=0x00; 
   do  
   { EN_H; 
     Lstate  = PINA; 
     EN_L;   
   }while(Lstate & 0x80); 
   DDRA=0xff; 
   DI_H; 
   RW_L; 
   DATA     = Ldat; 
   EN_H; 
   EN_L; 
} 
//----------------------------------------------------------------------------- 
// LCD:Write instraction code at Right. 
//----------------------------------------------------------------------------- 
void Wrigt_Cmad(unsigned char Rcmd) 
{ 
   unsigned char Lstate; 
   CSA_H;    CSB_L; 
   DI_L; 
   RW_H; 
   DDRA=0x00; 
   PORTA=0x00; 
   do 
   { EN_H; 
     Lstate  = PINA; 
     EN_L;  
   }while(Lstate & 0x80) ; 
   DDRA=0xff; 
   RW_L; 
   DATA     = Rcmd; 
   EN_H; 
   EN_L; 
}       
//----------------------------------------------------------------------------- 
// LCD:Write Data at right. 
//----------------------------------------------------------------------------- 
void Wrigt_Data(unsigned char Rdat) 
{ 
   unsigned char Lstate; 
   CSA_H;   CSB_L; 
   DI_L; 
   RW_H;    
   DDRA=0x00; 
   PORTA=0x00; 
   do 
   { EN_H; 
     Lstate  = PINA; 
     EN_L;   
   }while(Lstate & 0x80); 
   DDRA=0xff; 
   DI_H; 
   RW_L; 
   DATA     = Rdat; 
   EN_H; 
   EN_L; 
} 
//----------------------------------------------------------------------------- 
// LCD:Iniatlize(DIlcdsplay). 
//----------------------------------------------------------------------------- 
void LCD_INT(void) 
{ 
   Wleft_Cmad(0xc0);                 // Left  display start line; 
   Wrigt_Cmad(0xc0);                 // Right display start line; 
   Wleft_Cmad(0x3f);                 // Left  display On; 
   Wrigt_Cmad(0x3f);                 // Right display On;  
} 
//----------------------------------------------------------------------------- 
// LCD:Clear picture. 
//----------------------------------------------------------------------------- 
void LCD_CLR(void) 
{ 
   unsigned char adrPage,adrLaw; 
   for(adrPage = 0; adrPage < 8; adrPage++) 
   {  Wleft_Cmad(adrPage | 0xb8); 
      Wrigt_Cmad(adrPage | 0xb8); 
      Wleft_Cmad(0x40); 
      Wrigt_Cmad(0x40); 
      for(adrLaw = 0; adrLaw < 64; adrLaw++) 
      {   Wleft_Data(0x00); 
          Wrigt_Data(0x00); 
      } 
   } 
} 
//----------------------------------------------------------------------------- 
// LCD:DIlcdsplay Chinese. 
//----------------------------------------------------------------------------- 
void WriteHZ(uchar XH_HZ,uchar adrPage,int adrColumn,uchar ColSum) 
{ 
   unsigned int  dptr;               // dptr_adderss for HZ code. 
   unsigned char left=0, i, j; 
   dptr = XH_HZ * 32; 
   if((adrColumn-64) >= 0) left = 0;   // left = 0:for right. 
   else if((adrColumn-64) < 0)  left = 1;   // left = 1:for left. 
   for(i=0; i<2; i++) 
   { 
      if(left == 0) 
          { Wrigt_Cmad(adrPage | 0xb8);  
            Wrigt_Cmad(adrColumn | 0x40); 
            for(j=0; j< ColSum; j++)     
          { 
             Wrigt_Data(HZK[dptr]); 
             dptr = dptr + 1;     
          } 
      } 
      if(left == 1) 
          {          Wleft_Cmad(adrPage | 0xb8); 
          Wleft_Cmad(adrColumn | 0x40); 
          for(j=0; j< ColSum; j++)    { 
             Wleft_Data(HZK[dptr]); 
             dptr = dptr + 1;    } 
      } 
          adrPage = adrPage + 1; 
   } 
} 
//----------------------------------------------------------------------------- 
// LCD:DIlcdsplay ASCII. 
//----------------------------------------------------------------------------- 
void WriteDG(uchar XH_Dig,uchar adrPage,int adrColumn) 
{ 
   unsigned int  dptr;               // dptr_adderss for Dig code. 
   unsigned char left, i, j; 
   dptr = XH_Dig * 16; 
   if(adrColumn-64 >= 0) left = 0;   // left = 0:for right. 
   else                  left = 1;   // left = 1:for left. 

   for(i=0; i<2; i++) 
   { 
      if(left == 0) 
          {          Wrigt_Cmad(adrPage | 0xb8);   
          Wrigt_Cmad(adrColumn | 0x40); 
          for(j=0; j< 8; j++)      { 
             Wrigt_Data(Dig[dptr]); 
             dptr = dptr + 1;      } 
      } 
      if(left == 1) 
          {          Wleft_Cmad(adrPage | 0xb8); 
          Wleft_Cmad(adrColumn | 0x40); 
          for(j=0; j< 8; j++)      { 
             Wleft_Data(Dig[dptr]); 
             dptr = dptr + 1;      } 
      } 
          adrPage = adrPage + 1; 
   } 
} 

#define xtal 4    
void delay_1ms(void) 
{ unsigned int i; 
 for(i=1;i<(unsigned int)(xtal*143-2);i++) 
    ; 
} 
void delay_ms(unsigned int n) 
{ 
 unsigned int i=0; 
   while(i<n) 
   {delay_1ms(); 
    i++; 
   } 
} 


void main() 
{ 
   PORTA = 0x00; 
   DDRA  = 0xFF; 
   DDRB  = 0xff ; 
   PORTB=0xff; 
   PORTC = 0xff; 
   DDRC  = 0xFF; 
   PORTC = 0xff; 
   PORTD = 0xFF;  
   LCD_INT(); 
   LCD_CLR(); 
   WriteHZ(12, 0, 5, 64);         // 氧电势 
   WriteHZ(17, 0, 108, 16);       // mv 
   WriteHZ(0, 2, 0, 64);          // 氧量 
   WriteDG(11, 2, 108);           // % 
   WriteHZ(8, 4, 0, 64);          // 热电势 
   WriteHZ(17, 4, 108, 16);       // mv          
   WriteHZ(4, 6, 0, 64);          // 温度 
   WriteHZ(16, 6,108, 16);         // C 
}

⌨️ 快捷键说明

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