我有个51的1602液晶显示屏,有正确的hex文件和工程文件,但是不知道硬件怎么连接的,所以我用工程文件做了判断,然后移植到stm32上出现乱码,求大神指点,小弟非常感谢
[mw_shl_code=c,true]1602.c文件
#include"1602.h"
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
// Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
#endif[/mw_shl_code]
[mw_shl_code=c,true]1602.h
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#define LCD1602_4PINS
/**********************************
包含头文件
**********************************/
#include<reg51.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat) ;
/*LCD1602初始化子程序*/
void LcdInit();
#endif[/mw_shl_code]
[mw_shl_code=c,true]main函数
/*******************************************************************************
*
* 普中科技
--------------------------------------------------------------------------------
* 实 验 名 : LCD1602显示试验
* 实验说明 : LCD1602显示Pechin Science
* 连接方式 : 见连接图
* 注 意 :
*******************************************************************************/
#include<reg51.h>
#include"1602.h"
//--定义全局变量--//
unsigned char PuZh[]="Pechin Science";
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
unsigned char i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(PuZh);
}
while(1)
{
}
}[/mw_shl_code]
我的stm32硬件是这样的PB8-PB15对应P0.0-p.7 PB0-PB7对应P2.7-P2.0,然后我根据成功的51文件推测是P0.4-P0.7四个IO作为输出的,然后P2.5-P2.7作为控制端,下面是stm32工程文件
[mw_shl_code=c,true]main函数
#include "sys.h"
#include "delay.h"
#include "lcd.h"
unsigned char PuZh[]="CHINA";
int main(void)
{
u8 cc;
delay_init(); //延时初始化
init1602();
for(cc=0;cc<6;cc++)
{
write_dat(PuZh[cc]);
}
while(1)
{
}[/mw_shl_code]
[mw_shl_code=c,true]lcd.c
#include "lcd.h"
#include "sys.h"
#include "delay.h"
#define rs PBout(1) //RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
#define wr PBout(2) //R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。->下一行
//当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
#define en PBout(0) //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
void init1602(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //SWJ 完全失能(JTAG+SW-DP)
//APB2外设时钟使能寄存器(RCC_APB2ENR)
//使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //PB端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
write_com(0x32); //将8位总线转为4位总线
write_com(0x28); //在四位线下的初始化
write_com(0x0c); //开显示不显示光标
write_com(0x06); //写一个指针加1
write_com(0x01); //清屏
write_com(0x80); //设置数据指针起点
}
/*******************写指令函数************************/
void write_com(unsigned char com)
{
rs=0;
wr=0;
en=0;
delay_ms(2);
GPIOB->ODR=((0XF0&com)<<8);
delay_ms(5);
en=1;
delay_ms(5);
en=0;
delay_ms(5);
GPIOB->ODR=((0X0F&com)<<12);
delay_ms(5);
en=1;
delay_ms(5);
en=0;
}
/*******************写数据函数************************/
void write_dat(unsigned char date)
{
rs=1;
wr=0;
en=0;
delay_ms(2);
GPIOB->ODR=((0X2FF&date)<<8);
delay_ms(5);
en=1;
delay_ms(5);
en=0;
GPIOB->ODR=(((0X20F&date)<<12)+2);
delay_ms(5);
en=1;
delay_ms(5);
en=0;
}
[/mw_shl_code]
[mw_shl_code=c,true]lcd.h
#ifndef __1602_H
#define __1602_H
#include "sys.h"
void init1602(void);
void write_com(unsigned char com);
void write_dat(unsigned char date);
//void write_2date(unsigned char a,unsigned char b);
#endif
[/mw_shl_code]
|