/*****整版测试4:LCD1602*****/
//现象:按照定义接好电路,其中LCD1602的数据口接P3
//其他的看位定义
//把程序烧进去后,会依次显示两行字符,再左移,最后闪烁,如此循环
/****作者:爱因斯尼@SCUT***/
/****时间:2010.08.29******/
//程序说明:如果烧入程序后没显示,请调节旁边的10K电位器
//结合时序图,进行写命令和写数据操作就可以啦
#include<reg52.h>//51单片机的头文件
#define uint unsigned int//两个常用的宏定义
#define uchar unsigned char
#define port P3 //LCD1602数据的接口
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit bell=P1^4;//定义蜂鸣器
sbit duan=P1^5;//定义段选端
sbit wei=P1^6;//定义位选端
sbit lie=P1^7;//定义点阵的列扫描
uchar code data1[]="Welcome to tlmcu";
uchar code data2[]="Our_QQ:120913319";
uchar code data3[]=""; //写空白,目的实现左移或右移
/*********延时子函数,变化范围为1ms,具体看你想把形参的设计***************/
void delay_ms(ms)
{uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<300;j++);
}
/****延时子函数,变化范围为10us,具体看你想把形参的设计****/
void delay_us(us)
{uint i,j;
for(i=0;i<us;i++)
for(j=0;j<3;j++);
}
/*********数码管的初始化函数***************/
void Init_smg()
{
P0=0x00;
duan=1;
P0=0x00;//关段选端
duan=0;
P0=0xff;
wei=1;
P0=0xff;//关位选端
wei=0;
lie=1;
P0=0xff;//点阵全灭
lie=0;
}
/*****写命令*****/
void write_com(uchar com) //写命令子函数
{E=0; //使能端
RS=0; //低电平为命令选择端
RW=0; //低电平为写选择端
port=com; //P3口链接1602液晶的数据口
delay_ms(1);
E=1;
delay_ms(1);
E=0;
}
/*****写数据*****/
void write_dat(uchar dat) //写数据子函数
{E=0;
RS=1; //;高电平为数据选择端
RW=0; //低电平为写选择端
port=dat; //P3口链接1602液晶的数据口
delay_ms(1);
E=1;
delay_ms(1);
E=0;
}
/*****LCD1602的初始化函数*****/
void Init_LCD1602()
{
write_com(0X38);//设置显示模式
delay_ms(8);
write_com(0X01);//清屏
delay_ms(8);
write_com(0X0c);//光标不显示和闪烁
write_com(0X06);//当写一个字符后地址指针加1,而且光标家1
delay_ms(8);
}
/*****显示第一行*****/
void show_LCD1602row1(uchar addr1,uint delay_time)
{uchar i;
write_com(0x80+addr1);
delay_us(1);
for(i=0;i<16;i++)
{
write_dat(data1);
delay_us(delay_time);
}
}
/*****显示第二行*****/
void show_LCD1602row2(uchar addr2,uint delay_time)//第一个形参显示的是起始地址
{uchar i; //第二个形参延时时间
write_com(0x80+addr2);
delay_us(1);
for(i=0;i<16;i++)
{
write_dat(data2);
delay_us(delay_time);
}
}
/******整屏左移****/
void show_LCD1602moveleft()
{uchar i;
write_com(0x07);
for(i=0;i<15;i++)
{
write_dat(data3);
delay_ms(600);//160整屏左移的速度控制
}delay_ms(400);//停顿一下
}
/*****LCD1602闪烁*****/
void show_LCD1602_onoff()
{uchar k;
Init_LCD1602();
for(k=0;k<10;k++)
{
show_LCD1602row1(0x00,1);
show_LCD1602row2(0x40,1);
delay_ms(200);
write_com(0x01);
delay_ms(200);
}}
/*****主函数*****/
void main()
{uchar i;
Init_smg();
bell=1;//关闭蜂鸣器
P3=0X00;
Init_LCD1602();
while(1)
{
show_LCD1602row1(0x00,3000);
show_LCD1602row2(0x40,3000);
delay_ms(1000);
write_com(0x01); //清屏
delay_ms(200);
show_LCD1602row1(0x0f,1);
show_LCD1602row2(0x4f,1);
show_LCD1602moveleft();
show_LCD1602_onoff();
}}
欢迎光临我们的淘宝网:http://item.taobao.com/auction/item_detail.htm?item_num_id=9447334857
文章评论(0条评论)
登录后参与讨论