新闻  |   论坛  |   博客  |   在线研讨会
LCD5110 驱动文件
juste08301 | 2013-11-28 02:04:28    阅读:3278   发布文章

诺基亚5110屏幕,省电、价格便宜,平时用的挺方便的。先贴出来其驱动函数:

 

 

/******************nokia_5110.h***********************************/

#include "reg51.h"

sbit LCD_SCLK = P3^2;  // pin 2  header 5
sbit LCD_SDIN = P1^3;  // pin 3  header 4
sbit LCD_DC = P1^2;  // pin 4  header 3
sbit LCD_CE = P1^0;  // pin 5  header 2
sbit LCD_RST = P1^1; // pin 9  header 1


void LCD_init(void);
void LCD_clear(void);
void LCD_move_chinese_string(unsigned char X, unsigned char Y, unsigned char T);
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
void LCD_write_chinese_string(unsigned char X, unsigned char Y,
                   unsigned char ch_with,unsigned char num,
                   unsigned char line,unsigned char row);
void chinese_string(unsigned char X, unsigned char Y, unsigned char T);                
void LCD_write_char(unsigned char c);
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
                  unsigned char Pix_x,unsigned char Pix_y);
void LCD_write_byte(unsigned char dat, unsigned char dc);
void delay_1us(void); 
void LCD_set_XY(unsigned char X, unsigned char Y);              
 

/******************nokia_5110.C***********************************/

#include "nokia_5110.h"
#include "english_6x8_pixel.h"
#include "write_chinese_string_pixel.h"
#include "move_chinese_string_pixel.h"


/*-----------------------------------------------------------------------
LCD_init          : 3310LCD初始化

编写日期          :2009-5-1
最后修改日期      :2009-5-1
-----------------------------------------------------------------------*/

void delay_1us(void)                 //1us延时函数
  {
   unsigned int i;
  for(i=0;i<1000;i++);
  }

  void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
 
void delay_nms(unsigned int n)       //N ms延时函数
  {
//   unsigned int i=0;
//   for (i=0;i<n;i++)
//   delay_1ms();
unsigned int x;
   unsigned char y;
   for(x=n;x>0;x--)
    for(y=110;y>0;y--);
  }


void LCD_init(void)
  {
            // 产生一个让LCD复位的低电平脉冲
   LCD_RST = 0;
    delay_1us();

   LCD_RST = 1;
   
  // 关闭LCD
   LCD_CE = 0;
    delay_1us();
  // 使能LCD
   LCD_CE = 1;
    delay_1us();

    LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
    LCD_write_byte(0xc8, 0); // 设置偏置电压
    LCD_write_byte(0x06, 0); // 温度校正
    LCD_write_byte(0x13, 0); // 1:48
    LCD_write_byte(0x20, 0); // 使用基本命令
    LCD_clear();         // 清屏
    LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
       
           // 关闭LCD
   LCD_CE = 0;
  }

/*-----------------------------------------------------------------------
LCD_clear         : LCD清屏函数

编写日期          :2009-5-1
最后修改日期      :2009-5-1
-----------------------------------------------------------------------*/
void LCD_clear(void)
  {
    unsigned int i;

    LCD_write_byte(0x0c, 0);   
    LCD_write_byte(0x80, 0);   

    for (i=0; i<504; i++)
      LCD_write_byte(0, 1);   
  }

/*-----------------------------------------------------------------------
LCD_set_XY        : 设置LCD坐标函数

输入参数:X       :0-83
          Y       :0-5

编写日期          :2009-5-1
最后修改日期      :2009-5-1
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
  {
    LCD_write_byte(0x40 | Y, 0);  // column
    LCD_write_byte(0x80 | X, 0);           // row
  }

/*-----------------------------------------------------------------------
LCD_write_char    : 显示英文字符

输入参数:c       :显示的字符;

编写日期          :2009-5-1
最后修改日期      :2009-5-1
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
  {
    unsigned char line;

    c -= 32;

    for (line=0; line<6; line++)
      LCD_write_byte(font6x8[c][line], 1);
  }

/*-----------------------------------------------------------------------
LCD_write_english_String  : 英文字符串显示函数

输入参数:*s      :英文字符串指针;
          X、Y    : 显示字符串的位置,x 0-83 ,y 0-5

编写日期          :2009-5-1
最后修改日期      :2009-5-1  
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
  {
    LCD_set_XY(X,Y);
    while (*s)
      {
  LCD_write_char(*s);
  s++;
      }
  }
/*-----------------------------------------------------------------------
LCD_write_chinese_string: 在LCD上显示汉字

输入参数:X、Y    :显示汉字的起始X、Y坐标;
          ch_with :汉字点阵的宽度
          num     :显示汉字的个数; 
          line    :汉字点阵数组中的起始行数
          row     :汉字显示的行间距
编写日期          :2009-5-1
最后修改日期      :2009-5-1
测试:
 LCD_write_chi(0,0,12,7,0,0);
 LCD_write_chi(0,2,12,7,0,0);
 LCD_write_chi(0,4,12,7,0,0); 
-----------------------------------------------------------------------*/                       
void LCD_write_chinese_string(unsigned char X, unsigned char Y,
                   unsigned char ch_with,unsigned char num,
                   unsigned char line,unsigned char row)
  {
    unsigned char i,n;
   
    LCD_set_XY(X,Y);                             //设置初始位置
   
    for (i=0;i<num;)
      {
       for (n=0; n<ch_with*2; n++)              //写一个汉字
         {
           if (n==ch_with)                      //写汉字的下半部分
             {
               if (i==0) LCD_set_XY(X,Y+1);
               else
                  LCD_set_XY((X+(ch_with+row)*i),Y+1);
              }
           LCD_write_byte(write_chinese[line+i][n],1);
         }
       i++;
       LCD_set_XY((X+(ch_with+row)*i),Y);
      }
  }
 
