首页 > 酒店新闻 > 行业动态

凯发国际天生赢家|汉字液晶FYD12864驱动程序

发布时间:2025-10-15 18:09:04    次浏览

近期在一个项目中用到了带汉字字库的液晶FYD12864-0402B,此液晶可用串口操作,极限情况下只需要2根IO口驱动,原以为会很复杂,经弄懂后发现驱动非常方便。现将测试程序公布如下,但愿能起到抛砖引玉的作用。/****************************************** 汉字液晶FYD12864测试程序 **** 文 件 名: main.c **** 日 期: 2007年12月24日 **** 描 述: 主函数 **** 作 者:周长洪 **** 版 本: V22.12864cs.1 **** 修改日期: 2007年12月24日 **** 主控芯片:M16 **** 晶振频率:7.3728MHZ外部 ******************************************/#include iom16v.h#include macros.h#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 iom16v.h#include macros.h#include 'delay_jg.h'//宏定义:定义各种操作的管脚//使用前应由主程序配置其输入、输出//LCD控制端口#define lcd_kz PORTA//串行时钟端:PA3输出#define clk 3#define set_lcd_clk lcd_kz|=(1clk) //置高#define clr_lcd_clk lcd_kz=(~(1clk)) //清0//片选控制端CS操作:PA2输出#define cs 2#define set_lcd_cs lcd_kz|=(1cs) //置高#define clr_lcd_cs lcd_kz=(~(1cs)) //清0//串行数据输入端SID操作:PA5输出#define sid 5#define clr_lcd_sid lcd_kz=(~(1sid)) //清0#define set_lcd_sid lcd_kz|=(1sid) //置位//8/4位选择控制PSB操作:PA6输出#define psb 6#define clr_lcd_psb lcd_kz=(~(1psb)) //清0:4位#define set_lcd_psb lcd_kz|=(1psb) //置位:8位//复位端RST操作:PA7输出#define rst 7#define clr_lcd_rst lcd_kz=(~(1rst)) //清0#define set_lcd_rst lcd_kz|=(1rst) //置位//宏定义:定义无符号数据的简写#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(data0x80) //判断应写入1或0{set_lcd_sid;}else{clr_lcd_sid;}data=data1; //左移一位,准备写入下一位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); //写入五个1wr_bit(1,0x00); //写入R/W=0,写入数据if(a==0) //根据a值写入RS值wr_bit(1,0x00); //如果a为1,写指令(RS=0)elsewr_bit(1,0x80); //如果a不为1,写数据(RS=1)wr_bit(1,0x00); //写入一个0wr_bit(4,b); //写入数据的高4位wr_bit(4,0x00); //写入4个0wr_bit(4,(b4)); //写入数据的低4位wr_bit(4,0x00); //写入4个0set_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('成都威诺公司出品');}原文链接:http://www.eeworld.com.cn/mcu/article_2016102930993.html