#include "stm32f10x_conf.h"
#include "Delay.h"
#include "LCD_12864.h"
/*******************************************************************************
*函 数 名:LCD12864_IO_Init
*描 述:IO口初始化
*输 入:无
*输 出:无
*
*******************************************************************************/
void LCD12864_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure_C,GPIO_InitStructure_B,GPIO_InitStructure_D;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟
GPIO_InitStructure_C.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_11|GPIO_Pin_12; //LED0-->PC.6端口配置
GPIO_InitStructure_C.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure_C.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure_C); //根据设定参数初始化GPIOC.6
GPIO_ResetBits(GPIOC,GPIO_Pin_6); //PC.6 LCD0 输出低
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟,
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
GPIO_InitStructure_B.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //LED0-->PC.6端口配置
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure_B.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure_B); //根据设定参数初始化GPIOC.6
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能PD端口时钟
GPIO_InitStructure_D.GPIO_Pin = GPIO_Pin_2; //LED0-->PD.2端口配置
GPIO_InitStructure_D.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure_D.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure_D); //根据设定参数初始化GPIOD.2
}
//===========测忙================
void LCD_CHECKBUSY()
{
LCD_CS(1);
u8 signal,busy_flag;
GPIO_InitTypeDef GPIO_InitStructure_B;
GPIO_InitStructure_B.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED0-->PC.6端口配置
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure_B.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure_B); //根据设定参数初始化GPIOC.6
u16 BUSIN ;
LCD_RS(0);
LCD_WR(1);
LCD_CS(0);
do
{
LCD_RD(0);
delay_us(10);
BUSIN = GPIO_ReadInputData(GPIOB);
BUSIN = (u8)(BUSIN & 0x00ff);
signal=BUSIN;
delay_us(10);
LCD_RD(1);
busy_flag = signal&Busy;
}while(busy_flag);
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure_B);
LCD_CS(1);
}
void w_com80(unsigned char x)
{
LCD_CS(1);
LCD_CHECKBUSY();
LCD_RS(0);//命令
LCD_CS(0);
LCD_RD(1);//读无效
LCD_WR(0);//写有效
delay_us(10);
LCD12864_Data(x);//送出数据
delay_us(10);
// LCD_RD(0);
LCD_WR(1);
LCD_CS(1);
LCD_RD(1);
}
void wdata80(unsigned char dat)
{
LCD_CS(1);
LCD_CHECKBUSY();
LCD_RS(1);//数据
LCD_CS(0);
// LCD_WR(0);//写
LCD_RD(1);
LCD_WR(0);
delay_us(1);
LCD12864_Data(dat);
delay_us(1);
// LCD_RD(0);
LCD_WR(1);
LCD_CS(1);
LCD_RD(1);
}
//===========读数据==============
u8 LCD_READ_DATA()
{
u8 data;
GPIO_InitTypeDef GPIO_InitStructure_B;
GPIO_InitStructure_B.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED0-->PC.6端口配置
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure_B.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure_B); //根据设定参数初始化GPIOC.6
u16 BUSIN = GPIO_ReadInputData(GPIOB);
BUSIN = (u8)(BUSIN & 0x00ff);
LCD_CHECKBUSY();
LCD_RS(1);
LCD_WR(1);
LCD_RD(0);
delay_us(10);
data=BUSIN;
delay_us(10);
LCD_RD(1);
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure_B);
return data;
}
//===========LCD_ST7565初始化=============
void LCD_ST7565_INIT()
{
GPIO_InitTypeDef GPIO_InitStructure_B;
GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure_B);
LCD_RST(0);
delay_us(10);
LCD_RST(1);
delay_us(2);
w_com80(0xe2); //软件复位
delay_us(2);
w_com80(Display_ON);
delay_us(2);
w_com80(Display_Sta_line);
delay_us(2);
w_com80(ADC_set_1);
delay_us(2);
w_com80(Display_Nor);
delay_us(2);
w_com80(Display_all_OFF);
delay_us(2);
w_com80(0xa3); //偏压比设定
delay_us(2);
w_com80(Com_sel_rev);
delay_us(2);
w_com80(Power_Set);
delay_us(2);
w_com80(0x24); //对比度设置
delay_us(2);
w_com80(Vo_XI_Command);
delay_us(2);
w_com80(0x20);
delay_us(2);
}
/*************************************************/
//写数据
/*************************************************/
void wdata(unsigned char dat)
{
wdata80(dat);
}
////////////////////显示图片///////////////////////////
void display_map(unsigned char *p)//P 是图片数据的首地址
{
unsigned char seg;
unsigned char page;
for(page=0xb0;page<0xb9;page++) //写页地址共8 页 0xb0----0xb8
{
w_com80(page);
w_com80(0x10); //列地址,高低字节两次写入,从第0 列开始
w_com80(0x00);
for(seg=0;seg<128;seg++)//写128 列
{ wdata(*p++); }
}
}
/*******************************************************************************
*函 数 名:LCD12864_Data
*描 述:8位并口数据操作
*输 入:data
*输 出:无
*
*******************************************************************************/
void LCD12864_Data(u8 data)
{
if((0x80&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_0);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
if((0x40&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}
if((0x20&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}
if((0x10&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_3);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
}
if((0x08&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
}
if((0x04&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
if((0x02&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_6);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
}
if((0x01&data))
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
}
}
//============写一个字符8*6================
//入口:页地址,字符列号,字符数组指针
//返回:无
void printGB(u8 x,u8 y,u8 *disp,u8 size)
//坐标(x,y),x为垂直列像素;y为水平页像素(8点像素/行),size为字模大小
{
u8 j,n;
for(n=0;n<2;n++) //
{
w_com80(y|0xb0); //设置页地址
w_com80((x>>4)|0x10); //设置列地址高4位
w_com80(x&0x0f); //设置列地址低4位
for(j= size;j>0;j--) //写16字节字模数据
{
wdata80(disp[j-1+size *n]);//写字模数据
}
y=y+1; //页地址加1
}
y=y-2; //页地址修正原值
x=x+12; //列地址修正下一个汉字位置
}
//============写一个数字8*6================
void DisplayNum(u8 x,u8 y,u8 *disp)
{
u8 j;
w_com80(y|0xb0); //设置页地址
w_com80((x>>4)|0x10); //设置列地址高4位
w_com80(x&0x0f); //设置列地址低4位
for(j= 6;j>0;j--) //写6字节字模数据
{
wdata80(disp[j-1+6]);//写字模数据
}
}
/**********************清屏*******************************/
void ClearRAM()
{
u8 i,j;
for(i=0;i<8;i++)
{
w_com80(i|0xb0);
w_com80(0x10);
w_c
- 1
- 2
- 3
前往页