STM32(stm32f401xx)开发之LCD128*64(ampire128*64)

ampire128*64 (preteus)

概述

ampire128*64 就是一块lcd显示屏,可以看成是 128**64 个灯泡组成

“写数据”——函数控制灯泡的亮灭
“写命令”——函数执行 lcd 本身自带的命令

要让 LCD 显示东西

  • 把 LCD 初始化
  • 将要显示的 字模数据 写入 DDRAM ,就可以控制灯泡的亮灭
    • PCtoLCD2002(取字模软件),使用该软件取出要使用的字模数据
      • 使用说明:修改字模选项
        在这里插入图片描述在这里插入图片描述

ampire128*64的仿真实物图

在这里插入图片描述
芯片用的是stm32f401VE
芯片仿真没接电源,实物一定要接

关于ampire128*64的引脚接线

在这里插入图片描述

CS1:左半屏选择引脚,低电平有效。该引脚有效时左半屏幕操作有效

CS2:右半屏选择引脚,低电平有效。该引脚有效时右半屏幕操作有效

GND:电源地

VCC:电源正

V0:LCD的驱动电压,用来调节LCD背景深浅对比度(这个脚悬空不接就可以)

RS:命令/数据控制引脚。该脚为高电平是DB数据线上传输的是数据,该脚为低电平是DB数据线上传输的是命令

R/W:读/写控制引脚。该脚为高电平时从LCD模块中毒数据,该脚为低电平时写数据到LCD模块中。

E:LCD读写使能引脚

DB7 - DB0 :数据总线

RST:复位脚,低电平复位(直接接高电平)

-Vout:LCD的驱动电源(接-10v的电源)

不懂没关系,照图接引脚就行


仿真程序编写(keil)

查询 忙 状态 void check_busy()

void check_busy()
{
   
char a=0;
for(a=0;a<200;a++);    //此处为延时,一段时间后确保处于空闲状态
 //此处为状态查询,查询忙状态,没有使用成功,以后再调试
//RW=1;
GPIO_WriteBit(GPIOB,LCD_RW,1);
//RS=0;     
GPIO_WriteBit(GPIOB,LCD_RS,0);                            
//E=1;
GPIO_WriteBit(GPIOB,LCD_EA,1);

while(1)
{
   
     //E=0;
     GPIO_WriteBit(GPIOB,LCD_EA,0);
     //这里就是要检测 DB7 引脚的电平,低电平说明不忙,可以写入数据或命令
     if ( DB7引脚 == 0break;
  	  //设定循环次数,防止无限循环
  	  a++;
     if(a>10)
		  break;
 	   
}
//E=1;
GPIO_WriteBit(GPIOB,LCD_EA,1);
}       

这个函数用来检查lcd是否处于 忙 状态
如果 LCD 处于 忙 状态,那就等着
直到LCD不忙的时候再写命令或数据

正常来说每次写命令或写数据的时候要先调用此函数,查 忙 状态,proteuw仿真的时候有点小bug,会一直处于 忙状态 ,就不调用了

写命令 void LCD_write_command(char cmdata)

void LCD_write_command(char cmdata)
{
   
		//这里本来要调用查 忙 函数,仿真可以不调用
		//check_busy();
		
		//LCD_RS=0; 
		GPIO_WriteBit(GPIOB,LCD_RS,0);
		//LCD_RW=0;
		GPIO_WriteBit(GPIOB,LCD_RW,0);	 
 
		
		//LCD_EA=1;     //开使能
		GPIO_WriteBit(GPIOB,LCD_EA,1);	
	
		// D0-D7 =cmdata;
		GPIO_Write(GPIOA,cmdata);

		//LCD_EA=0;     //关使能
		GPIO_WriteBit(GPIOB,LCD_EA,0);

		delay_us(15);
}

写数据 void LCD_write_data(char wodata)

void LCD_write_data(char wodata)
{
   
    //这里本来要调用查 忙 函数,仿真可以不调用
	//check_busy();
	
	//LCD_RS=1;  
	GPIO_WriteBit(GPIOB,LCD_RS,1);

	//LCD_RW=0;  
	GPIO_WriteBit(GPIOB,LCD_RW,0);

	//LCD_EA=1;
	GPIO_WriteBit(GPIOB,LCD_EA,1);

	//D0-D7 = wodata;
	GPIO_Write(GPIOA,wodata);

	//LCD_EA=0;
	GPIO_WriteBit(GPIOB,LCD_EA,0);
	
	delay_us(15);

}

LCD初始化 void LCD_Init()

void LCD_Init()
{
   

	LCD_write_command(0x30); //
	delay_us(4);
	
	LCD_write_command(0x0c); //开显示,关光标,不闪烁
	delay_us(10);

	LCD_write_command(0x01); //清除显示
	delay_us(10);	
	
	LCD_write_command(0x06); //光标的移动方向向左,DDRM的地址计数器(AC)加1
	delay_us(10);	


}

这里初始化的命令照搬就行,每次初始化基本都是这样,想要其他初始化的可以去查 ampire128 的指令集

设置 LCD 显示的坐标 void set_xy(char x, char y)

void set_xy(char x, char y)
{
   
	if( y>=64 )
	{
   
		GPIO_WriteBit(GPIOB,CS1,1);
		GPIO_WriteBit(GPIOB,CS2,0);
		y = y-64;
	}
	else
	{
   
		GPIO_WriteBit(GPIOB,CS1,0);
		GPIO_WriteBit(GPIOB,CS2,1);	
	}
	
	LCD_write_command( 0x40 | y );
	delay_us(15);
	LCD_write_command( 0xb8 | x );
	
	
}

显示 16*16 像素点的汉字 void disp_hz(char R,char L,char *p)

void disp_hz(char R,char L,char *p)//汉字 16*16
{
   
	char i;
	for(i=0;i<16;i++)
	{
   
		set_xy(2*R,16*L+i);           //设定显示位置,每个汉字16*16个点,显示时每行8*16个点,所以需要两行8*32个点,此处为第一行
		LCD_write_data(p[i]);           //写入DDRAM
		set_xy(2*R+1,16*L+i);        //第二行
		LCD_write_data(p[i+
  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值