请给位大神帮我看看这个stm32驱动lcd5110的程序,不知道什么原因怎么都不显示

2019-07-14 20:58发布

/***********     5110.h      ***************/
#ifndef __5110_H
#define __5110_H
#include "sys.h"

void LCD_GPIO_Init(void);//硬件接口初始化
void LCD_init(void);//5110初始化
void LCD_clear(void);//清屏
void LCD_write_byte(unsigned char dat, unsigned char command);//写数据、命令
void LCD_set_XY(unsigned char X, unsigned char Y);//设置坐标
void LCD_write_char(unsigned char c);//写入一个字符unsigned char X, unsigned char Y,
void LCD_write_str(unsigned char X, unsigned char Y,unsigned char *string );//写入一个字符串
void LCD_write_num(unsigned char X,unsigned char Y,unsigned int num);//写数字

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_chinese_string(unsigned char X, unsigned char Y,unsigned char ch_with,
        unsigned char num, unsigned char line,unsigned char row) ;//汉字显示
#endif





/***********     5110.c      ***************/
#include "delay.h"
#include "sys.h"
#include "math.h"
#include "stdlib.h"
#include "5110.h"

//LCD 的 IO 口宏定义
#define CLR_RESET PAout(0)=0        //RES->PA1
#define SET_RESET PAout(0)=1
#define CLR_SCE PAout(2)=0                //SCE->PAO
#define SET_SCE PAout(2)=1               
#define CLR_DC PAout(4)=0                //DC->PA2
#define SET_DC PAout(4)=1
#define CLR_SDIN PAout(6)=0                //DIN->PA3
#define SET_SDIN PAout(6)=1               
#define CLR_SCLK PCout(4)=0                //CLE->PC3
#define SET_SCLK PCout(4)=1

unsigned int table[20]; //功能 5110 用于存放数字

const unsigned char font6x8[][6] = //功能 ASCII 码
{
{ 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
};
/*
**********************************************************
*函数名:LCD_GPIO_Init
*功能:初始化LCD IO口
*参数:无

*返回值:无
*备 注:
**********************************************************
*/
void LCD_GPIO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
/********************使能 A 口************************/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能时钟总线
//设置 A0 、A1、A2、A3口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6;//A0,1,2,3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA
        GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6);//置位PA
/********************使能 C 口************************/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//设置 C3 口
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//C3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC,GPIO_Pin_4);
       
}
/*
**********************************************************
*函数名:LCD_init
*功能:初始化LCD
*参数:无

*返回值:无
*备 注:
**********************************************************
*/
void LCD_init(void)
{       
        LCD_GPIO_Init();
        CLR_RESET;
        delay_us(2);
        SET_RESET;//复位
        CLR_SCE;
        SET_SCE;
        LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
        LCD_write_byte(0xc8, 0); // 设置偏置电压,修改可改变5110点阵显示的亮度,可调范围为0x80-0xff
              /*5110接3.3V时偏置电压改为(0xc0,0),接5V时改为(0xc8,0)*/
        LCD_write_byte(0x06, 0); //温度校正
        LCD_write_byte(0x13, 0);//1:48(0x10-0x17)
        LCD_write_byte(0x20, 0);// 使用基本命令。并设置V=0,水平寻址
        LCD_write_byte(0x0c, 0);// 设定显示模式,正常显示(普通显示)
        LCD_clear();//清屏
        CLR_SCE;
}

/*
**********************************************************
*函数名:LCD_write_byte
*功能:模拟SPI接口时序写数据/命令LCD
*参数:dat    :写入的数据;
      command :写数据(1)/命令选择(0);
*返回值:无
*备 注:
**********************************************************
*/
void LCD_write_byte(unsigned char dat, unsigned char command)
{
        unsigned char i;
        CLR_SCE; //5110片选有效,允许输入数据
        if (command == 0)
                CLR_DC;
        else
                SET_DC;        //写数据
        for(i=0;i<8;i++)//传送8bit数据
        {
                if(dat&0x80)
                SET_SDIN;
                else
                CLR_SDIN;
                CLR_SCLK;
                dat=dat<<1;
                SET_SCLK;
        }
        SET_SCE;        //禁止5110
}
/*
**********************************************************
*函数名: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
*功能: LCD写一个6X8的字符
*参数:c  
*返回值:无
备 注:
**********************************************************
*/
//有变动!!unsigned char X, unsigned char Y,
void LCD_write_char(unsigned char c)
{
        unsigned char line;
        //LCD_set_XY(X,Y);
        c-= 32; //数据的行号,ASCII码-32,从空格还是取码
        for (line=0; line<6; line++)
        LCD_write_byte(font6x8[c][line],1);
       
}
/*
**********************************************************
*函数名:LCD_write_str
*功能: LCD写6X8的字符串
*参数:X , Y , string   
*返回值:无
备 注:
**********************************************************X,Y,
*/
void LCD_write_str(unsigned char X, unsigned char Y,unsigned char *string )
{
        LCD_set_XY(X,Y);
        while(*string)
        {
                LCD_write_char(*string);
                string++;
        }
}
/*
***************************************************************
*函数名:LCD_write_num
*功能:写入数字
*参数:num  
*返回值:无
****************************************************************
*/
void LCD_write_num(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%10 + 0x30;
                num /=10;
                i++;
        }
        LCD_write_str(X,Y,(char *)str);
}
/*
**********************************************************
*函数名:LCD_draw_dmp_pixel
*功能: 绘图
*参数:   X、Y    :位图绘制的起始X、Y坐标;

          *map    :位图点阵数据;

          Pix_x   :位图像素(长) <=84

          Pix_y   :位图像素(宽) <=48  
*返回值:无
*备 注:
**********************************************************
*/
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; //如果位图所占行数为整数
        LCD_set_XY(X,Y);
        for (n=0;n<row;n++)  //换行
        {
                for(i=0;i<Pix_x;i++)
                {
                        LCD_set_XY(X+i,Y+n);
                        LCD_write_byte(map[i+n*Pix_x], 1);
                }
        }
}

/*
*****************************************************************
*函数名: LCD_write_chinese_string  
*参  数: X                :设置写入汉字列位置               
*             Y                :设置写入汉字行位置      
*             ch_with:写入汉字宽度                  
*              num        :写入汉字数量      
*              line        :汉字间行间距        
*              row        :汉字间列间距      
*功  能: LCD显示汉字                  
*返回值:无                                    
*备  注:无                  
**********************************************************************
*/

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(font16[line+i][n],1);
                }
                i++;
                LCD_set_XY((X+(ch_with+row)*i),Y);
        }
}



主程序是
#include "delay.h"
#include "5110.h"


//主函数
int main(void)
{
        delay_init();//延时函数初始化       
        NVIC_Configuration();//设置中断优先级分组              
        uart_init(115200);//串口比特率115200       
        LCD_init();                                                    
        LCD_clear();
        while(1)
        {
       LCD_write_str(0,1,"01235467");//显示当前温度
       LCD_write_str(0,3,"test");//显示当前湿度                 
       LCD_write_num(0,4,123456);//显示当前湿度
        }
         
}


希望大神支支招!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。