飞思卡尔单片机控制LCD1602程序范例
更新时间:2024-01-28 17:30:01 阅读量: 教育文库 文档下载
飞思卡尔单片机控制LCD1602程序范例(2008-11-19 09:24:27)标签:杂谈 分类:电子科技
LCD1602是很常用的液晶显示屏。在网络上已经有不少应用于51等单片机的程序。这里用的是Freescale的MC9SDG128,已经成功显示。
使用的是如下引脚的1602。以前用的是横排管脚的封装。而本次用的是这种管脚排列,可气的是,网上给资料竟然和Donald手头的这个模块不同,其中1脚是VDD,接+5V电源,2脚是VSS,接地。看了很多类似的模块,基本是和本人手里的模块一样,也就是说网上的资料基本是抄来抄去的,可以连试都没试过。
另外的3到14脚的作用如下。
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。调程序时,别忘了适当调整电位器。在调试时,开始时老是显示不出来,经过各种检查程序,还是不行,最后没办法调了下电位器,发现已经显示在上面了,晕!
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。
还有两个引脚没有引出来,他们是\和\,为背光引脚,\接正,\接负便会点亮背光灯。
这里,由于自己腐蚀的扩展板是单面板,需考虑最小系统板和引线方便。就让RS引脚接PORTE_BIT2,RW接的是PORTH的PTH0,E连接的是PTH2,并行数据口接的是PORTA。这些都在头文件中做了宏定义,可方便地应用于其它端口。
因为16位MCU的I/O口通常不像51那样直接输入输出,其具有多种功能。所以在使用时要经常对其数据方向寄存器进行配置。为了方便,Donald做了如下定义: #define LCDIO_DIR DDRA
#define LCDIO_DIR_IN 0x00 #define LCDIO_DIR_OUT 0xFF
这样,当需要变换端口数据传输方向时,只需用如下语句: LCDIO_DIR = LCDIO_DIR_IN; or
LCDIO_DIR = LCDIO_DIR_OUT;
以下为头文件。
#ifndef _LCD1602_14P #define _LCD1602_14P
#define LINE1 0 #define LINE2 1 #define LINE1_HEAD 0x80 #define LINE2_HEAD 0xC0
#define DATA_MODE 0x38 // 8 bit data transmission mode, double line
// LCD1602 Command Macro
#define CLR 0x01
#define BUSY 0x80 // LCD Busy Tag #define CURSOR_RESET 0x02 #define INPUTMODE_CUR_R 0x06 #define INPUTMODE_CUR_L 0x04 #define INPUTMODE_ALL_E 0x05 #define INPUTMODE_ALL_D 0x04 #define SCREEN_OPEN 0x0C #define SCREEN_OPEN_CUR 0x02 #define #define #define #define
SCREEN_OPEN_TWI 0x01
SCSHIFT_CUR_L 0x10 // Screen or Cursor shift SCSHIFT_CUR_R 0x14 SCSHIFT_SCR_L 0x18
#define SCSHIFT_SCR_R 0x1C
// LCD1602 Pins
#define LCD1602_RS PORTE_BIT2 //Data Command Pin 1 data 0 command #define LCD1602_RW PTH_PTH0 //Read Write Pin 1 read 0 write #define LCD1602_EN PTH_PTH2 //LCD Enable Signal #define LCDIO PORTA #define LCDIO_DIR DDRA #define LCDIO_DIR_IN 0x00 #define LCDIO_DIR_OUT 0xFF
void LcdCommand(unsigned char command,unsigned char BusyC); //write command function void LcdData(unsigned char temp,unsigned char BusyC); //write data function void LcdSetXY( unsigned char x, unsigned char y ); //set display address function
void LcdWriteChar( unsigned char x,unsigned char y,unsigned char dat);//write lcd a character function
void LcdWriteStr(unsigned char X,unsigned char Y,char *s);//write lcd string function void LcdInit(void); //LCD initize function unsigned char ReadStatus(void);
void LcdDelay(void); //LCD Delay Function
#endif
头文件结束。
以下是源文件。
#include
#include
void LcdInit(){ DDRH = 0xff; DDRE = 0xff;
LCDIO_DIR = LCDIO_DIR_OUT; LcdDelay();
LcdCommand(CLR,0); //clear screen LcdCommand(DATA_MODE,1); //set 8 bit data transmission mode
LcdCommand(INPUTMODE_CUR_R | INPUTMODE_ALL_D, 1); // cursor right, disable moving
LcdCommand(SCREEN_OPEN
| SCREEN_OPEN_CUR | SCREEN_OPEN_TWI
, 1); //open display (enable lcd display) LcdCommand(LINE1_HEAD,1); //set lcd first display address LcdCommand(CLR,1); //clear screen }
//////////////////////////////////////////////////////////////////// // write command function
//
void LcdCommand(unsigned char command,unsigned char BusyC){ if (BusyC) ReadStatus(); //Test it busy or not LCDIO=command; LCD1602_RS=0; LCD1602_RW=0; LCD1602_EN=0; LCD1602_EN=0; LCD1602_EN=1; }
unsigned char ReadStatus(void) {
unsigned char cRtn;
LCDIO_DIR = LCDIO_DIR_IN;
LCD1602_RS = 0; LCD1602_RW = 1; LCD1602_EN = 0; LCD1602_EN = 0;
LCD1602_EN = 1;
while (LCDIO & BUSY); //Test Busy State
cRtn = LCDIO_DIR; // if Not save the port value, it should be change LCDIO_DIR = LCDIO_DIR_OUT; return(cRtn); }
void LcdDelay(void){ word i, j;
for (i = 0; i < 300; i++) for(j = 0; j < 3000; j++);
}
//////////////////////////////////////////////////////////////////// // write data function //
void LcdData(unsigned char dat,unsigned char BusyC) {
if (BusyC) ReadStatus(); //Test it busy or not LCDIO=dat; LCD1602_RS=1; LCD1602_RW=0; LCD1602_EN=0; LCD1602_EN=0; LCD1602_EN=1; }
//////////////////////////////////////////////////////////////////// // write lcd a character function
//
void LcdWriteChar( unsigned char x,unsigned char y,unsigned char dat){ LcdSetXY(x, y); LcdData(dat,1); }
//////////////////////////////////////////////////////////////////// // set display address function //
void LcdSetXY( unsigned char x, unsigned char y ){
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x; else
address = LINE2_HEAD + x; LcdCommand(address,1); }
//////////////////////////////////////////////////////////////////// // write lcd string function
//
void LcdWriteStr(unsigned char X,unsigned char Y,char *s) {
LcdSetXY( X, Y ); //set address while (*s) // write character {
LcdData(*s, 1); s++; } }
正在阅读:
飞思卡尔单片机控制LCD1602程序范例01-28
梨树与藤散文11-21
分数加减法和分数乘法作业本练习06-20
第四章 第三节中医护理总则08-28
5173游戏交易平台03-10
学生逃课班委失职检讨书08-24
最大公因数与最小公倍数应用题及练习题11-06
小学生我爱祖国的蓝天作文06-13
国家科技攻关计划项目-可行性研究报告04-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 卡尔
- 单片机
- 范例
- LCD1602
- 控制
- 程序
- 二工2#3#高层住宅及地下车库质量通病防治措施
- 高电压技术课后题答案(部分)
- 503太阳能光伏发电安装工程监理实施细则
- 国际化视野下的世界文化遗产申报工作 - 图文
- 志书编审工作进展情况汇报
- 从细菌到植物导读学案汇总答案 - 图文
- 一年级上册语文课堂同步练习
- finance words
- 浅谈如何提高知识型员工的忠诚度
- 《武林立志传:龙吟剑》全人物
- 4#楼安全专项施工方案
- 电力通信接入网中的ATM技术与EOS技术应用比较
- 商务谈判
- 长江具有的文化意义
- 宝供案例分析
- 商务英语系大二年级学习互助小组安排
- 罗丹明B的电催化作用
- 2017-2023年中国城市轨道交通行业市场分析预测研究报告(目录) - 图文
- 航院公选课大学英语四六级写作笔记 以09年考研小作文为例
- 梁根林讲座