我用你的程序想改成寄存器版本的,可是编译通过但是就是不显示
下面这个事12864.c文件内容
[mw_shl_code=c,true]#include "stm32f10x.h"
#include"12864.h"
#include"delay.h"
/************************************************************************************************
//FILE:液晶12864驱动程序
//VERS:1.0
//AUTHOR:福建师范大学林木泉
//DATE:2012/07/11
************************************************************************************************/
/************************************************************************************************
@f_name: void LCD12864_InitPort(void)
@brief: 初始化硬件端口配置
@param: None
@return: None
************************************************************************************************/
void LCD12864_InitPort(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRH&=0;
GPIOB->CRH|=0X77777777;
GPIOB->ODR=0XFFFF;
GPIOB->CRL&=0XFF000F00;
GPIOB->CRL|=0X00333033;
GPIOB->ODR=0Xffff;
}
/************************************************************************************************
@f_name: void NOP(void)
@brief: 延时函数
@param: None
@return: None
************************************************************************************************/
void NOP(void)
{ u8 i; for(i=0; i<100; i++); }
/************************************************************************************************
@f_name: u8 LCD12864_busy(void)
@brief: 检测忙状态
@param: None
@return: None
************************************************************************************************/
u8 LCD12864_busy(void)
{
u8 x;
RS=0;
RW=1;
EN=1;
NOP();
NOP();
x=Text_Busy;
EN=0;
return x;
}
/************************************************************************************************
@f_name: void LCD12684_Wcmd(u8 dat)
@brief: 写指令
@param: u8 dat 输入指令
@return: None
************************************************************************************************/
void LCD12684_Wcmd(u8 dat)
{
while(LCD12864_busy()); //忙检测
RS=0;
RW=0;
EN=0;
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
EN=1;
NOP();
NOP();
EN=0;
}
/************************************************************************************************
@f_name: void LCD12684_Wcmd(u8 dat)
@brief: 写数据
@param: u8 dat 输入数据
@return: None
************************************************************************************************/
void LCD12684_Wdat(u8 dat)
{
while(LCD12864_busy()); //忙检测
RS=1;
RW=0;
EN=0;
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
EN=1;
NOP();
NOP();
EN=0;
}
/************************************************************************************************
@f_name: void LCD12864_Init(void)
@brief: 液晶初始化
@param: None
@return: None
************************************************************************************************/
void LCD12864_Init(void)
{
PSB=1; //并口方式
RST=0; //液晶复位 低电平有效
delay_ms(3);
RST=1; //置高电平等待复位
delay_ms(3);
LCD12684_Wcmd(0x34); //扩充指令操作
delay_ms(5);
LCD12684_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12684_Wcmd(0x0c); //显示开,关光标
delay_ms(5);
LCD12684_Wcmd(0x01); //清除LCD的显示内容
delay_ms(5);
}
/************************************************************************************************
@f_name: void LCD12864_Clr(void)
@brief: 清屏
@param: None
@return: None
************************************************************************************************/
void LCD12864_Clr(void)
{
LCD12684_Wcmd(0x34); //扩充指令操作 “绘图”
delay_ms(5);
LCD12684_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12684_Wcmd(0x01); //清屏
delay_ms(5);
}
/************************************************************************************************
@f_name: void LCD12864_Pos(u8 x,u8 y)
@brief: 设置显示位置
@param: u8 x:X轴 u8 y:Y轴
@return: None
************************************************************************************************/
void LCD12864_Pos(u8 x,u8 y)
{
u8 pos;
if (x==1) {x=0x80;}
else if (x==2) {x=0x90;}
else if (x==3) {x=0x88;}
else if (x==4) {x=0x98;}
else x=0x80;
pos = x+y ;
LCD12684_Wcmd(pos); //显示地址
}
/************************************************************************************************
@f_name: void LCD12864_PhotoDis(u8 *bmp)
@brief: 显示图形
@param: u8 *bmp 图形数组
@return: None
************************************************************************************************/
void LCD12864_PhotoDis(u8 *bmp)
{
u8 i,j;
LCD12684_Wcmd(0x34); //关闭图形显示
for(i=0;i<32;i++)
{
LCD12684_Wcmd(0x80+i); //先写入水平坐标值
LCD12684_Wcmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
LCD12684_Wdat(*bmp++);
delay_ms(1);
}
for(i=0;i<32;i++)
{
LCD12684_Wcmd(0x80+i);
LCD12684_Wcmd(0x88);
for(j=0;j<16;j++)
LCD12684_Wdat(*bmp++);
delay_ms(1);
}
LCD12684_Wcmd(0x36); //写完数据,开图形显示
}
/************************************************************************************************
@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)
@brief: 显示字符串
@param: u8 *bmp 图形数组
@return: None
************************************************************************************************/
void LCD_ShowString(u8 x,u8 y,const u8 *p)
{
u8 temp;
if(x>4) {x=1;}
if(y>4) {y=0;}
LCD12864_Pos(x,y);
temp=*p;
while(temp!='\0')
{
LCD12684_Wdat(temp);
temp=*(++p);
}
}
[/mw_shl_code]
这个是12864.h文件内容
[mw_shl_code=c,true]#ifndef __12864_H_
#define __12864_H_
#include"sys.h"
//管脚定义,移植修改区
//**************************************************************************************************************************
#define LCD12864_GPIO GPIOB
#define GPIOCLK RCC_APB2Periph_GPIOB
#define RS PBout(0)
#define RW PBout(1)
#define EN PBout(3)
#define PSB PBout(4)
#define RST PBout(5)
#define Busy PBout(15)
#define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
#define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5
#define LCD_RS(x) x ? GPIOB->ODR|=0X0001: GPIOB->ODR&=~0X0001 //置1或置0 但是我发现我这样用用不了。。。。
#define LCD_RW(x) x ? GPIOB->ODR|=0X0002: GPIOB->ODR&=~0X0002
#define LCD_EN(x) x ? GPIOB->ODR|=0X0004: GPIOB->ODR&=~0X0004
#define LCD_PSB(x) x ? GPIOB->ODR|=0X0008: GPIOB->ODR&=~0X0008
#define LCD_RST(x) x ? GPIOB->ODR|=0X0010: GPIOB->ODR&=~0X0010
#define Text_Busy PBin(15) //PBin(7)
#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x<<8 & 0xff00;LCD12864_GPIO->BRR = ((~x)<<8) & 0xff00;} //高8位的数据
//#define LCD_WriteData(x) GPIOB->ODR=(GPIOB->ODR&0x00ff)|(x&0xff00); //高8位的数据
//#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据
void LCD12864_InitPort(void); //硬件端口初始化
void NOP(void); //延时函数
u8 LCD12864_busy(void); //检测忙状态
void LCD12684_Wcmd(u8 dat); //写指令
void LCD12684_Wdat(u8 dat); //写数据
void LCD12864_Init(void); //液晶初始化
void LCD12864_Clr(void); // 清屏
void LCD12864_Pos(u8 x,u8 y); //设置显示位置
void LCD12864_PhotoDis(u8 *bmp); // 显示图片
void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串
//**********************************************************************************************************************
#endif
[/mw_shl_code]
|