总结一下一些模块常用的子程序

相信很多同学和我一样,刚开始的时候可能不太喜欢拿着数据手册去看,然后去写一些子程序。比如说lcd12864或者lcd1602的一些写命令、写数据、忙检查子程序等等。
这里给大家总结一些模块的子程序,大家直接可以复制粘贴拿来用。

LCD12864模块

下面是实际使用lcd12864模块的子程序,当然如果大家买的模块带中文字库,可以直接查找字库表显示中文汉字。或者直接将中文字符串进行输出显示。

/*******************************************************************
函数名称:delay(int ms)
函数功能:延时
输入参数:ms  要延时的ms数
返回值:  无*******************************************************************/
void delay_ms(int ms)
{while(ms--){uchar i;for(i=0;i<250;i++){; ; ; ;}  //一个机器周期为1us,250*4us=1ms}
}
/*******************************************************************
函数名称:lcd_busy()
函数功能:检测LCD忙状态。
输入参数:无
返回值:  result result为1时,忙等待;result为0时,闲,可写指令数据
*******************************************************************/
bit lcd_busy()
{                          bit result;     //定义是否忙碌标志位LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms(1);result = (bit)(LCD_data&0x80);LCD_EN = 0;return(result);
}
/*******************************************************************
函数名称:lcd_wcmd()
函数功能:lcd写指令数据子程序。
输入参数:cmd  输入命令
返回值:  无
*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;delay_ms(1);LCD_data = cmd;      //将指令数据送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0;
}/*******************************************************************
函数名称:lcd_wdat()
函数功能:lcd写显示数据子程序。
输入参数:dat  显示的数据
返回值:  无
*******************************************************************/
void lcd_wdat(uchar dat)
{                          while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;LCD_data = dat;          //将显示数据送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0;
}/*******************************************************************
函数名称:lcd_init()
函数功能:lcd初始化子程序。
输入参数:无
返回值:  无
*******************************************************************/
void lcd_init()
{ lcd_wcmd(0x34);      //扩充指令操作delay_ms(5);lcd_wcmd(0x30);      //基本指令操作delay_ms(5);lcd_wcmd(0x0C);      //显示开,关光标delay_ms(5);lcd_wcmd(0x01);      //清除LCD的显示内容delay_ms(5);
}/*******************************************************************
函数名称:lcd_pos()
函数功能:lcd设定显示位置子程序。
输入参数:X:行数  Y:列数
返回值:  无
*******************************************************************/
void lcd_pos(uchar X,uchar Y)
{                          uchar pos;if(X==0)X=0x80;          //设置为第1行,注意对应X是0else if(X==1)X=0x90;else if(X==2)X=0x88;else if(X==3)X=0x98;pos = X+Y ;         //设置列,注意第一列对应Y是0lcd_wcmd(pos);     //设定显示地址
}/*******************************************************************
函数名称:lcd_display()
函数功能:lcd设定显示位置并显示字符串子程序,包括中英文、数字、特殊字符。
输入参数:X:行数  Y:列数  *dis 字符串地址
返回值:  无
*******************************************************************/
void lcd_display (uchar X,uchar Y,uchar *dis)
{uchar i;lcd_pos(X,Y);
i = 0;while(dis[i] != '\0')  //显示字符串{                         lcd_wdat(dis[i]);  i++;}
}

很多同学在做仿真的时候代码和实际的不太一样。比如用proteus仿真时lcd12864有CS1,CS2两个片选信号引脚,但是实际的时候大多数是没有这两个引脚,而是一个PSB引脚(当然淘宝上也有带CS1,CS2片选引脚的lcd12864买)。接下来给大家总结一下仿真时如果用CS1,CS2片选引脚应该怎么写这些子程序。

void delay_ms(uint xms) //延时子程序
{uint i,j;for(i=xms;i>0;i--){for(j=110;j>0;j--);    }
}void lcd_busy()       //LCD忙检查子程序
{uchar result;LCD_RS=0;LCD_RW=1;do {LCD_data=0x00;LCD_EN=1;_nop_();result=LCD_data;LCD_EN=0;result=0x80&result; //检查忙信号}while(!(result==0x00)); //当忙信号为0时才可继续操作
}void lcd_wcmd(uchar cmd)    //LCD写命令子程序
{                          lcd_busy();LCD_RS=0; //写命令LCD_RW=0;LCD_data=cmd;LCD_EN=1; //利用EN 下降沿完成命令写操作_nop_();_nop_();LCD_EN=0;
}void SetPage(uchar page)   //设置页码子程序,页码为0~7
{page=0xb8|page;lcd_wcmd(page);
}void SetStartLine(uchar startline) //设置起始行,行号为0~63
{startline=0xc0|startline;lcd_wcmd(startline);
}void SetColumn(uchar column)   //设置列子程序,列号为0~63
{column=column&0x3f;column=0x40|column;lcd_wcmd(column);
}void SetOnOff(uchar onoff)   //开关显示屏子程序
{onoff=0x3e|onoff;lcd_wcmd(onoff);
}void lcd_wdat(uchar dat)   //LCD写数据子程序
{                          lcd_busy();LCD_RS=1;LCD_RW=0;LCD_data=dat;LCD_EN=1;_nop_();_nop_();LCD_EN=0;
}void SelectScreen(uchar screen)       //选屏子程序,screen=0,1,2
{switch(screen){case 0: CS1=0; //全屏显示_nop_();_nop_();_nop_();CS2=0;_nop_();_nop_();_nop_();break;case 1: CS1=0;  //左屏显示_nop_();_nop_();_nop_();CS2=1;_nop_();_nop_();_nop_();break;case 2: CS1=1;  //右屏显示_nop_();_nop_();_nop_();CS2=0;_nop_();_nop_();_nop_();break;}
}void ClearScreen(uchar screen) //清屏子程序,screen=0,1,2
{uchar i,j;SelectScreen(screen);for(i=0;i<8;i++){SetPage(i);SetColumn(0);for(j=0;j<64;j++){lcd_wdat(0x00);}}
}void lcd_init()         //lcd12864初始化子程序
{lcd_busy();     //读忙信号,不忙则向下执行SelectScreen(0);SetOnOff(0);   //关屏SelectScreen(0);SetOnOff(1);   //开屏SelectScreen(0);ClearScreen(0);    //清屏SetStartLine(0); //开始行为0
}void ChineseDisplay(uchar screen,uchar page,uchar column,uchar number) //汉字显示子程序
{int i;SelectScreen(screen);    //screen为显示的屏号column=column&0x3f;      //column为列号SetPage(page);   //page为页号,显示第number个汉字的上半部分,可理解为要显示的汉字位于屏幕的第page行SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number]);//number为字号,取第number个汉字的第i列数据编码值}SetPage(page+1); //显示第number个汉字的下半部分SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number+16]);//取第number个汉字的第i列数据编码值}
}

下篇:DS1302时钟模块
链接: 下篇:DS1302时钟模块

LCD12864示例子程序相关推荐

  1. DS1302示例子程序

    总结一下一些模块常用的子程序 DS1302读写时间数据 //DS1302写入地址命令,顺序为秒分时日月周年,最低位读写位,读取的地址在写入的基础上加1 uchar code WRITE_RTC_ADD ...

  2. 微型计算机原理与应用课件,微机原理与应用课件

    PPT内容 这是微机原理与应用课件,包括了微型计算机系统概述,微处理器指令系统,汇编语言程序设计,微处理器外部特性,半导体存储器系统,基本输入输出接口等内容,欢迎点击下载. Principle and ...

  3. 微型计算机原理与接口技术ppt,单片机原理与接口技术课件ppt

    PPT内容 这是单片机原理与接口技术课件ppt,包括了微型计算机基础,MCS-51单片机结构与时序,习题课,MCS-51与存储器连接示例,汇编语言程序设计,半导体存储器,中断系统,并行I/O接口,MC ...

  4. 液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动

    液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动 一.LCD12864 / LCD12232 1.LCD12864 2.LCD12232 3.接线图 二.ST7920 1.接口时 ...

  5. Swift与LLVM-Clang原理与示例

    Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...

  6. Python进阶之递归函数的用法及其示例

    作者 | 程序员adny 责编 | 徐威龙 封图| CSDN│下载于视觉中国 出品 |  AI科技大本营(ID:rgznai100) 本篇文章主要介绍了Python进阶之递归函数的用法及其示例,现在分 ...

  7. mysql游标示例mysql游标简易教程

    从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键),灾难恢复能力等等. ...

  8. 关于骨骼动画及微软示例Skinned Mesh的解析

    这是我自个写的,第一次发. 没想到这个贴子编辑器极差. 原文是有字体字色的.现在只能清一色了.    版主,发贴的编辑器太难用! 你有必要向上反映一下. 下面的字体是我敲html标记加上的,大家凑和看 ...

  9. 单片机 10种软件滤波方法的示例程序

    单片机学习笔记_10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整     v ...

最新文章

  1. oracle导入导出命令
  2. OpenGL实现齿轮gears联动
  3. 余额宝好日子到头,以后不能随存随取了!
  4. pycharm 右键无法显示unittest框架解决右键只有unittest 运行如何取消右键显示进行普通run...
  5. linux 命令-全称
  6. python中的raw_input() 与 input() 比较
  7. vs C++实现Socket通信、添加ws2_32.lib 动态链接库
  8. html字幕文本,HTML字幕
  9. java根据经纬度获取地址信息
  10. 阿里的花名,真的是为了去人格化吗?
  11. 段式存储、页式存储及段页式存 详解
  12. 劳务派遣和灵活用工有什么不同?
  13. Ubuntu设置仅允许特定用户或特定IP通过ssh访问
  14. SANER 2018 论文阅读- Dissection of a Bug Dataset: Anatomy of 395 Patches from Defects4J
  15. Can not issue executeUpdate() for SELECTs
  16. Retbleed:针对英特尔和AMD处理器的推断性执行攻击
  17. code文件服务器异常怎么处理,服务器启动异常!Code1 Table does not exist(解决办法)...
  18. 【无人机】基于蒙特卡洛算法实现无人机任务分配模型附matlab代码
  19. 如何撰写需求文档(PRD)
  20. 阿里钉钉总裁威武,鼓励「领导向下属写周报」

热门文章

  1. [codeigniter]CI中使用pChart绘制图表,已测通过
  2. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举
  3. 我的编码规范(慢慢补充)
  4. 企业云计算指南:在安全前提下获得利益
  5. String的深入解析
  6. Eclipse常用快捷键、常用设置、常见问题等
  7. 刷新系统托盘(清除死掉的图标)修正版
  8. 云计算的台前幕后 ——微云网络
  9. 为什么SD-WAN5年增长超过40%,越来越受企业欢迎?
  10. 企业要SD-WAN组网,请先评估这些问题