打印
[STM32]

求教STM32写OCM12864-3型号不带字库的液晶

[复制链接]
1297|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
13HLY|  楼主 | 2015-8-30 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜鸟一枚,用STM32F1写一个OCM12864-3不带字库的液晶,能显示点阵但就是没有内容的显示,请大神们帮忙看看是怎么一回事。。。已经弄了三天了实在没辙了。。。程序如下,字库我就不贴出来了,谢谢各位了
#include "12864.h"
#include "delay.h"
#include "sys.h"

#define  CS1       GPIO_Pin_8                 // top part enable
#define  CS2           GPIO_Pin_9                 // bottom part enable
#define  EP        GPIO_Pin_10                 // operate enable
#define  RW        GPIO_Pin_11                 // write enable
#define  RS        GPIO_Pin_12                 // Read enable
#define  RST       GPIO_Pin_1                 // Reset
#define  LED       GPIO_Pin_0                 // LED

#define  LCD_GPIO_DATA         GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
#define Disp_On    0x3f
#define Disp_Off   0x3e
#define Col_Add    0x40
#define Page_Add   0xb8
#define Start_Line 0xc0

#define BasePart1  0x00
#define BasePart2  0x28
#define BasePart3  0x50
#define BasePart4  0x00

unsigned char HanZiTable[]="数值显示系统配置功能选择";
unsigned int vFunction;
u8 PowerPixelL[10],PowerPixelR[10];

GPIO_InitTypeDef  GPIOStru;  //定义用于定义所有引脚为输出的变量?

void Delay_nus(unsigned int N)
{
        unsigned char i=10;
        while(N--)
        {
                while(i--);
        }
}

void Delay_nms(unsigned int N)
{
        while(N--){Delay_nus(1000);}
}

void InitLcdDataIn(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //把所有端口初始化为输出模式的函数。   

        GPIOStru.GPIO_Mode = GPIO_Mode_IN_FLOATING;           //定义数据引脚为浮空输入的变量初始化。
        GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
        GPIOStru.GPIO_Pin = LCD_GPIO_DATA;//GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_Init(GPIOA,&GPIOStru);
}

void InitLcdDataOut(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIOStru.GPIO_Mode  = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
        GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
        GPIOStru.GPIO_Pin   = LCD_GPIO_DATA;
        GPIO_Init(GPIOA,&GPIOStru);
}

void InitLcdCmdOut(void)
{       
        GPIO_InitTypeDef  GPIOStrution;//用于B脚
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

//        GPIOStru.GPIO_Mode  = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
//        GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIOStru.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
//        GPIO_Init(GPIOA,&GPIOStru);

        GPIOStrution.GPIO_Mode  = GPIO_Mode_Out_PP;//定义所有的引脚为推挽输出的变量初始化。
        GPIOStrution.GPIO_Speed = GPIO_Speed_50MHz;
        GPIOStrution.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_Init(GPIOB,&GPIOStrution);
}

/*------------------写命令到LCD------------------------------*/
void WriteCMD(unsigned char CMD)  
{
        unsigned int Gpio_Current;
InitLcdCmdOut();
InitLcdDataOut();
        GPIO_ResetBits(GPIOA,RS);//Write_DI_0;
        GPIO_ResetBits(GPIOA,RW);//Write_RW_0;       
        Gpio_Current =        ((GPIOA->ODR)&0xff00); //先把PC0~7位的输出口清零
        GPIOA->ODR = Gpio_Current |(CMD&0x00ff);//将16位的命令存放到寄存器中
        delay_us(2);
        GPIO_SetBits(GPIOA,EP);                   // Write_EN_1;
        delay_us(2);                                              // 下降沿最长的时间为25ns,此处需要修改
        GPIO_ResetBits(GPIOA,EP);                 // Write_EN_0;
}
/*-------------------写数据到LCD----------------------------*/

void WriteData(unsigned char Dispdata)
{       
        unsigned int  Gpio_Current;

        InitLcdDataOut();            //端口初始化
        InitLcdCmdOut();

        GPIO_SetBits(GPIOA,RS);       // Write_DI_1;
        GPIO_ResetBits(GPIOA,RW);     // Write_RW_0;
        Gpio_Current =        ((GPIOA->ODR)&0xff00);
        GPIOC->ODR = Gpio_Current |(Dispdata&0x00ff);
        delay_us(1);
        GPIO_SetBits(GPIOA,EP);       // Write_EN_1;
        delay_us(1);                   // 下降沿最长的时间为25ns,此处需要修改
        GPIO_ResetBits(GPIOA,EP);     // Write_EN_0;
}

/*-------------------读LCD数据----------------------------*/

unsigned char LcdReadData(void)
{
        unsigned char tmpin;
        InitLcdDataIn();
//        InitLcdDataOut();            //端口初始化
//        InitLcdCmdOut();
        GPIO_SetBits(GPIOA,RS);       // Write_DI_1;
        GPIO_SetBits(GPIOA,RW);     // Write_RW_1;
        delay_us(2);
        GPIO_SetBits(GPIOA,EP);       // Write_EN_1;
//        delay_us(2);
        tmpin=(unsigned char)(GPIO_ReadInputData(GPIOA)&0x00ff);
        InitLcdDataOut();
        GPIO_ResetBits(GPIOA,EP);       // Write_EN_0;
        return tmpin;
}

