当前位置:首页 > 单片机 > 单片机
[导读]近期在一个项目中用到了带汉字字库的液晶FYD12864-0402B,此液晶可用串口操作,极限情况下只需要2根IO口驱动,原以为会很复杂,经弄懂后发现驱动非常方便。现将测试程序公布如下,但愿能起到抛砖引玉的作用。/******

近期在一个项目中用到了带汉字字库的液晶FYD12864-0402B,此液晶可用串口操作,极限情况下只需要2根IO口驱动,原以为会很复杂,经弄懂后发现驱动非常方便。现将测试程序公布如下,但愿能起到抛砖引玉的作用。

/****************************************
** 汉字液晶FYD12864测试程序 **
** 文 件 名: main.c **
** 主控芯片:M16 **
** 晶振频率:7.3728MHZ外部 **
****************************************/
#include
#include
#include "delay_jg.h"
#include "FYD_12864_B_4.h"

//数据类型的定义
#define uchar unsigned char
#define uint unsigned int

/********************************
* 器件端口初始化函数 *
********************************/
void port_init(void)
{
PORTA = 0b00000000;
DDRA = 0b11111111;
PORTB = 0b00011000;
DDRB = 0b00011111; //输出
PORTC = 0xFF;
DDRC = 0b00000000; //输入
DDRD = 0b11010000;
PORTD = 0b00001100;
}

/******************************
* 主函数 *
******************************/
void main(void)
{
port_init(); //端口定义

delay_ms(100);
lcd12864_init(); //液晶初始化
delay_ms(50);

guanggao(); //显示欢迎内容

delay_ms(5000); //显示时间5秒

cls(); //清屏
delay_ms(20);

locate(1,1); //定位于第一行第一列
lcd(" FYD12864-0402B");

locate(2,2); //定位于第二行第二列
lcd("汉字液晶测试");

locate(3,1); //定位于第三行第一列
lcd("这里显示的是汉字");

locate(4,3); //定位于第四行第三列
lcd("欢迎光临!");

while(1)
{
;
}
}

液晶驱动程序模块:

/********************************************
* 飞宇达12864汉字液晶驱动程序 *
* 文 件 名:FYD_12864_B_4.c *
* 设 计 者:周长洪 *
* 建立日期:2007年12月22日 *
* 版 本:V8.01 *
* 修改日期:2007年12月22日 *
* 主控芯片:Mega16 *
* 时钟频率:7.3728 MHZ *
* 联接方式:串行数据线联接 *
* 硬件环境:JGKZ22板 *
* 联接关系:LCD12864 M16 *
* RESET _________ M16:PA7 *
* PSB ___________ M16:PA6 *
* CLK ___________ M16:PA3 *
* SID ___________ M16:PA5 *
* CS ____________ M16:PA2 *
********************************************/
#include
#include
#include "delay_jg.h"

//宏定义:定义各种操作的管脚
//使用前应由主程序配置其输入、输出
//LCD控制端口
#define lcd_kz PORTA
//串行时钟端:PA3输出
#define clk 3
#define set_lcd_clk lcd_kz|=(1< #define clr_lcd_clk lcd_kz&=(~(1<

//片选控制端CS操作:PA2输出
#define cs 2
#define set_lcd_cs lcd_kz|=(1< #define clr_lcd_cs lcd_kz&=(~(1<

//串行数据输入端SID操作:PA5输出
#define sid 5
#define clr_lcd_sid lcd_kz&=(~(1< #define set_lcd_sid lcd_kz|=(1<

//8/4位选择控制PSB操作:PA6输出
#define psb 6
#define clr_lcd_psb lcd_kz&=(~(1< #define set_lcd_psb lcd_kz|=(1<

//复位端RST操作:PA7输出
#define rst 7
#define clr_lcd_rst lcd_kz&=(~(1< #define set_lcd_rst lcd_kz|=(1<

//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int
/************************************
* 模拟串口专用延时函数 *
************************************/
void delay(void)
{
NOP();
NOP();
NOP();
NOP();
}

/*****************************************
* 写指定位数到12864的函数 *
* 入口参数:n写入位数,data写入数据 *
* 说 明:将data的高n位写入 *
*****************************************/
void wr_bit(uchar n,uchar data)
{
for(;n;n--) //写入位数
{
if(data&0x80) //判断应写入1或0
{set_lcd_sid;}
else
{clr_lcd_sid;}
data=data<<1; //左移一位,准备写入下一位
delay();
set_lcd_clk; //产生上升沿,写入
delay();
clr_lcd_clk;
}
}

