LCD1602的电路图和程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay_n25us(uint n);//延时函数
//********************************
//*******初始化函数***************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
{
if源自文库!PORTAB_PA4){
PORTE_PE5 = 0;
a=1;
}
else if(!PORTAB_PA5){
PORTE_PE5 = 0;
a=2;
}
else if(!PORTAB_PA6){
PORTE_PE5 = 0;
a=3;
}
else if(!PORTAB_PA7){
PORTE_PE5 = 0;
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80; //选定锁相环时钟
DDRE_DDRE5 = 1;
PORTE_PE5 = 1; //不亮
/*DDRA_DDRA0 = 1;
DDRA_DDRA1 = 1;
DDRA_DDRA2 = 1;
DDRA_DDRA3 = 1;*/
DDRA_DDRA4 = 0; //SET PORTA I/O INPUT
DDRA_DDRA5 = 0;
以下具体阐述这三个管脚:
RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
操作时序:
RS
R/W
操作说明
0
0
写入指令码D0~D7
0
1
读取输出的D0~D7状态字
1
//LCD_write_command(0x06);
//LCD_write_command(0x0c);
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{
LCD_DB=dat;delay_n25us(1);
3.void LCD_write_command(uchar dat):写指令
4.void LCD_write_data(uchar dat):写数据
5.void LCD_disp_char(uchar x,uchar y,uchar dat):显示字符
6.void main(void):主函数
#include <hidef.h> /* common defines and macros */
check_key(); //检查按键
while(1)
PB0
K4
PA6
DB1
PB1
K4
PA7
DB2
PB2
DB3
PB3
DB4
PB4
DB5
PB5
五、流程图
否
是
六、程序设计
1.void PLL_Init(void):内部锁相环模块,单片机使用PLL功能能够获得更高的总线频率,这对于需要提高单片机运行速度的应用场合非常必要。
2.void LCD_init(void):初始化LCD1602液晶显示屏,
b.数据方向寄存器DDRA
DDRA寄存器配置引脚为输出口还是输入口,“0”,输入口;“1”,输出口。MCU复位后,DDRA值为0x00,引脚默认为输入口。例:DDRA=0xFF //配置PORTA口为输出
PORTB:PORTB为通用数字I/O口,共8个。其使用与PORTA基本一样。主要配置寄存器有:数据寄存器PORTB、数据方向寄存DDRB。上拉电阻控制寄存器PUCR和驱动控制寄存器RDR与PORTA、PORTB、PORTE、PORTK共用。
}
# define LCD_DB PORTB
# define LCD_RS PORTA_PA0
# define LCD_RW PORTA_PA1
# define LCD_E PORTA_PA2
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
//********写数据函数*************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;delay_n25us(1);
LCD_RS=1;delay_n25us(1);//数据
LCD_RW=0;delay_n25us(1);//写入
LCD_E=1;delay_n25us(1);//允许
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//********************************
/*******检查忙函数*************
a.数据寄存器PORTB
b.数据方向寄存器DDRB
四、原理图:
器件说明:LCD1602(16管脚),2个排阻,4个10k电阻,一个1K电阻,飞思卡尔芯片(64管脚)
管脚连接:
VSS
GND
DB6
PB6
VCC
VCC
DB7
PB7
VEE
GND
A
VCC
RS
PA0
K
GND
RW
PA1
K1
PA4
E
PA2
K2
PA5
DB0
#include "derivative.h" /* derivative-specific definitions */
#include "MC9S12XS128.h"
unsigned char a=0;
unsigned char b=0;
unsigned char c=0;
unsigned char d=0;
LCD_RS=0;delay_n25us(1);//指令
LCD_RW=0;delay_n25us(1);//写入
LCD_E=1;delay_n25us(1);//允许
LCD_E=0;
delay_n25us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n25us(10);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
MS
基于1602字符型液晶显示器的显示系统
姓名:杨越
班级:电子11-1
学号:110400104
一、实习目的
(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。
(2)了解LCD1602的基本原理及用法。
(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。
(4)能够熟练焊接电路板。
本次设计中主要用到PORTA,PORTB端口:
PORTA:PORTA为通用I/O口,共8个,作为通用数字I/O口使用,未集成特殊功
能.主要配置寄存器有:数据寄存器PORTA、数据方向寄存DDRA、上拉电阻控制寄存器
PUCR和驱动控制寄存器RDR。
a.数据寄存器PORTA
通过写1/0使单片机对应引脚输出高低电平,或通过读取数据寄存器获得对应引脚的高低电平值。例:PORTA_PB0=1
LCD_E=0;delay_n25us(1);
delay_n25us(1);
}
//********************************
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
a=4;
}
else
PORTE_PE5 = 1;
}
//*********主函数*****************
void port_init() {
DDRB=0XFF;
DDRA=0XFF;
PORTB=0XFF;}
void main(void) {
//PLL_Init();
port_init();
LCD_init();
二、实验设备与器件
CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,
三、实验内容
内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统
要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。
(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
LCD_RS=0; //要用200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
}while(LCD_DB^7==1);
}
******************************/
//********延时函数***************
void delay_n25us(uint n)
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
DDRA_DDRA6 = 0;
DDRA_DDRA7 = 0;
PORTAB_PA4 = 1;
PORTAB_PA5 = 1;
PORTAB_PA6 = 1;
PORTAB_PA7 = 1;
//LCD_disp_char(4,2,'1');
for(;;) {
_FEED_COP(); /* feeds the dog */
void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{ //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do //用了延时的方法,延时还是非常好用的。我试了一下,用
{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
0x01清屏
0x0F开显示,显示光标,光标闪烁
0x08只开显示
0x0e开显示,显示光标,光标不闪烁
0x0c开显示,不显示光标
0x06地址加1,当写入数据的时候光标右移
0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变
0x18光标和显示一起向左移动
(2)飞思卡尔单片机的功能及特点:MC9S12XS128是16位单片机,由16位中央处理单元(CPU12X)、128KB程序、Flash(P-lash)、8KB RAM、8KB数据Flash(D-lash)组成片内存储器。主要功能模块包括:内部存储器,内部PLL锁相环模块,2个异步串口通讯SCI,1个串行外设接口SPI MSCAN模块,1个8通道输入/输出比较定时器模块TIM,周期中断定时器模块PIT,16通道A/D转换模块ADC,1个8通道脉冲宽度调制模块PWM,输入/输出数字I/O口。
0
写入数据D0~D7
1
1
从D0~D7读取数据
注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.
读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;
所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)
指令集:
LCD_1602初始化指令小结:
0x38设置16*2显示,5*7点阵,8位数据接口
{ uint i=0;
uchar j=0;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
//*******************************
void check_key(void) //判断按键是否可以控制单片机(如果键入正常,则单片机上的LED会亮
//********************************
//*******初始化函数***************
void LCD_init(void)
{
LCD_write_command(0x38);//设置8位格式,2行,5x7
{
if源自文库!PORTAB_PA4){
PORTE_PE5 = 0;
a=1;
}
else if(!PORTAB_PA5){
PORTE_PE5 = 0;
a=2;
}
else if(!PORTAB_PA6){
PORTE_PE5 = 0;
a=3;
}
else if(!PORTAB_PA7){
PORTE_PE5 = 0;
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1; //总线时钟=48/2=24MHz
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80; //选定锁相环时钟
DDRE_DDRE5 = 1;
PORTE_PE5 = 1; //不亮
/*DDRA_DDRA0 = 1;
DDRA_DDRA1 = 1;
DDRA_DDRA2 = 1;
DDRA_DDRA3 = 1;*/
DDRA_DDRA4 = 0; //SET PORTA I/O INPUT
DDRA_DDRA5 = 0;
以下具体阐述这三个管脚:
RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
操作时序:
RS
R/W
操作说明
0
0
写入指令码D0~D7
0
1
读取输出的D0~D7状态字
1
//LCD_write_command(0x06);
//LCD_write_command(0x0c);
}
//********************************
//********写指令函数************
void LCD_write_command(uchar dat)
{
LCD_DB=dat;delay_n25us(1);
3.void LCD_write_command(uchar dat):写指令
4.void LCD_write_data(uchar dat):写数据
5.void LCD_disp_char(uchar x,uchar y,uchar dat):显示字符
6.void main(void):主函数
#include <hidef.h> /* common defines and macros */
check_key(); //检查按键
while(1)
PB0
K4
PA6
DB1
PB1
K4
PA7
DB2
PB2
DB3
PB3
DB4
PB4
DB5
PB5
五、流程图
否
是
六、程序设计
1.void PLL_Init(void):内部锁相环模块,单片机使用PLL功能能够获得更高的总线频率,这对于需要提高单片机运行速度的应用场合非常必要。
2.void LCD_init(void):初始化LCD1602液晶显示屏,
b.数据方向寄存器DDRA
DDRA寄存器配置引脚为输出口还是输入口,“0”,输入口;“1”,输出口。MCU复位后,DDRA值为0x00,引脚默认为输入口。例:DDRA=0xFF //配置PORTA口为输出
PORTB:PORTB为通用数字I/O口,共8个。其使用与PORTA基本一样。主要配置寄存器有:数据寄存器PORTB、数据方向寄存DDRB。上拉电阻控制寄存器PUCR和驱动控制寄存器RDR与PORTA、PORTB、PORTE、PORTK共用。
}
# define LCD_DB PORTB
# define LCD_RS PORTA_PA0
# define LCD_RW PORTA_PA1
# define LCD_E PORTA_PA2
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
//********写数据函数*************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;delay_n25us(1);
LCD_RS=1;delay_n25us(1);//数据
LCD_RW=0;delay_n25us(1);//写入
LCD_E=1;delay_n25us(1);//允许
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//********************************
/*******检查忙函数*************
a.数据寄存器PORTB
b.数据方向寄存器DDRB
四、原理图:
器件说明:LCD1602(16管脚),2个排阻,4个10k电阻,一个1K电阻,飞思卡尔芯片(64管脚)
管脚连接:
VSS
GND
DB6
PB6
VCC
VCC
DB7
PB7
VEE
GND
A
VCC
RS
PA0
K
GND
RW
PA1
K1
PA4
E
PA2
K2
PA5
DB0
#include "derivative.h" /* derivative-specific definitions */
#include "MC9S12XS128.h"
unsigned char a=0;
unsigned char b=0;
unsigned char c=0;
unsigned char d=0;
LCD_RS=0;delay_n25us(1);//指令
LCD_RW=0;delay_n25us(1);//写入
LCD_E=1;delay_n25us(1);//允许
LCD_E=0;
delay_n25us(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n25us(10);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
MS
基于1602字符型液晶显示器的显示系统
姓名:杨越
班级:电子11-1
学号:110400104
一、实习目的
(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。
(2)了解LCD1602的基本原理及用法。
(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。
(4)能够熟练焊接电路板。
本次设计中主要用到PORTA,PORTB端口:
PORTA:PORTA为通用I/O口,共8个,作为通用数字I/O口使用,未集成特殊功
能.主要配置寄存器有:数据寄存器PORTA、数据方向寄存DDRA、上拉电阻控制寄存器
PUCR和驱动控制寄存器RDR。
a.数据寄存器PORTA
通过写1/0使单片机对应引脚输出高低电平,或通过读取数据寄存器获得对应引脚的高低电平值。例:PORTA_PB0=1
LCD_E=0;delay_n25us(1);
delay_n25us(1);
}
//********************************
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
a=4;
}
else
PORTE_PE5 = 1;
}
//*********主函数*****************
void port_init() {
DDRB=0XFF;
DDRA=0XFF;
PORTB=0XFF;}
void main(void) {
//PLL_Init();
port_init();
LCD_init();
二、实验设备与器件
CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,
三、实验内容
内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统
要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。
(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。
LCD_RS=0; //要用200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
}while(LCD_DB^7==1);
}
******************************/
//********延时函数***************
void delay_n25us(uint n)
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
//void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。
DDRA_DDRA6 = 0;
DDRA_DDRA7 = 0;
PORTAB_PA4 = 1;
PORTAB_PA5 = 1;
PORTAB_PA6 = 1;
PORTAB_PA7 = 1;
//LCD_disp_char(4,2,'1');
for(;;) {
_FEED_COP(); /* feeds the dog */
void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{ //至于不能正常使用LCD。因此我没有再用检查忙函数。而使
do //用了延时的方法,延时还是非常好用的。我试了一下,用
{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
0x01清屏
0x0F开显示,显示光标,光标闪烁
0x08只开显示
0x0e开显示,显示光标,光标不闪烁
0x0c开显示,不显示光标
0x06地址加1,当写入数据的时候光标右移
0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变
0x18光标和显示一起向左移动
(2)飞思卡尔单片机的功能及特点:MC9S12XS128是16位单片机,由16位中央处理单元(CPU12X)、128KB程序、Flash(P-lash)、8KB RAM、8KB数据Flash(D-lash)组成片内存储器。主要功能模块包括:内部存储器,内部PLL锁相环模块,2个异步串口通讯SCI,1个串行外设接口SPI MSCAN模块,1个8通道输入/输出比较定时器模块TIM,周期中断定时器模块PIT,16通道A/D转换模块ADC,1个8通道脉冲宽度调制模块PWM,输入/输出数字I/O口。
0
写入数据D0~D7
1
1
从D0~D7读取数据
注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.
读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;
所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)
指令集:
LCD_1602初始化指令小结:
0x38设置16*2显示,5*7点阵,8位数据接口
{ uint i=0;
uchar j=0;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
//*******************************
void check_key(void) //判断按键是否可以控制单片机(如果键入正常,则单片机上的LED会亮