12864的液晶显示程序无字库Word文件下载.docx
《12864的液晶显示程序无字库Word文件下载.docx》由会员分享,可在线阅读,更多相关《12864的液晶显示程序无字库Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
//向LED写入数据
voidWriteCommandLCD(unsignedcharWCLCD,unsignedcharBusyC,unsignedcharselect);
//向LCD写入命令
voidLcdReset(void);
//初始化函数,完成液晶模块的初始设置
voidclear_LCD(unsignedcharselect);
//清屏函数
voidClr_All_Lcd(void);
//全清屏函数
voidset_XY(unsignedcharColumn,unsignedcharPage);
//设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
voidxy_Write(unsignedcharColumn,unsignedcharPage,unsignedchardataW);
//向指定行列写数据
voidLcmPutDots(unsignedcharColumn,unsignedcharPage,unsignedcharDotByte);
//显示点
voidwhiteword(unsignedcharColumn,unsignedcharPage,constunsignedcharputs[][16]);
//显示16×
16点阵的编码
voidWhiteWord_Com(unsignedcharColumn,unsignedcharPage,unsignedcharC_num,
unsignedcharV_num,unsignedchar*puts);
//通用的显示函数
voidDrawing_dot(unsignedcharx,unsignedchary);
voidDrawing_line_vertical(unsignedx);
#endif
12864.c
/****************************************************
LCD12864点阵液晶屏,
通过I/O口直接控制,采用模拟时序控制
****************************************************/
#include"
12864.h"
math.h>
/***********************************************************
功能:
从LCD读取状态位
变量:
select用于选择LCD屏的左右,1选择左屏,2选择右屏
***********************************************************/
voidReadStatusLCD(unsignedcharselect)
{
switch(select)
{
case1:
{LCD_CSA=1;
LCD_CSB=0;
break;
}//左
case2:
{LCD_CSA=0;
LCD_CSB=1;
}//右
default:
break;
}
LCD_Data=0xff;
//置位输入口,已实现输入
LCD_RS=0;
LCD_RW=1;
LCD_E=1;
//高电平读取数据
//_nop_();
//若晶振速度高,可在此作延时处理
while(LCD_Data&
0x80);
//最高位为忙标志,检测忙信号状态
LCD_E=0;
//若晶振速度高,可在此作延时处理
}
从LCD读取数据
unsignedcharReadDataLCD(unsignedcharselect)
unsignedchardataR;
LCD_RW=1;
LCD_RS=1;
LCD_E=1;
//操作允许脉冲信号,高电平读出
//若晶振速度高,可在此作延时处理
dataR=LCD_Data;
LCD_E=0;
returndataR;
向LCD写入数据
参数:
WDLCD待写入的字符数据
select用于选择LCD屏的左右,1选择左屏,2选择右屏
voidWriteDataLCD(unsignedcharWDLCD,unsignedcharselect)
ReadStatusLCD(select);
//检测忙标志
LCD_RS=1;
LCD_RW=0;
LCD_Data=WDLCD;
LCD_E=1;
LCD_E=0;
//下降沿写入数据
向LCD写入命令
BusyC是否要检查忙标志位选择标志,1为进行,0为不检测
voidWriteCommandLCD(unsignedcharWCLCD,unsignedcharBusyC,unsignedcharselect)
if(BusyC)ReadStatusLCD(select);
//根据需要检测忙
LCD_Data=WCLCD;
LCD_RS=0;
/******************************************************************************
清显示RAM区(清屏)
select为驱动控制器选择1为左2为右
********************************************************************************/
voidclear_LCD(unsignedcharselect)
unsignedchari,j;
for(i=0;
i<
8;
i++)
{//8页,换页清零
WriteCommandLCD(0xb8|i,1,select);
//页面地址设置,并分别写入左右模块中
WriteCommandLCD(0x40,1,select);
//列地址设置,设置为0列,并分别写入左右三个模块中
for(j=0;
j<
64;
j++)
{//页内清零
WriteDataLCD(0,select);
}
/*****************************************************************************
清LCD左右屏
*****************************************************************************/
voidClr_All_Lcd(void)
clear_LCD
(1);
clear_LCD
(2);
LCD初始化,分为左,右模块初始化
voidLcdReset(void)
unsignedchari;
5;
WriteCommandLCD(0xc0,0,R);
//设置显示起始行为第一行,并分别写入左右模块中,不检测忙标志
WriteCommandLCD(0xc0,0,L);
//_nop_();
WriteCommandLCD(0xc0,1,R);
//设置显示起始行为第一行,并分别写入左右模块中,检测忙标志
WriteCommandLCD(0xc0,1,L);
WriteCommandLCD(0x3f,1,R);
//开显示设置,并分别写入左右模块中
WriteCommandLCD(0x3f,1,L);
clear_LCD(R);
//清左屏
clear_LCD(L);
//清右屏
设置数据写入或读出的地址,通过页号和列数可以唯一确定一个地址
Column表示列号,Page表示页号
voidset_XY(unsignedcharColumn,unsignedcharPage)
{
unsignedcharx,y;
unsignedcharselect;
switch(Column&
0x40)//完成左右屏的判断,根据列号完成区分,<
64为左屏,>
=64为右屏
{
case0x00:
{select=1;
ReadStatusLCD(select);
}/*为左区*/
case0x40:
{select=2;
}/*为右区*/
x=Column&
0x3F|0x40;
/*col.and.0x3f.or.SetYAddress*/
y=Page&
0x07|0xB8;
/*row.and.0x07.or.setPage*/
WriteCommandLCD(y,1,select);
//设置页面地址
WriteCommandLCD(x,1,select);
//设置列地址
根据地址值(页数和列号),写入数据,即写入显示缓冲区,便可以显示在LCD屏上
Column表示列号,Page表示页号,dataW表示待写入的数据
voidxy_Write(unsignedcharColumn,unsignedcharPage,unsignedchardataW)
set_XY(Column,Page);
LCD_RW=0;
LCD_RS=1;
_nop_();
//若晶振速度高,可在此作延时处理
LCD_Data=dataW;
//送数据
//操作允许脉冲信号,下降沿写入
用于显示点阵
Column表示列号,Page表示页号,
********************************************************************************/
voidLcmPutDots(unsignedcharColumn,unsignedcharPage,unsignedcharDotByte)
unsignedchari;
i=Column;
for(;
Page<
Page++)
{
for(;
Column<
128;
Column++)
{
xy_Write(Column,Page,DotByte);
//DotByte=~DotByte;
}
Column=i;
在指定列,指定页显示待显示的点阵编码,用于显示16*16点阵码
Column表示列号,Page表示页号,puts待显示的点阵编码首指针
voidwhiteword(unsignedcharColumn,unsignedcharPage,constunsignedcharputs[][16])
2;
i++)//此处的2为控制点阵行数,实际点阵行数为2*8=16行,此处的16(对应的点行数)应为8的倍数
for(j=0;
16;
j++)//此处控制每行显示的列数
xy_Write(Column+j,Page+i,puts[i][j]);
在指定列,指定页显示待显示指定点阵的编码
Column表示列号,Page表示页号,C_num为显示点阵的行数(物理行8的倍数),V_num为列(物理列)puts待显示的点阵编码首指针
voidWhiteWord_Com(unsignedcharColumn,unsignedcharPage,unsignedcharC_num,unsignedcharV_num,unsignedchar*puts)
(C_num/8);
V_num;
xy_Write(Column+j,Page+i,*(puts+i*V_num+j));
//注意地址的变化规律
绘点
voidDrawing_dot(unsignedcharx,unsignedchary)
unsignedchary_byte,x_bit,y_bit,reverse_y;
//此处y_byte为page,y_bit为具体行号,x_bit为行号
unsignedchardot;
reverse_y=63-y;
x_bit=x;
y_byte=reverse_y/8;
y_bit=y%8;
//for(;
x_bit<
x_bit++)
if(y_bit==0)dot=0x80;
if(y_bit==1)dot=0x40;
if(y_bit==2)dot=0x20;
if(y_bit==3)dot=0x10;
if(y_bit==4)dot=0x08;
if(y_bit==5)dot=0x04;
if(y_bit==6)dot=0x02;
if(y_bit==7)dot=0x01;
xy_Write(x_bit,y_byte,dot);
/*reverse_y=64-y;
if(y_bit==7)y_byte=y_byte-1;
y_bit=y%8;
if(y_byte==(-1))break;
*/
绘垂直直线
x表示列号
voidDrawing_line_vertical(unsignedcharx)
xy_Write(x,0,0xff);
xy_Write(x,1,0xff);
xy_Write(x,2,0xff);
xy_Write(x,3,0xff);
xy_Write(x,4,0xff);
xy_Write(x,5,0xff);
xy_Write(x,6,0xff);
xy_Write(x,7,0xff);
主程序.c
/**********************************************************************************************
12864液晶屏上显示"
南京绝妙科技发展有限公司,025-84532868开发板欢迎使用"
,"
0~9"
,刷新后重显。
*************************************************************************************************/
zifulib.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitadrd=P3^7;
//IO口定义
sbitadwr=P3^6;
sbitcs=P2^5;
unsignedadval;
延时程序
入口参数:
日期:
***************