标题:
STM32单片机+LCD12864显示一个点的程序
[打印本页]
作者:
zirencharles
时间:
2022-4-22 16:24
标题:
STM32单片机+LCD12864显示一个点的程序
12864显示一个点
单片机源程序如下:
#include "delay.h"
#include "12864.h"
unsigned char x,y;
int main(void)
{
SystemInit(); //系统初始化
delay_init(72); //延时初始化
LCD12864_InitPort(); //端口初始化
LCD12864_Init(); //液晶初始化
for(x=0;x<4;x++)
{
for(y=0;y<16;y++)
{
LCD12864_Pos(x,y);
LCD12864_Wdat(0x2E);
delay_ms(1000);
LCD12864_Clr(); // 清屏
}
}
while(1);
}
#include "stm32f10x.h"
#include"12864.h"
#include"delay.h"
/************************************************************************************************
@f_name: void GPIO_Init(void)
@brief: 初始化硬件端口配置
@param: None
@return: None
************************************************************************************************/
void LCD12864_InitPort(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD; // 指令口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure); //初始化IO口配置
GPIO_Write(GPIOG,0xff00); //该行指令似乎可以去掉
}
/************************************************************************************************
@f_name: LCD12864_busy()
@brief: 检测忙状态
@Function: 读取引脚15的输入数据.
@annotation: 结合前文 RS=0、RW=1, 以及12864中文字库说明书之基本指令表: 读取忙碌标志和地址,
可知:该行指令的实际作用是: 判断12864是否处于(读取数据)忙状态.
@note: 因为判断的是数据位(DB0-DB7)忙状态, 所以忙状态位必须与DB7位一致.
@param: None
@return: None
************************************************************************************************/
u8 LCD12864_busy(void)
{
u8 x;
LCD_RS(0);
LCD_RW(1);
LCD_EN(1);
NOP();
NOP();
x = Text_Busy; // 读取引脚15的输入数据.
LCD_EN(0);
return x;
}
/************************************************************************************************
@f_name: void LCD12864_Wcmd(u8 dat)
@brief: 写指令
@param: u8 dat 输入指令
@return: None
************************************************************************************************/
void LCD12864_Wcmd(u8 dat) // 写指令
{
while(LCD12864_busy()); //忙检测
LCD_RS(0);
LCD_RW(0);
LCD_EN(0);
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
LCD_EN(1);
NOP();
NOP();
LCD_EN(0);
}
/************************************************************************************************
@f_name: void LCD12864_Wdat(u8 dat)
@brief: 写数据
@param: u8 dat 输入数据
@return: None
************************************************************************************************/
void LCD12864_Wdat(u8 dat) //写数据
{
while(LCD12864_busy()); //忙检测
LCD_RS(1);
LCD_RW(0);
LCD_EN(0);
NOP();
NOP();
LCD_WriteData(dat);
NOP();
NOP();
LCD_EN(1);
NOP();
NOP();
LCD_EN(0);
}
/************************************************************************************************
@f_name: void LCD12864_Init(void)
@brief: 液晶初始化
@param: None
@return: None
************************************************************************************************/
void LCD12864_Init(void)
{
LCD_PSB(1); //并口方式
LCD_RST(0); //液晶复位
delay_ms(3);
LCD_RST(1); //置高电平等待复位
delay_ms(3);
// LCD12864_Wcmd(0x34); //扩充指令操作
delay_ms(5);
LCD12864_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12864_Wcmd(0x0C); //显示开,关光标
delay_ms(5);
LCD12864_Wcmd(0x01); //清屏
delay_ms(5);
}
/************************************************************************************************
@f_name: void LCD12864_Clr(void)
@brief: 清屏
@param: None
@return: None
************************************************************************************************/
void LCD12864_Clr(void)
{
LCD12864_Wcmd(0x34); //扩充指令操作 “绘图”
delay_ms(5);
LCD12864_Wcmd(0x30); //基本指令操作
delay_ms(5);
LCD12864_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 ;
LCD12864_Wcmd(pos); //显示地址
}
/************************************************************************************************
@f_name: void LCD12864_PhotoDis(u8 *bmp)
@brief: 显示图形
@param: u8 *bmp 图形数组
@return: None
************************************************************************************************/
void LCD12864_PhotoDis(u8 *bmp)
{
u8 i,j;
LCD12864_Wcmd(0x34); //关闭图形显示
for(i=0;i<32;i++)
{
LCD12864_Wcmd(0x80+i); //先写入水平坐标值
LCD12864_Wcmd(0x80); //写入垂直坐标值
for(j=0;j<16;j++) //再写入两个8位元的数据
LCD12864_Wdat(*bmp++);
delay_ms(1);
}
for(i=0;i<32;i++)
{
LCD12864_Wcmd(0x80+i);
LCD12864_Wcmd(0x88);
for(j=0;j<16;j++)
LCD12864_Wdat(*bmp++);
delay_ms(1);
}
LCD12864_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')
{
LCD12864_Wdat(temp);
temp=*(++p);
}
}
/************************************************************************************************
@f_name: void NOP(void)
@brief: 延时函数
@param: None
@return: None
************************************************************************************************/
void NOP(void)
{ u8 i; for(i=0; i<100; i++); }
复制代码
Keil代码下载:
12864_poi_display.7z
(190.16 KB, 下载次数: 39)
2022-4-22 23:17 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
liuyiyi
时间:
2022-5-6 16:36
stm32的仿真图可以做一个比较好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1