stm32_12864带字库液晶_反白_闪烁_字位控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**********12864.h************************/

#ifndef __12864_H
#define __12864_H

#include "stm32f10x.h"
#include "SysTick.h"
#include
//#include


/* \u63A7\u5236\u7BA1\u811A\u7535\u5E73 */
#define SCL_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_6)
#define SCL_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_6)
#define SDA_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define SDA_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_7)


void Delay_Lcd(vu32 nCount);
void LCD_Config(void);
void LCD_Init(void);
void Write_Char(u8 start, u8 ddata);
void Send_Byte(u8 bbyte);
void Clr_Scr(void);
//void White_Line(u8 line);
void WhiteLineInit(void);
void White_Line(u8 X,u8 Y,u8 width);
void Shut_White_Line(u8 X,u8 Y,u8 width);
void LCD_Set_XY(u8 X, u8 Y);
void LCD_Write_Char(u8 X,u8 Y,uint8_t c);
void LCD_Write_String(u8 X,u8 Y,uint8_t* s);
void LCD_Write_value(u8 X,u8 Y,u16 value,u8 zhenfu);
void LCD_Write_Single_Num(u8 X,u8 Y,u16 value);
void LCD_Write_Tri_Value(u8 X,u8 Y,u16 value);
void Display_Img(u8 const *img);

#endif /* __12864_H */

/**********12864.h************************/

/***************12864.c************************/

/******************** ********************
* 文件名 :12864.c
* 描述 :12864液晶底层应用函数库
* 实验平台:
* 硬件连接 ----------------------------
*
* PB6--SCL
* PB7--SDA
* ----------------------------
* 库版本 :ST3.0.0
*

**********************************************************************************/
#include "12864.h"

u8 const num_lcd[]={"0123456789 :.-"};//用于输出数字符号


//用于绘图
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1