/*****************************************
* 写指令或数据到12864函数 *
*入口参数:a=1写显示数据,a=0写指令数据 *
* b需写入的数据 *
*时 序:按手册时序进行 *
*****************************************/
void wr_12864(uchar a,uchar b)
{
clr_lcd_clk;

wr_bit(5,0xFF); //写入五个1

wr_bit(1,0x00); //写入R/W=0,写入数据

if(a==0) //根据a值写入RS值
wr_bit(1,0x00); //如果a为1,写指令(RS=0)
else
wr_bit(1,0x80); //如果a不为1,写数据(RS=1)

wr_bit(1,0x00); //写入一个0

wr_bit(4,b); //写入数据的高4位

wr_bit(4,0x00); //写入4个0

wr_bit(4,(b<<4)); //写入数据的低4位

wr_bit(4,0x00); //写入4个0

set_lcd_sid; //非数据传送状态数据端置高
}

/*****************************************
* LCD12864初始化函数 *
*****************************************/
void lcd12864_init(void)
{
clr_lcd_psb; //串行工作方式
delay_ms(50);

clr_lcd_rst; //复位
delay_ms(100);
set_lcd_rst;
delay_ms(200);

set_lcd_cs; //片选高电平有效

wr_12864(0,0x30); //设置数据方式:8位
delay_us(200);
wr_12864(0,0x30); //设置数据方式:8位
delay_us(80);
wr_12864(0,0x0C); //开显示
delay_us(80);
wr_12864(0,0x40); //开显示
delay_us(200);
wr_12864(0,0x01); //清屏
delay_ms(200);
}

/************************************
* LCD12864显示字符串函数 *
************************************/
//入口:待显示的字符串
void lcd(char *s)
{
while(*s)
{
wr_12864(1,*s);
s++;
}
}

/************************************
* LCD12864显示定位函数 *
* 入 口:h定位的行数,V列数 *
************************************/
void locate(uchar h,uchar v)
{
switch(h)
{
case 1:
wr_12864(0,(0x80+v-1)); //写第一行V列地址
break;
case 2:
wr_12864(0,(0x90+v-1)); //写第二行V列地址
break;
case 3:
wr_12864(0,(0x88+v-1)); //写第三行V列地址
break;
case 4:
wr_12864(0,(0x98+v-1)); //写第四行V列地址
break;
default:break;
}
}

/************************************
* LCD12864显示清屏函数 *
************************************/
void cls(void)
{
delay_us(200);
wr_12864(0,0x01); //清屏
delay_ms(20);
}

/********************************
* 显示公司广告语函数 *
********************************/
void guanggao(void)
{
locate(1,3);
lcd("欢迎使用");
locate(2,1);
lcd("机柜环境监控单元");
locate(3,2);
lcd("Chengdu-VINO");
locate(4,1);
lcd("成都威诺公司出品");
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

USB摄像头是一种采用USB接口的视频采集设备,其优点在于即插即用、操作简便,无需额外驱动程序,支持笔记本电脑,并且成本较低,可以支持远程网络观看。

关键字: usb摄像头 驱动程序

与两相双极步进电机的驱动电路相比,两相单极步进电机的驱动电路在输入段配置、内部逻辑及控制电路和驱动电路使用双通道方面基本相同,但是输出段的配置不同。

关键字: 四相步进电机 驱动程序 程序电路

本文介绍了如何实现嵌入式MICREL网卡的驱动程序开发和设计。首先,我们介绍了MICREL网卡的概述和工作原理。然后,详细探讨了驱动程序的开发流程,包括硬件和软件的配置以及驱动程序的编写和测试。最后,总结了几点注意事项和...

关键字: 嵌入式 MICREL网卡 驱动程序

在这篇文章中,小编将对OLED的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: OLED 驱动程序 无源驱动

近日,英特尔发布了锐炫显卡的新版驱动更新。本次驱动更新涵盖了锐炫A770、A750、A380以及移动端的锐炫GPU,这使得英特尔锐炫整个家族的DX9性能都实现了显著提升。

关键字: 英特尔 显卡 驱动程序

摘 要:从硬件与软件方面介绍了基于PXI技术的1553B总线通讯模块的设计,并对PXI总线接口设计、驱动程序的开发、 SDRAM存储器的控制和1553B总线通信协议实现等关键技术进行了详细的阐述,为航空领域测控系统开发P...

关键字: PXI技术 驱动程序 SDRAM存储器 1553B总线

PnP全称Plug-and-Play,译文为即插即用。PnP的作用是自动配置低层计算机中的板卡和其他设备,然后告诉对应设备都做了什么。PnP的任务是把物理设备和软件设备驱动程序相配合,并操作设备,在每个设备和它的驱动程序...

关键字: PnP 驱动程序 操作设备

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录kill命令和信号使用kill...

关键字: 信号 应用程序 驱动程序

驱动程序本质上是软件代码,主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。

关键字: 驱动程序 硬件设备 UNIX

驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常...

关键字: 驱动程序 声卡 设备
关闭
关闭