求解:stm32控制ks0108的LCD12864不出效果。

2019-07-21 08:11发布

测试管脚的输出正常,.h的程序如下:#ifndef __LCD_H
#define __LCD_H


#include<stm32f10x_lib.h>
#include"delay.h"
#include"sys.h"


#define RS PCout(8)
#define RW PCout(7)
#define EN PCout(6)
#define DB0 PDout(8)
#define DB1 PDout(9)
#define DB2 PDout(10)
#define DB3 PDout(11)
#define DB4 PDout(12)
#define DB5 PDout(13)
#define DB6 PDout(14)
#define DB7 PDout(15)
#define IDB7 PDin(15)
#define CSA PBout(15)
#define CSB PBout(14)
#define RST PBout(13)


#define uchar unsigned char 


void lcd_rcc(void);
//void db7_rcc(void);
void lcd_wait(void);
void lcd_wcom(u16 comm);
void lcd_wdata(u16 data);
void set_line(u16 n);
void lcd_page(u16 page);
void lcd_col(u16 colum); 
void lcd_screen(u8 n);
void lcd_clear(u16 screen); 
//void lcd_dis(u16 screen,u16 page,u16 col);
void lcd_init(void);
void Disp_H_Line(void); // 显示行
u16 lcd_rdata(void);
//u32 lcd_rdata(void);




#endif


这个应该没问题,下面是。c的程序:
void lcd_rcc(void)
{

RCC->APB2ENR|=1<<3; //开启PB时钟
RCC->APB2ENR|=1<<4;//开启PC时钟
RCC->APB2ENR|=1<<5; //开启PD时钟
GPIOB->CRH&=0x000FFFFF;//初始化CSA-PB.15,CSB-PB.14,RST-PB.13的时钟
GPIOB->CRH|=0x33300000;//通用推挽输出模式
GPIOB->ODR|=7<<13; //RST=1
//初始化RS-PC.8,RW-PC.7,EN-PC.6的端口
GPIOC->CRL&=0x00FFFFFF;
GPIOC->CRL|=0x33000000;
GPIOC->ODR|=7<<6;
GPIOC->CRH&=0xFFFFFFF0;
GPIOC->CRH|=0x00000003;
//初始化DB0-DB7端口(PD8-15)
GPIOD->CRH&=0x00000000;
GPIOD->CRH|=0x33333333;
GPIOD->ODR|=0xff00;
}
//等待lcd响应
void lcd_wait(void)
{
u8 flag=0;
GPIOD->CRH&=0x00000000;
GPIOD->CRH|=0x88888888;
GPIOD->ODR|=0xff00;
RS=0;
RW=1;
while(flag==0)
{
delay_us(5);
EN=1;
delay_us(5);
if(GPIOD->IDR&0X80)flag=0;
else flag=1;
delay_us(5);
EN=0;
delay_us(5);
}
GPIOD->CRH&=0x00000000;
GPIOD->CRH|=0x33333333;
GPIOD->ODR|=0xff00;
}
//写指令
void lcd_wcom(u16 comm)
{



lcd_wait();
RW=0;;RS=0;
comm=comm<<8;
GPIOD->ODR&=0x00ff;
GPIOD->ODR|=comm;
delay_us(5);
EN=1;
delay_us(5);
EN=0;


}
//写数据 
void lcd_wdata(u16 data)

lcd_wait();
RW=0;RS=1;
data=data<<8;
GPIOD->ODR&=0x00ff;
GPIOD->ODR|=data;
delay_us(5);
EN=1;delay_us(5);
EN=0; 

//设置行 
void set_line(u16 n)
{
n|=0xC0;
lcd_wcom(n);


}
//设置页
void lcd_page(u16 page)
{
page|=0xb8;
lcd_wcom(page);


}
//设置列
void lcd_col(u16 colum)
{
colum&=0x3f;
colum|=0x40;
lcd_wcom(colum);
}
//左右屏选择
void lcd_screen(u8 n)
{
switch(n)
{
case 0:CSA=0;CSB=0;break;//全屏
case 1:CSA=0;CSB=1;break;//左半屏
case 2:CSA=1;CSB=0;break;
default: break;
}
}
//清除显示
void lcd_clear(u16 screen)
{
u8 i,j;
lcd_screen(screen);
for(i=0;i<8;i++)
{
lcd_page(i);
__nop();__nop();
lcd_col(0);
for(j=0;j<64;j++)
{lcd_wdata(0x00);
__nop();__nop();__nop();
}
}
}
//液晶屏初始化
void lcd_init (void)
{
lcd_rcc();

RST=0;
delay_ms(5);
RST=1; delay_ms(5);


CSA=1;
CSB=1;
lcd_wcom(0x3e);
lcd_page(0);
set_line(0);
lcd_col(0);
lcd_wcom(0x3F); 
}
//显示一行
void Disp_H_Line(void)
{
unsigned char i,j;
CSA=1;
CSB=1;
lcd_wcom(0x3f);
lcd_wcom(0xb8);
lcd_wcom(0xc0);
lcd_wcom(0x40);


for(j=0;j<8;j++)
{
lcd_wcom(0xb8+j);
lcd_wcom(0x40+0);
// write_com(Start_Line+0);
for(i=0;i<64;i++)lcd_wdata(0x55);
}

主频是72M,我觉得问题可能还是在lcd_init和Disp_H_Line函数上,请大神帮忙看一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。