void Delay_Lcd(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

/*******************************************************************************
初始化12864的接口
*******************************************************************************/
void LCD_Config(void)
{
GPIO_InitTypeDef GPIOB_InitStructure;

/* 配置外设时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


/*!< Configure SCL & SDA */
GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ
GPIO_Init(GPIOB, &GPIOB_InitStructure);

}

/******************************
初始化液晶,复位,清零,清屏
******************************/
void LCD_Init(void)
{
//Delay_ms(50);//启动等待,等LCM讲入工作状态

Write_Char(0,0x30); //8 位介面,基本指令集
Delay_us(200);
Write_Char(0,0x0c); //显示打开,光标关,反白关
Delay_us(200);
Write_Char(0,0x01); //清屏,将DDRAM的地址计数器归零
Delay_ms(300);

}

/*****************

*************************************************************************
* 函数名称 :Write_char
* 功能描述 :写指令或数据
* 参数 : start 控制RS/RW;ddata数据 0为写指令,1为写数据
* 12864的串行通讯模式下,每一次操作都要RS/RW的状态,即第一个8位为11111RWRS0
* 第二个8位是数据的高4位,为DDDD0000
* 第三个8位是数据的低4位,为DDDD0000
*
******************************************************************************************/
void Write_Char(u8 start, u8 ddata)
{
u8 start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据

Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
Send_Byte(start_data); //发送起始信号
Delay_us(50); //延时是必须的
Send_Byte(Hdata); //发送高四位
Delay_us(50); //延时是必须的
Send_Byte(Ldata); //发送低四位
Delay_us(50); //延时是必须的
}

/******************************************************************************************
* 函数名称 :Send_byte
* 功能描述 :发送一个字节
* 参数 : 参数名称: bbyte
*
******************************************************************************************/
void Send_Byte(u8 bbyte)
{
u8 i,t;
for(i=0;i<8;i++)
{
if((bbyte)&0x80)
SDA_HIGH; //取出最高位
else
SDA_LOW;
SCL_HIGH;
t = 0x10;
while(t--); //延时 lcd读取数据
SCL_LOW;
bbyte <<= 1; //左移1位
}
}

/******************************************************************************************
* 函数名称 :Clr_Scr
* 功能描述 :清屏函数
* 参数 :
*
*
******************************************************************************************/
void Clr_Scr(void)
{
Write_Char(0,0x01);
Delay_us(50);
}

/******************************************************************************************
* 函数名称 :White_Line
* 功能描述 :行反白函数
* 参数 :u8 行号 0-3
* 从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。但是ST7920 控制器的128×64 点阵
* 液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接
* 第二行。所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,
* 第三行必然也反白显示;第二行反白,第四行也必然反白。
*
* 其实我们还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。其理论支持在于:在ST7920
* 中,字符显示的CGRAM和图形的GGRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。
*
* 具体来说:假如某个

点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的
* 结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。假
* 如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显
* 示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。
*
* 所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地
* 方的绘图!这样一来可以实现任何地方、任意大小的反白显示
DDRAM 8*16 字节的空间
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
*
******************************************************************************************/
//void White_Line(u8 line)
//{
//// u8 init=0x04;
//// Write_Char(0,0x34);//打开扩展指令,关闭图形
//// line=init|line;
//// Write_Char(0,line);//反白
//// Write_Char(0,0x36);//打开扩展指令,打开图形
// display();
//}

void WhiteLineInit(void)
{
u8 i,j;
Write_Char(0,0x34);//打开扩展指令,关闭图形显示
Delay_us(50);
for(i=0;i<32;i++)
{
Write_Char(0,0x80+i);//先写水平坐标值
Write_Char(0,0x80);//先写垂直坐标值
for(j=0;j<16;j++)
Write_Char(1,0x00);//先写水平坐标值
Delay_us(50);
}

for(i=0;i<32;i++)
{
Write_Char(0,0x80+i);//先写水平坐标值
Write_Char(0,0x88);//先写垂直坐标值
for(j=0;j<16;j++)
Write_Char(1,0x00);//先写水平坐标值
Delay_us(50);
}

Write_Char(0,0x36);//打开扩展指令,打开图形显示
Delay_us(50);
}

/******************************************************************************************
* 函数名称 : White_Line
* 功能描述 :反白,X值为0-3,Y值为0-7,width为行反白格数
* 参数 :
*
******************************************************************************************/
void White_Line(u8 X,u8 Y,u8 width)
{


u8 i,j,flag=0x00;

//WhiteLineInit();

if(X>1)
{
flag=0x08;
X=X-2;
}

Write_Char(0,0x34);//打开扩展指令,关闭图形显示
for(i=0;i<16;i++)
{
Write_Char(0,0x80+(X<<4)+i);
Write_Char(0,0x80+flag+Y);
for(j=0;j{
Write_Char(1,0xff);
Delay_us(30);
Write_Char(1,0xff);
Delay_us(30);
}
//Delay_us(30);
}
Write_Char(0,0x36);//打开扩展指令,打开图形显示
Delay_us(30);
}

/******************************************************************************************
* 函数名称 : Shut_White_Line
* 功能描述 :结束反白,X值为0-3,Y值为0-7,width为行反白格数
* 参数 :
*
***

***************************************************************************************/
void Shut_White_Line(u8 X,u8 Y,u8 width)
{


u8 i,j,flag=0x00;

//WhiteLineInit();

if(X>1)
{
flag=0x08;
X=X-2;
}

Write_Char(0,0x34);//打开扩展指令,关闭图形显示
for(i=0;i<16;i++)
{
Write_Char(0,0x80+(X<<4)+i);
Write_Char(0,0x80+flag+Y);
for(j=0;j{
Write_Char(1,0x00);
Delay_us(30);
Write_Char(1,0x00);
Delay_us(30);
}
//Delay_us(30);
}
Write_Char(0,0x36);//打开扩展指令,打开图形显示
Delay_us(30);
}

/******************************************************************************************
* 函数名称 : LCD_set_xy
* 功能描述 :设置LCD显示的起始位置,X为行,Y为列
* 参数 : 参数名称: X:0-3;Y:0-7;
*
DDRAM 8*16 字节的空间
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
******************************************************************************************/
void LCD_Set_XY(u8 X, u8 Y)
{
u8 address;
switch(X)
{
case 0:
address = 0x80 + Y;
break;
case 1:
address = 0x90 + Y;
break;
case 2:
address = 0x88 + Y;
break;
case 3:
address = 0x98 + Y;
break;
// case 4:
// address = 0x98 + Y;
// break;
default:
address = 0x80 + Y;
break;
}
Write_Char(0, address);
Delay_us(50);
}

/******************************************************************************************
* 函数名称 :LCD_Write_Char
* 功能描述 :中英文字符显示函数
* 参数 : 参数名称: X:0-3;Y:0-8;
*
*
******************************************************************************************/
void LCD_Write_Char(u8 X,u8 Y,uint8_t c)
{
LCD_Set_XY( X, Y );
Write_Char( 1, c );
Delay_us(50);
}

/******************************************************************************************
* 函数名称 :LCD_Write_string
* 功能描述 :中英文字符串显示函数
* 参数 : 参数名称: X:0-3;Y:0-8;
*
* 返回值 :
* 作者 :
* 创建日期 :2006-12-19
* 全局变量 :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本 : 修改人: 修改日期:
* 修改说明 :
******************************************************************************************/
void LCD_Write_String(u8 X,u8 Y,uint8_t* s)
{
LCD_Set_XY( X, Y );

while (*s)
{
Write_Char( 1, *s );
s ++;
Delay_us(50);
}
}


/******************************************************************************************
* 函数名称 :LCD_Write_value

* 功能描述 :数字串显示函数
* 参数 : 参数名称: value:16位无符号数字, zhenfu:正负,1为正,0为负
*
*
******************************************************************************************/
void LCD_Write_value(u8 X,u8 Y,u16 value,u8 zhenfu)// 数字显示函数
{
//uc8* s=(uc8*)malloc(sizeof(uc8)*5);
uint8_t s[5]="+1234";
uint8_t* ps=s;

char qianwei,baiwei,shiwei,gewei;
if (zhenfu)
*ps='+';
else
*ps='-';

//最多只显示4位数

if(value>9999)
{value=9999;}

qianwei=(value/1000)+'0';
ps++;
*ps=qianwei;
baiwei=(value%1000)/100+'0';
ps++;
*ps=baiwei;
shiwei=((value%1000)%100)/10+'0';
ps++;
*ps=shiwei;
gewei=((value%1000)%100)%10+'0';
ps++;
*ps=gewei;

LCD_Write_String(X,Y,s);
}

/******************************************************************************************
* 函数名称 :LCD_Write_Single_Num
* 功能描述 :单个数字显示函数
* 参数 : 参数名称: value:16位无符号数字
*
*
******************************************************************************************/
void LCD_Write_Single_Num(u8 X,u8 Y,u16 value)// 单个数字显示函数
{
uint8_t s[1]="1";
uint8_t* ps=s;

char v;
v=value+'0';
*ps=v;

LCD_Write_String(X,Y,s);
}

/******************************************************************************************
* 函数名称 :LCD_Write_Tri_Value
* 功能描述 :3位数字串显示函数
* 参数 : 参数名称: value:16位无符号数字
*
*
******************************************************************************************/
void LCD_Write_Tri_Value(u8 X,u8 Y,u16 value)// 数字显示函数
{
uint8_t s[6]=" 1 2 3";
uint8_t* ps=s;

char baiwei,shiwei,gewei;
*ps=' ';


//最多只显示3位数

if(value>999)
{value=999;}

baiwei=(value%1000)/100+'0';
ps++;
*ps=baiwei;
shiwei=((value%1000)%100)/10+'0';
ps++;
*ps=' ';
ps++;
*ps=shiwei;
gewei=((value%1000)%100)%10+'0';
ps++;
*ps=' ';
ps++;
*ps=gewei;

LCD_Write_String(X,Y,s);
}

/******************************************************************************************
* 函数名称 :img_disp
* 功能描述 :显示图形
* 参数 : 参数名称: 输入/输出? 类型 描述
*
*
******************************************************************************************/
void Display_Img(u8 const *img)
{
u8 i,j;
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
Write_Char(comm,0x34);
Delay_ms(10);
Write_Char(comm,y+j);
Delay_ms(10);
Write_Char(comm,x1+i);
Delay_ms(10);
Write_Char(comm,0x30);
Delay_ms(10);
Write_Char(dat,img[j*16+i*2]);
Delay_ms(10);
Write_Char(dat,img[j*16+i*2+1]);
Delay_ms(10);
}
}
for(j=32;j<64;j++)
{
fo

r(i=0;i<8;i++)
{
Write_Char(comm,0x34);
Delay_ms(10);
Write_Char(comm,y+j-32);
Delay_ms(10);
Write_Char(comm,x2+i);
Delay_ms(10);
Write_Char(comm,0x30);
Delay_ms(10);
Write_Char(dat,img[j*16+i*2]);
Delay_ms(10);
Write_Char(dat,img[j*16+i*2+1]);
Delay_ms(10);
}
}
Delay_ms(10);
Write_Char(comm,0x36);
}

/**********12864.c********************/

相关文档
最新文档