CC2530学习笔记之Nokia 5110LCD程序

最近开始学习cc2530芯片,遇到一个需求需要使用到lcd5110,刚好写了程序实现基本显示功能。

直接上手代码

#include<iocc2530.h>
#define uint unsigned int
#define uchar unsigned char
/*
   RST 复位
   CE 片选
   DC 数据/指令
   DIN 串行数据线 
   CLK 串行时钟线

   VCC 3.3V电源
   BL 背光控制端,可以不接 
   GND 地线
*/
#define   LCD_RST P1_0
#define   LCD_CE  P1_1
#define   LCD_DC  P1_2
#define   LCD_DIN  P1_3
#define   LCD_CLK  P1_4

void LCD_Init(void);//初始化I/O口
void LCD_WriteByte(uchar dat, uchar command);//写数据
void LCD_Set_XY(uchar X, uchar Y);//设置X,Y
void LCD_Clear(void);//清屏

//通用显示函数,适合自定义大小格式
void LCD_display(uchar X,uchar Y,uchar row,uchar col,uchar data);

void LCD_WriteChar(uchar x,uchar y,uchar c);//发送char
void LCD_WriteString(uchar X,uchar Y,char *s);//发送string
void LCD_WriteNum(uchar X,uchar Y,uint num);//发送num
void LCD_Write_16X16Font(uchar Y,uchar X,uchar *address);//发送16*16字
void LCD_Write_16X8Font(uchar Y,uchar X,uchar *address);//发送16*8字
voi*d LCD_Write_48X48Font(uchar Y,uchar X,uchar *address);//发送48*48字
uchar fu[]={//48*48的福字
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x1C,0x7C,0xF8,0xF0,0xE0,0x00,0x00,
0x00,0x00,0x00,0x30,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,
0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x78,0x7C,0x78,0x70,0x60,0x00,0x00,0x00,
0x00,0x00,0x30,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x73,0x77,0xF3,0xF8,0xFC,
0x78,0x70,0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFC,0xFC,0x1C,0x1C,0x1C,0x1C,0x1C,
0x1C,0x1C,0x1C,0x1C,0x1C,0xFC,0xFE,0xFE,0xFE,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xFC,0xFF,0x7F,0xEF,0xE1,
0xC0,0x80,0x80,0x00,0xC0,0xC0,0x80,0x90,0xBF,0x9F,0x9F,0x8E,0x8E,0x8E,0x8E,0x8E,
0x8E,0x8E,0x8E,0x8E,0x8E,0x9F,0x9F,0x9F,0x9F,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xC0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0xFF,0xFF,0xFF,0x00,0x00,0x03,
0x0F,0x1F,0x0F,0x00,0xFF,0xFF,0xFF,0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0xFF,0xFF,
0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0xFF,0xFF,
0xFF,0x83,0x83,0x83,0x83,0x83,0x83,0x83,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x3F,0x3F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x1F,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x1F,0x1F,0x0F,0x00,0x00,0x00,0x00,0x00};
//16*8的C
uchar C[]={0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00};
//16*8的 % 符号
uchar baifenbi[]={0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00};
uchar wen[]=//16*16的“温 ”
{0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00};
uchar du[]={//16*16的“度 ”
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00};
uchar shi[]={//16*16的“湿 ”
0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00};
unsigned char font6x8[][6] =  //ASCII码
{
  { 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上用的下划线
};
void LCD_Init(void)
{
  unsigned char i;
  P1SEL &= 0x1f;//配置为通用I\O口
  P1DIR |= 0x1f;//配置为输出模式
  
  LCD_RST=0;            //复位
  for(i=0;i<150;i++);  //微微延时等待稳定
  LCD_RST=1;          //释放复位
  LCD_WriteByte(0x21, 0);// 使用扩展命令设置LCD模式
  LCD_WriteByte(0xc2, 0);// 设置偏置电压,修改可改变5110点阵显示的亮度
  LCD_WriteByte(0x13, 0);//1:48
  LCD_WriteByte(0x06, 0); //设置温度系数
  LCD_WriteByte(0x20, 0); // 使用基本命令。并设置V=0,水平寻址
  LCD_Clear();           // 清屏
  LCD_WriteByte(0x0c, 0);//设定显示模式,正常显示(普通显示)
  LCD_CE=0;      //5110片选有效,允许输入数据
}
 
void LCD_WriteByte(unsigned char dat, unsigned char command)
{
  unsigned char i;
  LCD_CE=0;          //5110片选有效,允许输入数据
  if (command == 0) //写命令
    LCD_DC=0;                  
  else  
    LCD_DC=1;      //写数据
  for(i=0;i<8;i++)//传送8bit数据
  {
      if(dat&0x80)
        LCD_DIN=1;
      else
        LCD_DIN=0;
      LCD_CLK=0;
      dat = dat << 1;
      LCD_CLK=1;
  }
   LCD_CE=1;    //禁止5110
}


void LCD_Set_XY(unsigned char X, unsigned char Y)
{
  
  LCD_WriteByte(0x40 | Y, 0);// column 列
  LCD_WriteByte(0x80 | X, 0);// row    行
}

void LCD_Clear(void)
{
  unsigned char t;
  unsigned char k;
  LCD_Set_XY(0, 0);//设置RAM起始地址
  //5110 lcd是48*84个点,而列是每一位管理8个列点
  for(t=0;t<6;t++)//6bit*84=6*8*84个点
  {
    for(k=0;k<84;k++)
    {
      LCD_WriteByte(0x00,1);             
    }
  }
}

void LCD_WriteChar(unsigned char x,unsigned char y,unsigned char c)
{
    unsigned char i;
    //ASCII码中字符的编码 -32 就刚好对应 font6x8 数组的行号
    c -= 32;           //数组的行号
    LCD_Set_XY(x,y);        
    for(i=0; i<6; i++)
    {
       LCD_WriteByte(font6x8[c][i], 1);   
    }
}

void LCD_WriteString(unsigned char X,unsigned char Y,char *s)
{
  while(*s)
  {
     LCD_WriteChar(X,Y,*s);
     s++;
     X += 6;
  }
}

void LCD_WriteNum(unsigned char X,unsigned char Y,unsigned int num)
{
  unsigned char str[8],i=0,len=0;
  unsigned int temp;
  temp = num;
  while(temp)
  {
    temp /=10;
    len++;
  }
  if(!num)
  {
     len++;
     str[0]=0x30;
  }  
  str[len] = 0;
  while(num)
  {
    str[len-i-1] = num + 0x30;
    num /=10;
    i++;
  }
  LCD_WriteString(X,Y,(char *)str);
}

void LCD_Write_16X16Font(unsigned char Y,unsigned char X,unsigned char *address)
{
    unsigned char i;
    LCD_Set_XY(X,Y);
    for(i=0;i<16;i++) {LCD_WriteByte(*address,1);address++;}
    LCD_Set_XY(X,++Y);
    for(i=0;i<16;i++) {LCD_WriteByte(*address,1);address++;}   
}

void LCD_Write_48X48Font(unsigned char Y,unsigned char X,unsigned char *address)
{
    unsigned char i,j;
    LCD_Set_XY(X,Y);
    for (j=0;j<6;j++){     
     for(i=0;i<48;i++){LCD_WriteByte(*address,1);address++;}     
     LCD_Set_XY(X,++Y);
    }
}

void LCD_Write_16X8Font(unsigned char X,unsigned char Y,unsigned char *addss)
{
    unsigned char i;
    LCD_Set_XY(X,Y);
    for(i=0;i<8;i++) {LCD_WriteByte(*addss,1);addss++;}
    LCD_Set_XY(X,++Y);
    for(i=0;i<8;i++) {LCD_WriteByte(*addss,1);addss++;}   
}
/*
   这个函数可以自己设定显示的内容的大小,需用取模软件得到待显示的数据;
  在取模时需注意取模方式,我这里所有的取模都设置是(纵向取模、字节倒序)方式
*/
// 设置    X,Y起点;   行、列大小    数组地址名
void LCD_display(uchar X,uchar Y,uchar row,uchar col,uchar *data)
 {
   uchar i,j;
   for(i=0;i<row;i++)
   {
    for(j=0;j<col;j++)
    {
       LCD_Set_XY(X+j,Y+i);
       LCD_WriteByte(*++data,1);
    }
   }
 }

void main()
{   
   LCD_Init();
    while(1)
    { 
      /*
      //显示   温度:29.76C
    LCD_Write_16X16Font(0,0,wen);  
    LCD_Write_16X16Font(0,16,du); 
    LCD_WriteChar(32,1,':');// y x ;
    LCD_WriteNum(40,9,2);
    LCD_WriteNum(46,9,9);
    LCD_WriteChar(52,1,'.');// y x .
    LCD_WriteNum(58,9,7);
    LCD_WriteNum(64,9,6); 
    LCD_WriteChar(72,1,'.');
    LCD_Write_16X8Font(72,0,C);
    
    //显示       湿度:29.76%
    LCD_Write_16X16Font(3,0,shi);
    LCD_Write_16X16Font(3,16,du);
    LCD_WriteChar(32,4,':');
    LCD_WriteNum(40,28,2);
    LCD_WriteNum(46,28,9);
    LCD_WriteChar(52,4,'.');// y x .
    LCD_WriteNum(58,28,7);
    LCD_WriteNum(64,28,6);   
    LCD_Write_16X8Font(72,3,baifenbi);
       
 */     
    }
}

串行总线协议–发送一个字节

串行总线协议

控制指令集

在这里插入图片描述
Nokia5110液晶屏数据手册
如有错误,望指正。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值