void LcdSetPosition(unsigned char page,unsigned char y)
{       
        page = 7-page;
        if(y < 64)//上屏
        {
                GPIO_SetBits(GPIOA,CS2);      // Write_MCS_1;
                GPIO_ResetBits(GPIOA,CS1);    // Write_SCS_0;
                WriteCMD(Page_Add+page);
                WriteCMD(Col_Add + y);       
        }
        else//下屏
        {
                GPIO_ResetBits(GPIOA,CS2);    // Write_MCS_0;
                GPIO_SetBits(GPIOA,CS1);      // Write_SCS_1;
                WriteCMD(Page_Add+page);
                WriteCMD(Col_Add+y-64);
        }
}

/*------------------清除内存---------------*/
void Clr_Scr(void)
{
        unsigned char i,j;
        for(i=0; i<8; i++)
        {
                LcdSetPosition(i,0);
                for(j=0;j<64;j++)
                        WriteData(0x00);
                  LcdSetPosition(i,64);
                for(j=0;j<64;j++)
                        WriteData(0x00);
        }       
}

/*------------------初始化LCD屏--------------------------*/
void LcdInit(void)
{
        GPIO_SetBits(GPIOB,LED);     // Write_FM_0;
//        GPIO_ResetBits(LCD12864_GPIO_CMD,FM);     // Write_FM_0;
        GPIO_ResetBits(GPIOB,RST);    // Write_RST_0;
        delay_ms(10);
        GPIO_SetBits(GPIOB,RST);      // Write_RST_1;
        delay_ms(10);
       
        GPIO_ResetBits(GPIOA,CS1);      // Write_CS_1;
        GPIO_ResetBits(GPIOA,CS2);      // Write_CS_2;

        delay_ms(10);
        WriteCMD(Disp_Off);
        WriteCMD(Page_Add + 0);
        WriteCMD(Start_Line + 0);
        WriteCMD(Col_Add + 0);
        WriteCMD(Disp_On);
}

void LcdDisplayWord(u8 page,u8 y,u8 HZnumber,u8 type)
{
        unsigned char i=0;
        LcdSetPosition(page,y);
        if(type==0)
        {
          for(i=0;i<16;i++)
                  WriteData(HanZi[HZnumber][i]);
                LcdSetPosition(page+1,y);
          for(i=0;i<16;i++)
                  WriteData(HanZi[HZnumber][16+i]);
        }
        else
        {
                for(i=0;i<16;i++)
                          WriteData(~HanZi[HZnumber][i]);
                LcdSetPosition(page+1,y);
                  for(i=0;i<16;i++)
                          WriteData(~HanZi[HZnumber][16+i]);
        }
}
/******************************************************************/
// asciicode--表示要写的字符          
// type--0:白底黑字   1:黑底白字
/******************************************************************/
void LcdDisplayASCII(u8 page,u8 y,u8 asciicode,u8 type)
{       
        unsigned char i=0;
        asciicode=asciicode-0x20;
        LcdSetPosition(page,y);
        if(type==0)
        {
                for(i=0;i<16;i++)
                        WriteData(ASCII[asciicode][i]);
        }
        else
        {
         for(i=0;i<16;i++)
                  WriteData(~ASCII[asciicode][i]);
        }                       
}
// 右半屏幕
void LcdDisplayTitle(void)
{
        unsigned char i;
        GPIO_SetBits(GPIOA,CS1);// =1;
        GPIO_ResetBits(GPIOA,CS2);// =0;
        LcdSetPosition(6,0);
        for(i=0;i<8;i++)
        {
                WriteData(PowerPixelL[i]);
        }
        LcdSetPosition(7,0);
        for(i=0;i<8;i++)
        {
                WriteData(PowerPixelR[i]);
        }
}

void LcdDisplayFunction(void)
{
        unsigned char i;
        for(i=0;i<4;i++)
        {
                LcdDisplayWord(i<<2,16,0,0);
        }
}

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "12864.h"
#define uchar unsigned char
#define uint unsigned int
#define LCM_Line2 16

#define uchar unsigned char
#define uint unsigned int

#define set_channel_number  0
#define set_date_year        1
#define set_date_mouth                   2
#define set_date_day         3
#define set_timer_hour       4
#define set_timer_minite     5
#define set_timer_second     6

#define yes 1
#define no 0

#define LCM_Line1        0
#define LCM_Line2   16
#define LCM_Line3        32
#define LCM_Line4        48
#define LCM_Line5        64
#define LCM_Line6        80
#define LCM_Line7        96
#define LCM_Line8        112

unsigned char display_buffer[8][8]={
"        ",
"        ",
"        ",
"        ",
"20140801",
"23:00:00",
"        ",
" Rev A  "
};
#define HZ_GDcekong       0

int main(void)
{
        uchar i=0,j;
       
        CanTxMsg TxMessage;

//        Clock_Init();
       
        delay_init(72);              //延时初始化
        InitLcdDataIn();
        InitLcdDataOut();            //端口初始化
        InitLcdCmdOut();
        LcdInit();                  //液晶初始化
        Clr_Scr();

        while(1)
        {
                for(i=0;i<4;i++)
                        LcdDisplayWord(i<<1,LCM_Line2,HZ_GDcekong+i,0);
                for(j=0;j<8;j++)
                        for(i=0;i<8;i++)
                                LcdDisplayASCII(i,j*16,display_buffer[j][i],0);
                                delay_ms(600);
//                                LcdDisplayASCII(3,3,7,0);
//        LcdInit();                  //液晶初始化
//                WriteData(0x00);
//        Clr_Scr();

        }
}

相关帖子

沙发
13HLY|  楼主 | 2015-8-30 09:58 | 只看该作者
自己顶了!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