/*-----------------------------------------------------------------------
LCD_move_chinese_string: 汉字移动

输入参数:X、Y    :显示汉字的起始X、Y坐标;
          T       :移动速度;

编写日期          :2009-5-1
最后修改日期      :2009-5-2
-----------------------------------------------------------------------*/                       
void chinese_string (unsigned char X, unsigned char Y, unsigned char T)
  {
    unsigned char i,n,j=0;
    unsigned char buffer_h[84]={0};
    unsigned char buffer_l[84]={0};
     
    for (i=0; i<130; i++)
      {
        buffer_h[83] = move_chinese_string[i/12][j];
        buffer_l[83] = move_chinese_string[i/12][j+12];
        j++;
        if (j==12) j=0;
       
        for (n=0; n<83; n++)
          {
            buffer_h[n]=buffer_h[n+1];
            buffer_l[n]=buffer_l[n+1];
          }
       
        LCD_set_XY(X,Y);
        for (n=0; n<83; n++)
          {
            LCD_write_byte(buffer_h[n],1);
          }
       
        LCD_set_XY(X,Y+1);
        for (n=0; n<83; n++)
          {
            LCD_write_byte(buffer_l[n],1);
          }
         
       delay_nms(T);
      }
}

/*-----------------------------------------------------------------------
LCD_draw_map      : 位图绘制函数

输入参数:X、Y    :位图绘制的起始X、Y坐标;
          *map    :位图点阵数据;
          Pix_x   :位图像素(长)
          Pix_y   :位图像素(宽)

编写日期          :2009-5-1
最后修改日期      :2009-5-2
-----------------------------------------------------------------------*/
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
                  unsigned char Pix_x,unsigned char Pix_y)
  {
    unsigned int i,n;
    unsigned char row;
   
    if (Pix_y%8==0) row=Pix_y/8;      //计算位图所占行数
      else
        row=Pix_y/8+1;
   
    for (n=0;n<row;n++)
      {
       LCD_set_XY(X,Y);
        for(i=0; i<Pix_x; i++)
          {
            LCD_write_byte(map[i+n*Pix_x], 1);
          }
        Y++;                         //换行
      }     
  }

/*-----------------------------------------------------------------------
LCD_write_byte    : 使用SPI接口写数据到LCD

输入参数:data    :写入的数据;
          command :写数据/命令选择;

编写日期          :2009-5-1
最后修改日期      :2009-5-2
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char Data, unsigned char CMD_DATA)
  {
//    unsigned char i;
//    //PORTB &= ~LCD_CE ;          // 使能LCD
//    LCD_CE = 0;
//   
//    if (command == 0)
//     // PORTB &= ~LCD_DC ;         // 传送命令
//     LCD_DC = 0;
//    else
//     // PORTB |= LCD_DC ;          // 传送数据
//     LCD_DC = 1;
//  for(i=0;i<8;i++)
//  {
//   if(dat&0x80)
//    LCD_SDIN = 1;
//   else
//    LCD_SDIN = 0;
//   LCD_SCLK = 0;
//   dat = dat << 1;
//   LCD_SCLK = 1;
//  }
//   // SPDR = data;   // 传送数据到SPI寄存器
//
//    //while ((SPSR & 0x80) == 0);         // 等待数据传送完毕
// 
//    //PORTB |= LCD_CE ;   // 关闭LCD
//     LCD_CE = 1;
 unsigned char i;
  LCD_CE = 0;           //Enable LCD
  LCD_DC =CMD_DATA;     //写命令还是写数据
  for(i=0;i<8;i++)
  {
     LCD_SCLK=0;
     if(Data & 0x80)       //MSB first高位优先
      LCD_SDIN=1;      //传输1
     else
      LCD_SDIN=0;      //传输0
     LCD_SCLK=1;      //始终为1时锁存
     Data<<=1;
  }
  LCD_SCLK=0;       //时钟清零
  LCD_CE=1;        //disable LCD关液晶使?
  }

 

/******************english_6x8_pixel.h***********************************/

code unsigned char font6x8[][6] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp
    { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
    { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
    { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #
    { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $
    { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   // %
    { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   // &
    { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   // '
    { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (
    { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )
    { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *
    { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +
    { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   // ,
    { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   // -
    { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   // .
    { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   // /
    { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0
    { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1
    { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2
    { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3
    { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4
    { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5
    { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6
    { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7
    { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8
    { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9
    { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   // :
    { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;
    { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   // <
    { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   // =
    { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   // >
    { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?
    { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   // @
    { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   // A
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C
    { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D
    { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F
    { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G
    { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H
    { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I
    { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J
    { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K
    { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L
    { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M
    { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N
    { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O
    { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P
    { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q
    { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R
    { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   // S
    { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T
    { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U
    { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V
    { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W
    { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   // X
    { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y
    { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z
    { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [
    { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // 55
    { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]
    { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^
    { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   // _
    { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   // '
    { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },   // a
    { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   // c
    { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   // d
    { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   // e
    { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f
    { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   // g
    { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h
    { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i
    { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },   // j
    { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k
    { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l
    { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n
    { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   // o
    { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   // p
    { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   // q
    { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r
    { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   // s
    { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t
    { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u
    { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v
    { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w
    { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },   // x
    { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   // y
    { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   // z
    { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 }    // horiz lines
};

 

/******************bmp_pixel.h.h***********************************/

 *    宽×高(像素): 40×24
 *     字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/120字节  

 *            网上下个图片转化数组的程序转换很方便                                                 */

code unsigned char bmp[]={.....};

 


 

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客