初级会员

- 积分
- 182
- 金钱
- 182
- 注册时间
- 2013-4-24
- 在线时间
- 0 小时
|
发表于 2013-5-21 18:26:10
|
显示全部楼层
/* Includes ---------------------------------------------------------------*/
#include"stm32f10x.h"
#include <stdio.h>
#include"LCD_12864.h"
/****************************************************************************
* 名 称:void LCD_12864_GPIO_Config(void)
* 功 能:12864液晶各端口初始化,配置各端口方式
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:LCD_12864_GPIO_Config();
****************************************************************************/
void LCD_12864_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 打开各端口时钟------------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_GPIO_A,ENABLE);
/* 配置端口A输出口-----------------------------------------------------*/
GPIO_InitStructure.GPIO_Pin=DATA_OUT|CON_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************************************************
* 名 称:void Delayms(uint32_t ms)
* 功 能:延时函数
* 入口参数:nCount
* 出口参数:无
* 说 明:
* 调用方法:Delayms(1);延时1毫秒
****************************************************************************/
void Delayms(uint32_t ms)
{
uint32_t i, j;
for( i = ms; i > 0; i-- )
{
for( j = 7200 ; j > 0 ; j-- )
{}
}
}
/****************************************************************************
* 名 称:char LCD_BUSY()
* 功 能:检查液晶是否忙
* 入口参数:无
* 出口参数:unsigned char 0x80 OR 0x00
* 说 明:
* 调用方法:LCD_BUSY();
****************************************************************************/
void LCD_BUSY(void)
{
u8 temp=0;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_ResetBits(GPIOA,GPIO_RS);
GPIO_SetBits(GPIOA,GPIO_RW);
// 第7位读状态
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Delayms(1);
do{
GPIO_SetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7);
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
}while(temp);//等待不忙
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
//--------把D7 设为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
Delayms(1);
//---------------------
}
/****************************************************************************
* 名 称:void Write_Order(unsigned char Order)
* 功 能:写液晶指令
* 入口参数:Order
* 出口参数:无
* 说 明:
* 调用方法:Write_Order(unsigned char Order);
****************************************************************************/
void Write_Order(vu8 portValue)
{
u16 tmpData;
LCD_BUSY();
GPIO_ResetBits(GPIOA,GPIO_RS);
GPIO_ResetBits(GPIOA,GPIO_RW);
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
tmpData = GPIO_ReadOutputData(GPIOA); // 读端口数据
tmpData &= 0xFF00; // 清掉低8位
GPIO_Write(GPIOA, (tmpData|((u16)portValue)));
Delayms(1);
GPIO_SetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
}
/****************************************************************************
* 名 称:void Write_Data(unsigned char Data)
* 功 能:写液晶数据
* 入口参数:Data
* 出口参数:无
* 说 明:
* 调用方法:Write_Data(unsigned char Data);
****************************************************************************/
void Write_Data(vu8 portValue)
{
u16 tmpData;
LCD_BUSY();
GPIO_ResetBits(GPIOA,GPIO_RW);
GPIO_SetBits(GPIOA,GPIO_RS);
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
tmpData = GPIO_ReadOutputData(GPIOA); // 读端口数据
tmpData &= 0xFF00; // 清掉低8位
GPIO_Write(GPIOA,(tmpData|((u16)portValue))); // 写数据到端口
Delayms(1);
GPIO_SetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
GPIO_ResetBits(GPIOA,GPIO_LCD_EN);
Delayms(1);
}
/****************************************************************************
* 名 称:void LCD_12864_Config(void)
* 功 能:12864显示初始化
* 入口参数:无
* 出口参数:无
* 说 明:
* 调用方法:LCD_12864_Config();
****************************************************************************/
void LCD_12864_Config(void)
{
/* 液晶使用并口方式----------------------------------------------------*/
GPIO_SetBits(GPIOA,GPIO_PSB);
/* 扩充指令操作--------------------------------------------------------*/
Write_Order(0x34);
Delayms(5);
/* 基本指令操作--------------------------------------------------------*/
Write_Order(0x30);
Delayms(5);
/* 显示开,关光标------------------------------------------------------*/
Write_Order(0x0c);
Delayms(5);
/* 清除LCD的显示内容---------------------------------------------------*/
Write_Order(0x01);
Delayms(5);
}
/****************************************************************************
* 名 称:void LCD_POS(char X,char Y)
* 功 能:设定显示位置
* 入口参数:char Y, char Y
* 出口参数:无
* 说 明:
* 调用方法:LCD_POS(char X,char Y);
****************************************************************************/
void LCD_POS(unsigned char X,unsigned char Y)
{
unsigned char   OS;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
  OS = X+Y ;
/* 显示地址------------------------ -------------------------------------*/
Write_Order(POS);
} |
|