#include<stm32f10x_lib.h>
#include "delay.h"
#include "lcd_12864.h"
/*******************************************************************/
/* */
/* 端口初始化 */
/* 。 */
/* */
/*******************************************************************/
void LCD_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0X0000FFFF;
GPIOA->CRL|=0X03330000;//PE.5推挽输出
GPIOA->ODR|=7<<4; //PE.5输出高
}
/*******************************************************************/
/* */
/* 输出端口初始化 */
/* 。 */
/* */
/*******************************************************************/
void DATA_out(void)
{
GPIOB->CRH&=0X00000000;
GPIOB->CRH|=0X33333333;//PB0,1,2,3,4,5,6,7推挽输出
GPIOB->ODR|=0XFF00; //PB输出高
}
/*******************************************************************/
/* */
/* 输入端口初始化 */
/* 。 */
/* */
/*******************************************************************/
void DATA_in(void)
{
GPIOB->CRH&=0XFFFFFFFF;
GPIOB->CRH|=0X88888888;//PB0,1,2,3,4,5,6,7推挽输入
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
u8 lcd_busy(void)
{
u8 result;
DATA_in();
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
result = (u8)(GPIOB->IDR&0x0080);
LCD_EN = 0;
DATA_out();
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(u8 cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay_ms(2);
DATAOUT(cmd);
delay_ms(2);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(u8 dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
delay_ms(2);
DATAOUT(dat);
delay_ms(2);
LCD_EN = 1;
delay_ms(2);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init(void)
{
LCD_PSB =1;
lcd_wcmd(0x38); //扩充指令操作
delay_ms(2);
lcd_wcmd(0x30); //基本指令操作
delay_ms(2);
lcd_wcmd(0x0C); //显示开,关光标
delay_ms(2);
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(2);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_display(u8 X,u8 Y,u8*s)
{
u8 pos,i;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
for(i=0;i<16;i++)
{ //显示字符
lcd_wdat(s);
delay_ms(2);
}
}
|