Stillness_Tr

3310驱动续

0
阅读(1372)


改了一下中文显示,16*16和12*12,本来想在做一个10*10的,效果不是很好。

// Mega128 port B pinout for LCD.
#include <iom128v.h>
#include <macros.h>
#define LCD_DC                 0x20 // LCD第4脚, Mega128:PB5
#define LCD_CE                 0x10 //   LCD第5脚, Mega128:PB4
#define LCD_RST                0x08 // LCD第8脚,   Mega128:PB3(MISO)
#define SPI_MOSI               0x04 // LCD第3脚, Mega128:PB2(MOSI)
#define SPI_CLK                0x02 // LCD第2脚, Mega128: PB1(SCK)

/************************英文字库*********************************************/
// 6 x 8 font
// 1 pixel space at left and bottom
// index = ASCII - 32
const 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
};
/***********************中文字库16*16*********************************************/
const unsigned char chinese_16x16[]=
{
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,
0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,
0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,/*"中",0*/
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,
0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,
0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,/*"国",1*/
0x10,0x92,0x72,0xFE,0x91,0x19,0x90,0x88,
0x44,0x53,0xA2,0x52,0x0A,0x06,0x00,0x00,
0x02,0x01,0x00,0xFF,0x00,0x81,0x88,0x44,
0x46,0x29,0x11,0x09,0x05,0x03,0x01,0x00,/*"移",2*/
0x20,0x24,0x24,0xE4,0x24,0x24,0x24,0x20,
0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,
0x08,0x1C,0x0B,0x08,0x0C,0x05,0x4E,0x24,
0x10,0x0C,0x03,0x20,0x40,0x3F,0x00,0x00 /*"动",3*/
};
/***********************中文字库12*12****************************************/
const unsigned char chinese_12x12[]=
{
0x00,0x7C,0x44,0x44,0x44,0xFF,0x44,0x44,
0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/
0x00,0xFF,0x01,0x15,0x15,0xFD,0x15,0x55,
0x95,0x01,0xFF,0x00,0x00,0x07,0x05,0x05,
0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x00,/*"国",1*/
0x8A,0x6A,0xFE,0x29,0x49,0x24,0xAA,0x53,
0x6A,0x46,0xC2,0x00,0x01,0x00,0x07,0x00,
0x05,0x05,0x04,0x03,0x02,0x01,0x00,0x00,/*"移",2*/
0x92,0x52,0x32,0x52,0x92,0x10,0x08,0xFF,
0x08,0x08,0xF8,0x00,0x03,0x01,0x01,0x01,
0x05,0x02,0x01,0x04,0x04,0x06,0x01,0x00 /*"动",3*/
};

/***********************lcd延迟函数******************************************/
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void)                 //1us延时函数
{
   asm("nop");
}
void delay_nus(unsigned int n)       //N us延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
}
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();
}
/************************3310驱动程序***********************************/
/*-----------------------------------------------------------------------
LCD_write_byte    : 使用SPI接口写数据到LCD
输入参数:data    :写入的数据;
          command :写数据/命令选择;
编写日期          :2004-8-10
最后修改日期      :2004-8-13
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data, unsigned char command)
{
    PORTB &= ~LCD_CE ;          // 使能LCD
   
    if (command == 0)
      PORTB &= ~LCD_DC ;         // 传送命令
    else
      PORTB |= LCD_DC ;          // 传送数据
    SPDR = data;    // 传送数据到SPI寄存器
    while ((SPSR & 0x80) == 0);         // 等待数据传送完毕
    PORTB |= LCD_CE ;    // 关闭LCD
}
/*-----------------------------------------------------------------------
LCD_clear         : LCD清屏函数
编写日期          :2004-8-10
最后修改日期      :2004-8-10
-----------------------------------------------------------------------*/
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_init          : 3310LCD初始化
编写日期          :2004-8-10
最后修改日期      :2004-8-10
-----------------------------------------------------------------------*/
void LCD_init(void)
{
    PORTB &= ~LCD_RST;          // 产生一个让LCD复位的低电平脉冲
    delay_1us();
    PORTB |= LCD_RST;
   
    PORTB &= ~LCD_CE ;   // 关闭LCD
    delay_1us();
    PORTB |= LCD_CE;   // 使能LCD
    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); // 设定显示模式,正常显示
       
    PORTB &= ~LCD_CE ;          // 关闭LCD
}
/*-----------------------------------------------------------------------
LCD_set_XY        : 设置LCD坐标函数
输入参数:X       :0-83
          Y       :0-5
编写日期          :2004-8-10
最后修改日期      :2004-8-10
-----------------------------------------------------------------------*/
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       :显示的字符;
编写日期          :2004-8-10
最后修改日期      :2004-8-10
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
{
    unsigned char line;
    c =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
编写日期          :2004-8-10
最后修改日期      :2004-8-10  
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s,int d)
{
    LCD_set_XY(X,Y);
    while (*s)
      {
   delay_nms(d);
LCD_write_char(*s);
s++;
      }
}
/*-----------------------------------------------------------------------
LCD_draw_map      : 位图绘制函数
输入参数:X、Y    :位图绘制的起始X、Y坐标;
          *map    :位图点阵数据;
          Pix_x   :位图像素(长)
          Pix_y   :位图像素(宽)
编写日期          :2004-8-13
最后修改日期      :2004-8-13
-----------------------------------------------------------------------*/
void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,const 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++;                         //换行
      }     
}

/*------------------------------------------------------------------------------
中文显示函数(16*16/12*12/10*10)
输入参数:X Y 坐标
          MAP 字库数组,用哪种类型的汉字,则传入哪种参数
    chinese_ID    汉字编号,具体参照汉字库数组
    chage_font    字体选择 0:12*12
                                        1:16*16
                                        2: 10*10 显示效果不好,没有做出来
------------------------------------------------------------------------------*/
void lcd_chinese_auto_char(unsigned char X,unsigned char Y, const unsigned char *map,
                          unsigned char chinese_ID,unsigned char chage_font)
{ unsigned char i,j;
   unsigned char contel_x;
LCD_set_XY(X,Y);
if(chage_font==0)contel_x=12;
if(chage_font==1)contel_x=16;
// if(chage_font==2)contel_x=10;
for (i=0;i<2;i++)//两行(16)
{
if(i==1) {Y++; LCD_set_XY(X,Y);}//换行
for(j=0;j<contel_x;j++)
LCD_write_byte(map[(j+i*contel_x)+chinese_ID*contel_x*2],1);//每行16/12列,共两行,chinese_ID*contel_x*2为汉字偏移起始地址
}
}
/*------------------------------------------------------------------------------
中文显示流函数(16*16/12*12/10*10)
输入参数:X Y 坐标
          MAP 字库数组,用哪种类型的汉字,则传入哪种参数
    chinese_ID    汉字编号,具体参照汉字库数组
     chinese_ID_start   汉字起始编号
        NUM    汉字输入个数
    chage_font    字体选择 0:12*12
                                         1:16*16
                                        2: 10*10 显示效果不好,没有做出来
------------------------------------------------------------------------------*/
void lcd_chinese_auto_string(unsigned char X,unsigned char Y,const unsigned char*map,
                             unsigned char chinese_ID_strat,unsigned char NUM,
        unsigned char chage_font)
{
unsigned char i;
for(i=0;i<NUM;i++)
{
lcd_chinese_auto_char(X,Y,map,chinese_ID_strat,chage_font);
if(chage_font==0)X+=12;
if(chage_font==1)X+=16;
//if(chage_font==2)X+=10;;//字体间距选择
chinese_ID_strat++;
}
}