#include "LCD9648.h"
#include "font.h"
//仅需要修改引脚定义与引脚初始化函数GPIO_Configuration()
/*示例接脚
SCL B11
SDA B10
RS B1
CS0 B0
RST A7
*/
//THIS FILE ONLY NEEDS CHANGE THESE ACCORDING YOUR SETTINGS AND THE GPIO_Configuration()
//根据自己引脚修改,该文件仅需修改此处,分别为SCL\SDA\RS\CS0\RST的引脚
#define SCL_GPIO GPIOB
#define SCL_Pin GPIO_Pin_11
#define SDA_GPIO GPIOB
#define SDA_Pin GPIO_Pin_10
#define RS_GPIO GPIOB
#define RS_Pin GPIO_Pin_1
#define CS0_GPIO GPIOB
#define CS0_Pin GPIO_Pin_0
#define RST_GPIO GPIOA
#define RST_Pin GPIO_Pin_7
//引脚配置
#define SCL_Set() GPIO_SetBits(SCL_GPIO, SCL_Pin)
#define SCL_Reset() GPIO_ResetBits(SCL_GPIO, SCL_Pin)
#define SDA_Set() GPIO_SetBits(SDA_GPIO, SDA_Pin)
#define SDA_Reset() GPIO_ResetBits(SDA_GPIO, SDA_Pin)
#define RS_Set() GPIO_SetBits(RS_GPIO, RS_Pin)
#define RS_Reset() GPIO_ResetBits(RS_GPIO, RS_Pin)
#define CS0_Set() GPIO_SetBits(CS0_GPIO, CS0_Pin)
#define CS0_Reset() GPIO_ResetBits(CS0_GPIO, CS0_Pin)
#define RST_Set() GPIO_SetBits(RST_GPIO, RST_Pin)
#define RST_Reset() GPIO_ResetBits(RST_GPIO, RST_Pin)
//全局变量定义
u8 gdata_buf[96][6];
/*******************************************************************************
* 函 数 名 : GPIO_Configuration
* 函数功能 : 初始化引脚
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
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);
}
/*******************************************************************************
* 函 数 名 : lcd9648_spi_write_byte
* 函数功能 : LCD9648 SPI传输数据
* 输 入 : dat:数据
* 输 出 : 无
*******************************************************************************/
void lcd9648_spi_write_byte(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)//循环8次将一个字节传输
{
if((dat&0x80)!=0)
SDA_Set();
else
SDA_Reset();
dat<<= 1;//先写高位再写低位
SCL_Reset();
SCL_Set();//时钟上升沿写入数据
}
}
/*******************************************************************************
* 函 数 名 : lcd9648_write_cmd
* 函数功能 : LCD9648写命令
* 输 入 : cmd:命令
* 输 出 : 无
*******************************************************************************/
void lcd9648_write_cmd(u8 cmd)
{
CS0_Reset();//使能
RS_Reset();//选择命令
lcd9648_spi_write_byte(cmd);//发送命令
CS0_Set();//失能
}
/*******************************************************************************
* 函 数 名 : lcd9648_write_dat
* 函数功能 : LCD9648写数据
* 输 入 : dat:数据
* 输 出 : 无
*******************************************************************************/
void lcd9648_write_dat(u8 dat)
{
CS0_Reset();//使能
RS_Set();//选择数据
lcd9648_spi_write_byte(dat);//发送数据
CS0_Set();//失能
}
//毫秒级延时
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--) ;
}
}
/*******************************************************************************
* 函 数 名 : lcd9648_init
* 函数功能 : LCD9648初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void lcd9648_init(void)
{
GPIO_Configuration();
RST_Set();
delay_ms(10);
RST_Reset();
delay_ms(10);
RST_Set();
delay_ms(10);//复位
lcd9648_write_cmd(0xe2); //软件复位
lcd9648_write_cmd(0xc8); //0xC8普通方向选择选择反向,0xC0为正常方向
lcd9648_write_cmd(0xa0); //0xA0段方向选择正常方向(0xA1为反方向
lcd9648_write_cmd(0x2f);
lcd9648_write_cmd(0x26);
lcd9648_write_cmd(0x81); //背景光对比度
lcd9648_write_cmd(0x10);
lcd9648_write_cmd(0xaf); //开启显示
lcd9648_write_cmd(0x40); //设置滚动一行命令
}
/*******************************************************************************
* 函 数 名 : lcd9648_clear
* 函数功能 : LCD9648清屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void lcd9648_clear(void)
{
u8 i,j;
for(i=0;i<9;i++)//一共9页
{
// lcd9648_write_cmd(0x40);//设置滚动一行命令
lcd9648_write_cmd(0xb0+i);//页地址
lcd9648_write_cmd(0x10);//列高字节地址
lcd9648_write_cmd(0x00);//列低字节地址
for(j = 0; j < LCD_WIDTH; j++)//每一行的像素点
{
lcd9648_write_dat(0x00);//不显示
}
}
for(i=0;i<6;i++)
{
for(j=0;j<LCD_WIDTH;j++)
{
gdata_buf[j][i]=0;
}
}
lcd_reflash_gram();//更新显示
}
void lcd_reflash_gram(void)
{
u8 i,n;
for(i=0;i<6;i++)
{
lcd9648_write_cmd(0xb0+i); //设置页地址(0~5)
lcd9648_write_cmd(0x00); //设置显示位置—列低地址
lcd9648_write_cmd(0x10); //设置显示位置—列高地址
for(n=0;n<LCD_WIDTH;n++)lcd9648_write_dat(gdata_buf[n][i]);
}
}
//画点
//x,y:坐标
//sta:1:显示,0:不显示
void lcd_draw_dot(u8 x,u8 y,u8 sta)
{
u8 posy1,posy2;
if(x>=LCD_WIDTH||y>=LCD_HEIGHT)return;//超出范围了
posy1=y/8;//判断是第几页
posy2=y%8;//判断当页的字节数中第几位(字节低位在上,高位在下显示)
if(sta)
gdata_buf[x][posy1]|=1<<posy2;
else
gdata_buf[x][posy1]&=~(1<<posy2);
}
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void lcd_show_char(u8 x,u8 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
for(t=0;t<csize;t++)
{
if(size==12)temp=ascii_1206[num][t]; //调用1206字体
else if(size==16)temp=ascii_1608[num][t]; //调用1608字体
else if(size==24)temp=ascii_2412[num][t]; //调用2412字体
else return; //没有的字库
for(t1=0;t1<8;t1++)
{
if(temp&0x80)lcd_draw_dot(x,y,1);
else if(mode==0)lcd_draw_dot(x,y,0);
temp<<=1;
y++;
if(y>=LCD_HEIGHT)return; //超区域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=LCD_WIDTH)return; //超区域了
break;
}
}
}
}
//m^n函数
//返回值:m^n次方.
u32 lcd_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//显示数字,高位为0,还是显示
//x,y:起点坐标
//num:数值(0~999999999);
//len:长度(即要显示的位数)
//size:字体大小
//mode:
//[7]:0,不填充;1,填充0.
//[6:1]:保留
//[0]:0,非叠加显示;1,叠加显示.
void lcd_show_num(u8 x,u8 y,u32 num,u8 len,u8 size,u8 mode)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/lcd_pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
if(mode&0X80)lcd_show_char(x+(size/2)*t,y,'0',size,mode&0X01);
else lcd_show_char(x+(size/2)*t,y,' ',size,mode&0X01);
continue;
}else enshow=1;
}
lcd_show_char(x+(size/2)*t,y,temp+'0',size,mode&0X01);
}
}
//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
void lcd_show_string(u8 x,u8 y,u8 width,u8 height,u8 size,char *p)
{
u8 x0=x;
width+=x;
height+=y;
while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
{
if(x>=width){x=x0;y+=size;}
if(y>=height)break;//退出
没有合适的资源?快使用搜索试试~ 我知道了~
供stm32使用的 LCD9648 屏幕的驱动代码
共3个文件
h:2个
c:1个
需积分: 0 24 下载量 92 浏览量
2023-07-31
20:36:12
上传
评论 2
收藏 9KB RAR 举报
温馨提示
适用于stm32的LCD9648的驱动代码,本来LCD9648这个屏幕是用来学习51的,是普中51开发学习板中附带的屏幕,后来学习stm32时要用屏幕显示,结果手边就这一个屏幕可以用,当时在网上找找LCD9648这个屏幕的stm32代码,结果找遍了全网和外网都没有找到,可能是这个屏幕性能对于stm32来说比较低吧,不过只是用来显示一些信息倒是完全够了,所以最后自己根据51给的示例代码手搓了一个适用于stm32的驱动代码 ***代码做了很多详细的注释,使用起来也非常方便,只需改几个参数就可以直接,编写了示例程序,直接复制粘贴到main()函数里就可以知道能不能正常显示*** 祝各位使用学习愉快,如果有不会的也可以问我,亲测代码可以正常运行显示(只要你的屏幕不是坏的就可以用)
资源推荐
资源详情
资源评论
收起资源包目录
HardWare.rar (3个子文件)
LCD9648.c 9KB
font.h 36KB
LCD9648.h 998B
共 3 条
- 1
资源评论
思哉?思在~
- 粉丝: 201
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功