菜鸟一枚,用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();
}
}
|