示例:LCD1602液晶模块应用 要求:LCD1602字符型液晶显示实验。在屏幕的第一行显示“224166320@”,第二行则显示“Tel:1308645xxxx”
《单片机C语言模块化编程技能训练》 石坚TM
1
[实验原理——LCD基础知识]
LCD显示器是一种利用液晶的扭曲/向列效应制成的 新型显示器。具有体积小、重量轻、功耗低、抗干 扰能力强等优点,因而在单片机系统中被广泛应用。
《单片机C语言模块化编程技能训练》 石坚TM
2
[实验原理——LCD结构及工作原理] LCD本身不发光,是通过借助外界光线照射液晶材料 而实现显示的被动显示器件。 向列型液晶材料被封装在上、下两片导电玻璃电极 之间,液晶分子平行排列,上下扭曲90度,外部入射 光线通过上偏振片后形成偏振光,该偏振光通过平行 排列的液晶材料后被旋转90度,再通过与上偏振片垂 直的下偏振片,被反射极反射过来,呈透明状态。 若在上、下电极之间加一定电压,在电场的作用下 迫使加在电极部分的液晶分子转成垂直排列,其旋光 作用也随之消失,致使从上偏振片入射的偏振光不旋 转,光无法通过下偏振片返回,呈黑色。去掉电压后, 液晶分子又恢复其扭转结构。《单片机C语言模块化编程技能训练》 石坚TM
3
实验原理——SMC1602A液晶模块引脚功能
《单片机C语言模块化编程技能训练》 石坚TM
4
实验原理——液晶控制器接口说明
《单片机C语言模块化编程技能训练》 石坚TM
5
实验原理——液晶控制器接口说明
《单片机C语言模块化编程技能训练》 石坚TM
6
实验原理——液晶控制器接口说明
《单片机C语言模块化编程技能训练》 石坚TM
7
实验原理——液晶控制器接口说明
《单片机C语言模块化编程技能训练》 石坚TM
8
实验原理——1602液晶控制器自带标准字库
每一个字符都有一个固定的代码,比如“A”的代码是41H,显示时模块把 41H中的点阵字符图形显示出来,就能看到字母“A”。 《单片机C语言模块化编程技能训练》 石坚TM
9
参考示例程序(程序写在一个C文件中)#include <AT89x52.h> #include <INTRINS.h> #define uchar unsigned char #define uint unsigned int #define DOUT P0 sbit rs=P2^0; sbit rw=P2^1; sbit e =P2^7; code uchar tab1[]={0x32,0x32,0x34,0x31,0x36,0x36,0x33,0x32,0x30, 0x40,0x71,0x71,0x2e,0x63,0x6f,0x6d,0xff,}; code uchar tab2[]={0x54,0x65,0x6c,0x3a,0x20, 0X31,0X33,0x30,0x38,0x36,0x34, 0x35,0x78,0x78,0x78,0x78,0xff,}; //延时函数 void delayms(unsigned int ms) { unsigned char i; while(ms--) {for(i=0;i<120;i++);} } 《单片机C语言模块化编程技能训练》 石坚 10TM
//以下为读忙状态的时序程序 unsigned char read_status(void) { unsigned ch
ar LCD_Status; DOUT=0xff;rs=0;rw=1;e=1; delayms(1); LCD_Status=DOUT;e=0; return LCD_Status; } //以下为写命令的时序程序 void write_com(unsigned char cmd) { while((read_status()&0x80)==0x80); rs=0;rw=0;e=0; P0=cmd;e=1;delayms(1);e=0; }《单片机C语言模块化编程技能训练》 石坚TM
11
《单片机C语言模块化编程技能训练》 石坚TM
//以下为液晶初始化程序 void lcd_ini(void) { write_com(0x38); delayms(1); write_com(0x01); delayms(1); write_com(0x06); delayms(1); write_com(0x0c); delayms(1); } //以下为写数据的时序程序 void write_dat(unsigned char dat) { while((read_status()&0x80)==0x80); rs=1;rw=0;e=0;P0=dat;e=1;delayms(1);e=0; }12
//以下为主函数 void main(void) { uchar i=0; lcd_ini(); write_com(0x80); //设置第一行数据地址指针,为80H+地址码 delayms(1); while(tab1[i]!=0xff) { write_dat(tab1[i]);i++;delayms(1); } i=0; write_com(0xc0); //设置第二行数据地址指针,为80H+地址码 delayms(1); while(tab2[i]!=0xff) { write_dat(tab2[i]);i++;delayms(1); } i=0; while(1); } 《单片机C语言模块化编程技能训练》 石坚TM
13
程序可作如下修改,写法如下:
参考程序://LCD1602.C //液晶控制与显示程序 #include <reg51.h> #include <intrins.h> sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚 sbit EN=P2^2; //使能信号位,将E位定义为P2.2引脚 //延时函数 void delayms(unsigned int ms) { unsigned char i; while(ms--) { for(i = 0;i < 120;i++); } } 《单片机C语言模块化编程技能训练》 石坚TM
14
//忙检测函数unsigned char busy_check(void) { unsigned char LCD_Status; //定义忙状态变量 RS = 0; RW = 1; EN = 1; delayms(1); LCD_Status = P0; //读取忙状态 EN = 0; return LCD_Status; //返回忙状态 }
//写命令void write_LCD_Command(unsigned char cmd) { while((busy_check( ) & 0x80) == 0x80); //等待忙状态结束 RS = 0; RW = 0; EN = 0; P0 = cmd; EN = 1; delayms(1); EN = 0; 《单片机C语言模块化编程技能训练》 石坚 }TM
15
//写数据 void write_LCD_data(unsigned char dat) { while((busy_check() & 0x80) == 0x80); RS = 1; RW = 0; EN = 0; P0 = dat; EN = 1; delayms(1); EN = 0; } //初始化 void init_LCD(void) { write_LCD_Command(0x38); //显示模式设置 delayms(1); write_LCD_Command(0x01); //清屏 delayms(1); write_LCD_Command(0x06); //字符进入模式:屏幕不动,字符后移 delayms(1); write_LCD_Command(0x0c); //显示开,关光标 delayms(1); } 《单片机C语言模块化编程技能训练》 石坚 16TM
//显示字符串 void ShowString(unsigned char x,unsigned char y,unsigned char *str) { unsigned char i = 0; //设置起始位置 if(y == 0) {write_LCD_Command(0x80 | x);} if(y == 1) {write_LCD_Command(0xc0 | x);} //输出字符串 for(i = 0; i < 16;i++) {write_LCD_data(str[i]);} } //主函数 void main(void) { init_LCD( ); ShowString(0,0,"224166320@")
; ShowString(0,1,"Tel: 1308645xxxx"); while(1); } 《单片机C语言模块化编程技能训练》 石坚TM
17
大型模块化程序的肇始(LCD1602 3.0版) 基本思路:将一个文件的程序按照其模块功能划分为两 个或两个以上的文件,每个文件表示系统实现特定的功 能。如本程序可分为主函数C文件、液晶显示C文件、液 晶显示头文件、includes头文件。 //main.c:#include "includes.h" void main(void) { init_LCD(); ShowString(0,0,"224166320@"); ShowString(0,1,"Tel: 1308645xxxx"); while(1); }《单片机C语言模块化编程技能训练》 石坚TM
18
大型模块化程序的肇始(LCD1602 3.0版) //lcd1602test.c:#include <reg51.h> #include <LCD1602.h>void ShowString(unsigned char x,unsigned char y,unsigned char *str)
{ unsigned char i = 0; if(y == 0) {write_LCD_Command(0x80 | x);} if(y == 1) {write_LCD_Command(0xc0 | x);} for(i = 0; i < 16;i++) { write_LCD_data(str[i]); } }《单片机C语言模块化编程技能训练》 石坚TM
19