之前移植了一个1602的程序,对照手册改了I/0配置和初始化程序,但是仍然无法显示,卡了3天了,请大神帮忙看下。
=======================================
LCD162A.H
======================================================
#ifndef __LCD162A_H
#define __LCD162A_H
#include "sys.h"
#include "stdlib.h"
/*=====================================================
连接线定义:
DB0-----Pb8 DB4-----Pb12 RS-------PB3
DB1-----Pb9 DB5-----Pb13 RW-------PB4
DB2-----Pb10 DB6-----Pb14 E--------PB5
DB3-----Pb11 DB7-----Pb15 VLCD(Vee)接1K2电阻到GND
VSS-----GND VCC-----+5v
======================================================*/
//-----------------LCD162A端口定义----------------
#define LCD162A_RS PBout(3)
#define LCD162A_RW PBout(4)
#define LCD162A_E   Bout(5)
//PB8~15,作为数据线
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0X00FF)|((u16)(x<<8)&0xFF00);
//lcd162a控制用函数
void lcd162a_Reset(void); //复位lcd162a
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);//在指定位置显示一个字符//x:0~15 //y:0~1
void lcd162a_cls(void); //清屏
void lcd162a_Display(u8 dd); //显示
void lcd162a_Init(void); //初始化lcd162a
void lcd162a_LocateXY(u8 posx,u8 posy); //显示光标位置
void lcd162a_WriteCommand(u8 CMD);
void lcd162a_WriteData(u8 dataW);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr); //显示字符串
#endif
=======================================
LCD162A.C
======================================================
#include "lcd162a.h"
#include "stdlib.h"
#include "delay.h"
#include "stdio.h"
//清屏
void lcd162a_cls(void)
{
lcd162a_WriteCommand(0x01); //
}
//显示
void lcd162a_Display(u8 dd)
{
u8 i=0;
for(i=0;i<16;i++)
{
lcd162a_DispOneChar(i,1,dd++);
dd &=0x7f;
if (dd<32) dd=32;
}
}
//显示光标位置
void lcd162a_LocateXY(u8 posx,u8 posy)
{
u8 temp;
temp=posx & 0xf;
posy &= 0x01;
if(posy) temp |=0x40;
//temp |=0x80;
lcd162a_WriteCommand(temp);
}
//在指定位置显示一个字符
//x:0~15
//y:0~1
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata)
{
lcd162a_LocateXY(x,y);
lcd162a_WriteData(Wdata);
}
//显示字符串
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr)
{
u8 i,l=0;
while (ptr[l] >31)
{
l++;
};
for (i=0;i<l;i++)
{
lcd162a_DispOneChar(x++,y,ptr );
if ( x == 16 )
{
x = 0;
y ^= 1;//异或,换行
}
}
}
/////复位
void lcd162a_Reset(void)
{
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
delay_ms(15);
lcd162a_WriteCommand(0x38); //
lcd162a_WriteCommand(0x08); //
lcd162a_cls(); //clear device
lcd162a_WriteCommand(0x06); //
lcd162a_WriteCommand(0x0c); //
}
//写入控制字。
//RS=0,
//RW=0
//E=1
//
void lcd162a_WriteCommand(u8 CMD)
{
delay_ms(2); //等待控制器完成指令
LCD162A_RS=0;
LCD162A_RW=0;
LCD162A_E=1;
DATAOUT(CMD); //送控制字
delay_us(2);
LCD162A_E=0;
}
//写入一个字节。
//dataW:要写入的数据/命令
//RS=1
//RW=0
//E=1
//
void lcd162a_WriteData(u8 dataW)
{
delay_ms(2); //等待控制器完成指令
LCD162A_RS=1;
LCD162A_RW=0;
LCD162A_E=1;
DATAOUT(dataW);
delay_us(2);
LCD162A_E=0;
}
//初始化lcd162a
void lcd162a_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
//RCC->APB2ENR|=1<<0; //开启辅助时钟
//JTAG_Set(SWD_ENABLE);
GPIOB->CRH=0X33333333; //pb8-pb15
GPIOB->CRL&=0X0F000FFF;//屏蔽pb3,4,5,7设定值
GPIOB->CRL|=0X30333000;//更改pb3,4,5,7设定值
GPIOB->ODR|=0XFFB8;//pb3,4,5,7,pb8-pb15全部输出高电平
lcd162a_Reset();
lcd162a_cls();
}
////////////////////////////////////////////////////////////////
=================================================================
TEXT.C
===================================================================
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd162a.h"
#include "stdio.h"
////待显示的字符串//
u8 *p1="Hello,world.";
int main(void)
{
int temp=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
lcd162a_Init(); //初始化与lcd162a连接的硬件接口
//lcd162a_cls();
lcd162a_ePutstr(0,0,p1);
delay_ms(1000);
lcd162a_cls();
while(1)
{
p1[temp] &= 0x7f; // 只显示ASCII字符
if (p1[temp]<32)p1[temp]=32; // 屏蔽控制字符,不予显示
lcd162a_Display(p1[temp] );
delay_ms(400);
}
}
检查了几遍硬件应该没有问题。。不知道哪里错了。。。
原程序最后写的是这样的,我不太理解,所以改了下,2种都试过,但是LCD就只是背板亮。。P.S.:如果我改错了,是否可以解释下下面那段儿程序,菜鸟尚未入门,请大神们指点。
while(1)
{
temp &= 0x7f; // 只显示ASCII字符
if (temp<32)temp=32; // 屏蔽控制字符,不予显示
lcd162a_Display(temp );//“扫描屏幕”
delay_ms(400);
}
|