www.pudn.com > rfid.rar > lcd.c, change:2012-04-22,size:11546b


/******************************************************************************* 
 * 文件名称:lcd.c 
 * 功    能:lcd驱动 
 * 作    者:Ronnie 
 * 硬件连接:LCD与MSP430的硬件连接关系如下: 
 *                  LCD                           MSP430 
 * 
 *               SCL(PIN7)                         P1.6 
 *               SID(PIN8)                         P1.7 
 *               A0(PIN14)                         P3.6 
 *               CSn(PIN12)                        P2.4 
 *               RESETn(PIN13)                     P2.5 
 *               VDD(PIN9) 
 *               VSS(PIN10) 
 *               LED+(PIN11) 
 * 
 * 公    司:湘潭斯凯电子科技有限公司 
 *           www.sikai-tech.com 
 * 日    期:2011-06-22 
 ******************************************************************************/ 
 
 
/* 包含头文件 */ 
/********************************************************************/ 
#include "lcd.h" 
/********************************************************************/ 
 
 
/* 6*8点阵英文字符             */ 
/* 字符左端和下端各有1个空像素 */ 
/* index = ASCII - 32          */ 
const unsigned char font6x8[][6] = 
{ 
  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp  0 
  { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !   1 
  { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "   2 
  { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #   3 
  { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $   4 
  { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %   5 
  { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &   6 
  { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '   7 
  { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (   8 
  { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )   9 
  { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *   10 
  { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +   11 
  { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,   12 
  { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -   13 
  { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .   14 
  { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /   15 
  { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0   16 
  { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1   17 
  { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2   18 
  { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3   19 
  { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4   20 
  { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5   21 
  { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6   22 
  { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7   23 
  { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8   24 
  { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9   25 
  { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :   26 
  { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;   27 
  { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <   28 
  { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =   29 
  { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >   30 
  { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?   31 
  { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @   32 
  { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A   33 
  { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B   34 
  { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C   35 
  { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D   36 
  { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E   37 
  { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F   38 
  { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G   39 
  { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H   40 
  { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I   41 
  { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J   42 
  { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K   43 
  { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L   44 
  { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M   45 
  { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N   46 
  { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O   47 
  { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P   48 
  { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q   49 
  { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R   50 
  { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S   51 
  { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T   52 
  { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U   53 
  { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V   54 
  { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W   55 
  { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X   56 
  { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y   57 
  { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z   58 
  { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [   59 
  { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55  60 
  { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]   61 
  { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^   62 
  { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _   63 
  { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '   64 
  { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a   65 
  { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b   66 
  { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c   67 
  { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d   68 
  { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e   69 
  { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f   70 
  { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g   71 
  { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h   72 
  { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i   73 
  { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j   74 
  { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k   75 
  { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l   76 
  { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m   77 
  { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n   78 
  { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o   79 
  { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p   80 
  { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q   81 
  { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r   82 
  { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s   83 
  { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t   84 
  { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u   85 
  { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v   86 
  { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w   87 
  { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x   88 
  { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y   89 
  { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z   90 
  { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00 },   // ||  91 
  { 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08 },   // <-  92 
  { 0x08, 0x08, 0x08, 0x2a, 0x1c, 0x08 },   // ->  94 
  { 0x04, 0x02, 0xff, 0x02, 0x04, 0x00 },   // up  94 
  { 0x00, 0x20, 0x40, 0xff, 0x40, 0x20 },   // down  95 
  { 0x00, 0x01, 0x01, 0xFF, 0x81, 0x81 },   //ADC Series上用的上划线 
  { 0x00, 0x80, 0x80, 0xFF, 0x80, 0x80 }    //ADC Series上用的下划线 
}; 
 
 
/********************************************************************* 
 * 函数名称:LCD_DataSend() 
 * 功    能:串行模式发送数据 
 * 入口参数:data  要发送的数据 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_DataSend(unsigned char data) 
{ 
  unsigned char s,temp,i; 
 
  LCD_SCL_L(); 
  s = data; 
 
  for(i=8;i>0;i--) 
  { 
    LCD_SCL_L(); 
    asm("nop"); 
    asm("nop"); 
    temp = s & 0x80; 
    if(temp) 
    { 
      LCD_SID_H(); 
    } 
    else 
    { 
      LCD_SID_L(); 
    } 
    LCD_SCL_H(); 
    s = s << 1; 
  } 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_WriteCMD() 
 * 功    能:写命令 
 * 入口参数:command  命令 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_WriteCMD(unsigned char command) 
{ 
  LCD_A0_L(); 
  LCD_CSn_L(); 
  LCD_DataSend(command); 
  asm("nop"); 
  LCD_CSn_H(); 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_WriteData 
 * 功    能:写数据 
 * 入口参数:data  数据 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_WriteData(unsigned char data) 
{ 
  LCD_A0_H(); 
  LCD_CSn_L(); 
  LCD_DataSend(data); 
  asm("nop"); 
  LCD_CSn_H(); 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_Init 
 * 功    能:LCD初始化 
 * 入口参数:无 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_Init(void) 
{ 
  /* 配置LCD相关控制引脚方向为输出 */ 
  LCD_SCL_OUT(); 
  LCD_SID_OUT(); 
  LCD_A0_OUT(); 
  LCD_CSn_OUT(); 
  LCD_RSTn_OUT(); 
 
  /* 复位LCD */ 
  LCD_RSTn_L(); 
  asm("nop"); 
  asm("nop"); 
  LCD_RSTn_H(); 
 
  LCD_WriteCMD(0xaf);  // 显示器开;0xaf  显示器关:0xae 
  LCD_WriteCMD(0x40);  // 显示RAM 的起始行地址为0x40 
  LCD_WriteCMD(0xa1);  // 模块反向安装,列地址从左到右为131~4 
  LCD_WriteCMD(0xa6);  // 正常显示:a6  反白显示:a7 
  LCD_WriteCMD(0xa4);  // 全屏显示,不能改变RAM数据:a4  可以改变:a5 
  LCD_WriteCMD(0xa2);  // 设置LCD 的偏压比1/9 
  LCD_WriteCMD(0xc0);  // 模块反向安装时,下端为第0行 
  LCD_WriteCMD(0x2f);  // 设置开关内部电路的电源 
  LCD_WriteCMD(0x24);  // 粗调对比度 
   
  /* 细调对比度 */ 
  LCD_WriteCMD(0x81);                 
  LCD_WriteCMD(0x24); 
 
  /* 静态指示关闭 */ 
  LCD_WriteCMD(0xac);                                 
  LCD_WriteCMD(0x00); 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_Clear 
 * 功    能:LCD清屏 
 * 入口参数:无 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_Clear(void) 
{ 
  unsigned char seg;   // LCD显示列 
  unsigned char page;  // LCD显示页 
 
  /* 分8页写入数据 */ 
  for(page = 0xb0; page < 0xb8; page++)  
  { 
    LCD_WriteCMD(page);  // 设置页地址 
     
    /* 设置列地址,高低字节两次写入,从第4列开始 */ 
    LCD_WriteCMD(0x10 | (4 >> 4));                 
    LCD_WriteCMD(0x00 | (4 & 0x0F)); 
   
    /* 写128列数据 */ 
    for(seg=0;seg<128;seg++)                                                  
    {  
      LCD_WriteData(0x00); 
    } 
  } 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_WriteChar 
 * 功    能:显示英文字符 
 * 入口参数:c  要显示的英文字符 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_WriteChar(unsigned char c) 
{ 
  unsigned char line; 
 
  c -= 32; 
   
  for (line=0; line<6; line++) 
  {   
    LCD_WriteData(font6x8[c][line]); 
  } 
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_SetXY 
 * 功    能:设置LCD坐标 
 * 入口参数:x  列,取值范围:0 - 127 
 *           y  行,取值范围:0 - 7 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_SetXY(unsigned char x, unsigned char y) 
{ 
  LCD_WriteCMD(0xb0 + y);  // 设置行 
   
  /* 设置列 */ 
  LCD_WriteCMD(0x10 | ((x + 4) >> 4) );                 
  LCD_WriteCMD(0x00 | ((x+4) & 0x0F));   
} 
 
 
/********************************************************************* 
 * 函数名称:LCD_WriteString 
 * 功    能:显示英文字符串 
 * 入口参数:s  英文字符串指针 
 *           x  字符串起始显示位置的横坐标,取值范围:0 - 127 
 *           y  字符串在该行显示,取值范围:0 - 7 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void LCD_WriteString(unsigned char x,unsigned char y,char *s) 
{ 
  unsigned char i = 0; 
   
  /* 将第y行清零 */ 
  LCD_SetXY(0,y); 
  for(i=0;i<128;i++) 
  { 
    LCD_WriteData(0x00); 
  }   
 
  LCD_SetXY(x,y); 
  i = 0; 
  while(*s) 
  { 
    LCD_WriteChar(*s); 
    s++; 
    i++; 
    if(i > 21) return; 
  } 
}