您的位置:首页 > 其它

Nokia LCD 5110 移植(基于MSP430F5529)

2016-09-11 19:08 218 查看
今天也没什么想说的,因为某些事情忙的不行不行的。就偷个懒贴上自己移植的代码吧,希望能帮到初学者们。

头文件nokia_5110.h

#ifndef __nokia_5110_h_
#define __nokia_5110_h_

#include <msp430.h>

#define LCD_5110_DIR            P3DIR
#define LCD_5110_OUT        P3OUT

#define   LCD_RST    2
#define   LCD_CE    3
#define   LCD_DC    4
#define   LCD_DIN    5
#define   LCD_CLK    6

//extern void LCD_PORT_INIT(void);
extern void LCD_init(void);
extern void LCD_clear(void);
extern void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
extern void LCD_write_chinese_string(unsigned char X, unsigned char Y,
unsigned char ch_with,unsigned char num,
unsigned char line,unsigned char row);
extern void LCD_write_char(unsigned char c);
extern void LCD_write_byte(unsigned char dat, unsigned char dc);

extern void LCD_ShowChar(unsigned char X,unsigned char Y,unsigned char c);
extern unsigned int LCD_mypow(unsigned char m,unsigned char n);
extern void LCD_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len);
extern void LCD_ShowFloat(unsigned char x, unsigned char y,float num,unsigned int n1,unsigned int n2);
extern void LCD_ShowString(unsigned char X,unsigned char Y,char *s);

#endif


函数nokia_5110.c

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

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

void delay_1us(void)                 //1us延时函数
{
unsigned int i;
for(i=0;i<100;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();
}

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

LCD_5110_DIR |= (0x01 << LCD_RST) + (0x01 << LCD_CE) + (0x01 << LCD_DC)
+ (0x01 << LCD_DIN) + (0x01<< LCD_CLK);

LCD_5110_OUT &= ~(0x01 << LCD_RST);
delay_1us();

// LCD_RST = 1;
LCD_5110_OUT |= (0x01 << LCD_RST);

// 关闭LCD
//LCD_CE = 0;
LCD_5110_OUT &= ~(0x01 << LCD_CE);
delay_1us();
// 使能LCD
//LCD_CE = 1;
LCD_5110_OUT |= (0x01 << LCD_CE);
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_5110_OUT &= ~(0x01 << LCD_CE);
}

/*-----------------------------------------------------------------------
LCD_clear         : LCD清屏函数
-----------------------------------------------------------------------*/
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
-----------------------------------------------------------------------*/
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       :显示的字符;
-----------------------------------------------------------------------*/
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
-----------------------------------------------------------------------*/
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     :汉字显示的行间距
测试:
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]
,1);
}
i++;
LCD_set_XY((X+(ch_with+row)*i),Y);
}
}
/*-----------------------------------------------------------------------
LCD_write_byte    : 使用SPI接口写数据到LCD

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

-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned char i;
LCD_5110_OUT &= ~(0x01 << LCD_CE); // msp430

if (command == 0)
// PORTB &= ~LCD_DC ;         // 传送命令
//     LCD_DC = 0;
LCD_5110_OUT &= ~(0x01 << LCD_DC);
else
// PORTB |= LCD_DC ;               // 传送数据
// LCD_DC = 1;
LCD_5110_OUT |= (0x01 << LCD_DC);
for(i=0;i<8;i++)
{
if(dat&0x80)
//SDIN = 1;
LCD_5110_OUT |= (0x01 << LCD_DIN);
else
//SDIN = 0;
LCD_5110_OUT &= ~(0x01 << LCD_DIN);
//SCLK = 0;
LCD_5110_OUT &= ~(0x01 << LCD_CLK);
dat = dat << 1;
//SCLK = 1;
LCD_5110_OUT |= (0x01 << LCD_CLK);
}
// SPDR = data;          // 传送数据到SPI寄存器

//while ((SPSR & 0x80) == 0);         // 等待数据传送完毕

//PORTB |= LCD_CE ;         // 关闭LCD
// LCD_CE = 1;
LCD_5110_OUT |= (0x01 << LCD_CE);
}

/*************************************MY PRO***********************************************/
/*
* 指定位置显示字符
* 输入参数:    X   列位置
*          Y   行位置
*          c   显示的字符
*/
void LCD_ShowChar(unsigned char X,unsigned char Y,unsigned char c)
{
LCD_set_XY(X,Y);
LCD_write_char(c);
}
//m^n函数
unsigned int LCD_mypow(unsigned char m,unsigned char n)
{
unsigned int result=1;
while(n--)result*=m;
return result;
}
//显示一个数
//x,y :起点坐标
//len :数字的位数
//num:数值(0~4294967295);
void LCD_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len)
{
unsigned char t,temp;
unsigned char enshow=0;
for(t=0;t<len;t++)
{
temp=(num/LCD_mypow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+6*t,y,'0');
continue;
}else enshow=1;
}
LCD_ShowChar(x+6*t,y,temp+'0');
}
}
//显示浮点型数字
//x,y:起点坐标; num:待显示数字; n1,n2:小数点前后各要保存的位数; size:字号
void LCD_ShowFloat(unsigned char x, unsigned char y,float num,unsigned int n1,unsigned int n2)
{
int num0,num1,i,p=1;
num0=num;
for(i=0;i<n2;i++)   p=p*10;
num1=(int)(num*p)%p;
LCD_ShowNum(x,y,num0,n1);
LCD_ShowChar(x+n1*6+1,y,'.');
LCD_ShowNum(x+(n1+1)*6,y,num1,n2);
}

void LCD_ShowString(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}


英文字库english_6x8_pixel.h

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
};


中文的字库就自行用取模软件取吧。初始化到write_chinese_string_pixel.h里面就行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息