电路图如下:
1、请描述液晶显示器的显示原理,及其与数码管相比的技术特点。
显示原理:
液晶显示器是利用偏光板这个特性来完成的,利用上下两片栏栅之间相互垂直的偏光板之间充满了液晶,
再利用电场控制液晶分支的旋转,来改变光的行进方向。
与数码管相比:数码管是元件,显示器是器件。
数码管在单片机中,一般仅做数字显示,而LCD可以显示数字、字符、汉字和图形。
还有LCD显示器体积小,厚度薄,重量轻、耗能少、工作电压低(1.5到6V)且无辐射,无闪烁并能直接与CMOS集成电路匹配。
2、
定义uchar变量data,要求在LCD1602上实现数字0~99的循环显示。
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********主程序*********************************/
void main(void)
{
LCD_initial(); //LCD1602 初始化
while(1)
{
unsigned int i;
unsigned char m,n;
delay(10);
for(i=0;i<=99;i++){
if(i<10){
n=i+'0';
dis_char(0x08,n);//显示字符
string(0x48,"wxh");//显示我的名字
}
else if(i<100){
m=i/10+'0';
n=i%10+'0';
dis_char(0x08,m);//显示字符
dis_char(0x09,n);
string(0x48,"wxh");//显示我的名字
}
delay(100);
write_command(0x01); //清屏
delay(100);
}
}
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)
{
write_command(ad+0x80);
write_data(input);
delay(10);
}
//1ms延时程序
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
//查忙程序
void check_busy(void)
{
uchar dt;
do
{
dt=0xff;
e=0;
rs=0;
rw=1;
e=1;
dt=out;
}while(dt&0x80);
e=0;
}
//写控制指令
void write_command(uchar com)
{
check_busy();
e=0;
rs=0;
rw=0;
out=com;
e=1;
_nop_();
e=0;
delay(1);
}
//写数据指令
void write_data(uchar dat)
{
check_busy();
e=0;
rs=1;
rw=0;
out=dat;
e=1;
_nop_();
e=0;
delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{
write_command(0x38);//8位总线,双行显示,5X7的点阵字符
write_command(0x0C);//开整体显示,光标关,无黑块
write_command(0x06);//光标右移
write_command(0x01);//清屏
delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
write_command(ad+0x80); //ad是显示位置信息
while(*s>0)
{
write_data(*s++);
delay(100);
}
}
3、在int0引脚上,利用按键实现中断触发,并在LCD1602上显示的触发次数。
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义************************/
unsigned int i=0;
/***********主程序*********************************/
void main(void)
{
LCD_initial(); //LCD1602 初始化
IT0=1;//设置P3.2引脚负跳变触发中断
EA=1;//打开中断总开关
EX0=1;//允许外部中断0引脚的中断
PX0=1;//将外部中断0的优先权设置为高级中断
while(1)
{
unsigned char m,n;
delay(10);
if(i==0){
string(0x00,"Hi! Teacher Chen");
}
else if(i<10){
n=i+'0';
dis_char(0x08,n);//显示字符
string(0x48,"wxh");//显示我的名字
}
else if(i<100){
m=i/10+'0';
n=i%10+'0';
dis_char(0x08,m);//显示字符
dis_char(0x09,n);
string(0x48,"wxh");//显示我的名字
}
delay(100);
write_command(0x01); //清屏
delay(100);
}
}
//INT0中断程序
void inter_0(void) interrupt 0{
i++;
if(i==99) i=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)
{
write_command(ad+0x80);
write_data(input);
delay(10);
}
//1ms延时程序
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
//查忙程序
void check_busy(void)
{
uchar dt;
do
{
dt=0xff;
e=0;
rs=0;
rw=1;
e=1;
dt=out;
}while(dt&0x80);
e=0;
}
//写控制指令
void write_command(uchar com)
{
check_busy();
e=0;
rs=0;
rw=0;
out=com;
e=1;
_nop_();
e=0;
delay(1);
}
//写数据指令
void write_data(uchar dat)
{
check_busy();
e=0;
rs=1;
rw=0;
out=dat;
e=1;
_nop_();
e=0;
delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{
write_command(0x38);//8位总线,双行显示,5X7的点阵字符
write_command(0x0C);//开整体显示,光标关,无黑块
write_command(0x06);//光标右移
write_command(0x01);//清屏
delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
write_command(ad+0x80); //ad是显示位置信息
while(*s>0)
{
write_data(*s++);
delay(100);
}
}
4、利用LCD1602显示出时分秒(时钟)
代码如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
/***********端口定义***************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********函数申明******************************************/
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
/***********全局变量定义******************************************/
unsigned int hour=0;//时
unsigned int min=0;//分
unsigned int sec=0;//秒
unsigned int counter=0;//软件计数
/***********主程序*********************************/
void main(void)
{
unsigned char period_number;
LCD_initial();//LCD1602 初始化
string(0x43,"Good night!");//晚安
period_number=200;
TMOD=0x02;//方式2
TL0=0-period_number;//装初值
TH0=0-period_number;
TR0=1;//启动
EA=1;//打开中断总开关
ET0=1;//允许T0引脚的中断
while(1)
{
unsigned char h1,h2,m1,m2,s1,s2;
h1=hour/10+'0';
h2=hour%10+'0';
m1=min/10+'0';
m2=min%10+'0';
s1=sec/10+'0';
s2=sec%10+'0';
dis_char(0x04,h1);//显示时
dis_char(0x05,h2);
dis_char(0x06,':');
dis_char(0x07,m1);//显示分
dis_char(0x08,m2);
dis_char(0x09,':');
dis_char(0x0a,s1);//显示秒
dis_char(0x0b,s2);
}
}
//T0中断程序
void inter_1(void) interrupt 1{
counter++;
if(counter>=5000){
counter=0;
sec++;
}
if(sec>=60) {
min++;
sec=0;
}
if(min>=60){
hour++;
min=0;
}
if(hour==24) hour=0;
}
//输出字符(数字)
void dis_char(unsigned char ad, unsigned char input)
{
write_command(ad+0x80);
write_data(input);
delay(10);
}
//1ms延时程序
void delay(uint j)
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
//查忙程序
void check_busy(void)
{
uchar dt;
do
{
dt=0xff;
e=0;
rs=0;
rw=1;
e=1;
dt=out;
}while(dt&0x80);
e=0;
}
//写控制指令
void write_command(uchar com)
{
check_busy();
e=0;
rs=0;
rw=0;
out=com;
e=1;
_nop_();
e=0;
delay(1);
}
//写数据指令
void write_data(uchar dat)
{
check_busy();
e=0;
rs=1;
rw=0;
out=dat;
e=1;
_nop_();
e=0;
delay(1);
}
//液晶屏初始化
void LCD_initial(void)
{
write_command(0x38);//8位总线,双行显示,5X7的点阵字符
write_command(0x0C);//开整体显示,光标关,无黑块
write_command(0x06);//光标右移
write_command(0x01);//清屏
delay(1);
}
//输出字符串
void string(uchar ad,uchar *s)
{
write_command(ad+0x80); //ad是显示位置信息
while(*s>0)
{
write_data(*s++);
delay(100);
}
}