标题:
LCD1602显示汉字(年月)带滚动效果的proteus仿真及程序
[打印本页]
作者:
51黑ff
时间:
2016-9-25 13:39
标题:
LCD1602显示汉字(年月)带滚动效果的proteus仿真及程序
0.png
(44.62 KB, 下载次数: 52)
下载附件
2016-9-25 13:37 上传
仿真及程序下载:
1602LCD PROTUS仿真.zip
(39.42 KB, 下载次数: 113)
2016-9-25 13:38 上传
点击文件名下载附件
下载积分: 黑币 -5
源程序:
/*************************************************************************
程序功能:在LCD上显示2017年08月21日
I Love Mcu
Author
x x x
******************头文件声明**********************************************/
#include <reg51.h>
#include <intrins.h>
/*********************************端口定义**********************************/
sbit rs= P2^4;
sbit rw = P2^5;
sbit en = P2^6;
sbit busy=P0^7;
/********************************显示数据表*********************************/
unsigned char day[] = {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; //日的字符表
unsigned char month[]={0x1f,0x11,0x1d,0x11,0x1d,0x11,0x11,0x00}; //月的字符表 //月的字符表
unsigned char year[] ={0x40,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02}; //年的字符表
unsigned char time[] ={"20130821"};
unsigned char code1[]={"I Love Mcu"};
unsigned char author[]={"Author"};
unsigned char name[]={"X X X"};
/*****************************************************************************
函数功能:LCD延时子程序
入口参数:ms
出口参数:
*****************************************************************************/
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:busy_flag
*****************************************************************************/
bit lcd_check_busy()
{
P0=0Xff;
rs = 0;
rw = 1;
en = 0;
_nop_();
en=1;
return busy;
}
/*****************************************************************************
函数功能:写指令数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_check_busy()); //判断LCD是否忙碌
rs = 0;
rw = 0;
en = 1;
P0 = cmd;
_nop_();
en = 0;
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_check_busy()); //判断LCD是否忙碌
rs = 1;
rw = 0;
en = 1;
P0 = dat;
_nop_();
en = 0;
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void lcd_init()
{
lcd_wcmd(0x38);
DelayMs(5);
lcd_wcmd(0x38);
DelayMs(5);
lcd_wcmd(0x38);
DelayMs(5);
lcd_wcmd(0x38); //8位数据,双行显示,5*7点阵
lcd_wcmd(0x08); //显示关闭,无光标,光标不显示
lcd_wcmd(0x01); //清显示
lcd_wcmd(0x06); //光标右移
DelayMs(5);
lcd_wcmd(0x0c); //开显示,有光标,光标闪烁
}
/****************************************************************************
函数功能:建立年月日字符
入口参数:
出口参数:
*****************************************************************************/
void lcd_setups()
{unsigned int i;
lcd_wcmd(0x40);
for(i=0;i<8;i++)
{lcd_wdat(year[i]);
}
lcd_wcmd(0x48);
for(i=0;i<8;i++)
{lcd_wdat(month[i]);
}
lcd_wcmd(0x50);
for(i=0;i<8;i++)
{lcd_wdat(day[i]);
}
}
/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
void main(void)
{unsigned char j;
unsigned char i;
lcd_init(); //初始化LCD
lcd_setups(); //建立字符
while(1)
{for(j=0;j<5;j++)
{
lcd_pos(0x00); //显示2013
for(i=0;i<4;i++)
{
lcd_wdat(time[i]);
}
lcd_pos(0x05); //显示年
lcd_wdat(0x00);
lcd_pos(0x07);
for(i=4;i<6;i++) //显示08
{
lcd_wdat(time[i]);
}
lcd_pos(0x0a); //显示月
lcd_wdat(0x01);
lcd_pos(0x0c);
for(i=6;i<8;i++) //显示21
{
lcd_wdat(time[i]);
}
lcd_pos(0x0f); //显示日
lcd_wdat(0x02);
lcd_pos(0x43); //显示I Love Mcu
for(i=0;i<10;i++)
{DelayMs(500);
lcd_wdat(code1[i]);
}
for(i=0;i<17;i++)
{
DelayMs(500);
lcd_wcmd(0x18);
}
lcd_wcmd(0x01); //显示字符整体左移1位
}
lcd_pos(0x05);
for(i=0;i<6;i++)
{
DelayMs(500);
lcd_wdat(author[i]);
}
lcd_pos(0x41);
for(i=0;i<13;i++)
{
DelayMs(500);
lcd_wdat(name[i]);
}
DelayMs(1000);
lcd_wcmd(0x01);
}
}
复制代码
作者:
123seven
时间:
2016-11-14 22:11
怎么接线啊?
作者:
admin
时间:
2016-11-15 22:29
123seven 发表于 2016-11-14 22:11
怎么接线啊?
打开仿真工程文件,里面就有原理图了,可以看到接线方式.
作者:
edelman
时间:
2017-5-28 13:22
过了这么久大神还在吗,程序的初始化为什么要写很多遍0x38这个命令呢,还有为什么要加延时。刚刚接触单片机,不是很懂。。
作者:
qinba393
时间:
2017-5-29 17:58
还能显示汉字???
作者:
StudyMCU2018
时间:
2017-11-22 16:37
真好使
作者:
liao42
时间:
2018-9-3 13:46
很好的学习了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1