我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 795|回复: 9

LCD1602液晶显示带汉字的万年历程序

[复制链接]

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
发表于 2021-6-26 02:12:51 | 显示全部楼层 |阅读模式
[paragraph]

LCD1602液晶显示带汉字的万年历程序





#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
#define port P0
uchar table[]="I love you!";
uchar table1[]="Shang Hong Rui!";
uchar table2[]="LI ZHEN WEI!" ;
uchar table3[]="> > > > > > > > ";
uchar num;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/********************************************
   1ms 为基本单位的延时函数
********************************************/
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
/********************************************
   读取lcd1602状态
********************************************/
read()
{
  uchar temp ;
  port=0xff;
  rs=0;
  rw=1;
  e=1;
  temp=port;
  e=0;
  return temp;
}
/********************************************
   检测lcd是否忙碌         小卒整天没事
********************************************/
void busy()
{
  uchar temp;
  do
    {
   temp=read();
}
   
  while((temp&0x80)==0x80);
}
/********************************************
   向 lcd 里写命令
********************************************/
void write_com(uchar com)
{
  busy();
  //delay(2);
  port=com;
  //busy();
  rs=0;
  rw=0;
  e=1;
  e=0;
}/********************************************
   向 lcd 里写数据
********************************************/
void write_data(uchar dat)
{
  busy();
  //delay(2);
  port=dat;
  //busy();
  rs=1;
  rw=0;
  e=1;
  e=0;
}
/********************************************
   初始化lcd
********************************************/
void init()
{
write_com(0x06) ;//显示地址递增,即写一个数据后,显示位置右移一位
write_com(0x0e) ;//开显示,有光标,光标不闪
write_com(0x38) ;//8位数据,双列,5*7字形
write_com(0x01) ;//清屏
}
/**********************************************
   主程序 实现显示
***********************************************/
main()
{
init();
write_com(0x80+0x02);
for(num=0;num<11;num++)
{
    write_data(table[num]);
delay(150);
}
//busy();
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
    write_data(table1[num]);
delay(150);
}
write_com(0x01); //清屏
write_com(0x80+0x15);
for(num=0;num<12;num++)
{
    write_data(table2[num]);
delay(5);
}
for(num=0;num<20;num++)
{
    //write_com(0x1c) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向左移动
write_com(0x18) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向右移动
delay(120);
}
//busy();
delay(50);
write_com(0x01); //清屏     
write_com(0x80+0x54);
for(num=0;num<16;num++)
{
    write_data(table3[num]);
delay(5);
}

for(num=0;num<20;num++)
{
    //write_com(0x1c) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向左移动
write_com(0x18) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向右移动
delay(120);
}
delay(50);
write_com(0x01); //清屏
write_com(0x80+0x15);
for(num=0;num<12;num++)
{
    write_data(table2[num]);
delay(5);
}
write_com(0x80+0x54);
for(num=0;num<16;num++)
{
    write_data(table3[num]);
delay(5);
}

for(num=0;num<19;num++)
{
    write_com(0x1c) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向左移动
//write_com(0x18) ; //显示地址递增,即写一个数据后,显示位置右移一位 整屏向右移动
delay(120);
}
  while(1);
}


/*0000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000*/
#include "reg51.h"
#define uchar unsigned char
#define uint unsigend int
#define port P0
uchar table[]="0123456789";
uchar miaog=0,miaos=1,feng=1,fens=1,shig=1,shis=1;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;

/***********************************
  ***00000  5*7  -> 0xff
  *****0** /5*8     0x40
  *****0**    0x40  ----> I
  *****0**    0x40  ---->
  *****0**    0x40
  *****0**    0x40
  ***00000    0x1f
  添加自己的自定义字符
***********************************/
code uchar ziku[]=
{
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00, //汉字“日”
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //汉字“月”
0x01,0x02,0x03,0x05,0x09,0x03,0x00,0x00, //汉字“年”左半部
0x00,0x00,0x1e,0x08,0x08,0x1e,0x08,0x08  //汉字“年”右半部
};

/*******************************
   读取lcd1602状态  
*******************************/
uchar lcd_readcom()
{
  uchar temp;
  e=0;
  port=0xff;
  rs=0;
  rw=1;
  e=1;
  temp=port;
  e=0;
  return temp;
}
/***************************************
   检测 lcd 是否忙碌         小卒整天没事
***************************************/
check_busy()
{
   uchar temp;
   do{
   temp=lcd_readcom();
     }while((temp&0x80)==0x80);
}
/*****************************************
      向lcd里写命令
*****************************************/
void lcd_writecom(uchar dat)
{
check_busy();
e=0;
port=dat;
rs=0;
rw=0;
e=1;
e=0;
}
/***************************************
   读取lcd对应地址数据
*****************************************/
uchar lcd_readdat()
{
  uchar temp;
  check_busy();
  e=0;
  port=0xff;
  rs=1;
  rw=1;
  e=1;
  temp=port;
  e=0;
  return temp;
}
/****************************************
       向lcd里写数据
****************************************/
void lcd_writedat(uchar dat)
{
check_busy();
e=0;
port=dat;
rs=1;
rw=0;
e=1;
e=0;
}
/****************************************
     向lcd写字符串
*****************************************/
void lcd_gets(char *dat)
{
while(*dat!=0)
{

lcd_writedat(*dat);
dat++;
}
}
/*****************************************
      确定要写的位子即x y 坐标
******************************************/
void lcd_xy(uchar x,uchar y)
{
switch(y)
{
  case 0:lcd_writecom(0x80+x);break;//第一行第X个位置
  case 1:lcd_writecom(0xc0+x);break;//0xc0==0x80+0x50 第二行第X个位置
  case 2:lcd_writecom(0x94+x);break;//
  case 3:lcd_writecom(0xd4+x);break;//4*20
}
}
/****************************************************
单行显示才有5*10  其他5*8 MODE=1 5*8  MODE=0 5*10
****************************************************/
add_custom_word(uchar *dat,uchar len,uchar mode)
{
  uchar n,m;
  for(n=0;n     {
  if(mode)
  {
   lcd_writecom(0x40+8*n);
    for(m=0;m<8;m++)
       {
    lcd_writedat(*dat);
     dat++;
    }
   }
   else
    {
    lcd_writecom(0x40+10*n);
    for(m=0;m<10;m++)
       {
    lcd_writedat(*dat);
     dat++;
    }
   }
}
}
/********************************************
   初始化lcd
********************************************/
void lcd_init()
{
lcd_writecom(0x01) ;//清屏
lcd_writecom(0x03) ;
lcd_writecom(0x3c) ;
lcd_writecom(0x40) ;
lcd_writecom(0x0c) ;
  add_custom_word(ziku,4,1); //初始化自定义字符
}
/********************************************
   1ms 为基本单位的延时函数
********************************************/
void delay(uchar z)
{
  uchar x,y,a;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--)
   for(a=1;a>0;a--) ;
}

/**********************************************
   主程序 实现显示
***********************************************/
main()
{
lcd_init();

//lcd_xy(0,0);
//lcd_gets("  I LOVE YOU");
//lcd_xy(0,1);
//lcd_gets("Shang Hong Rui");
lcd_xy(2,0) ;
lcd_gets("2011");
lcd_xy(6,0) ;
lcd_writedat(2);
lcd_xy(7,0);
lcd_writedat(3);
lcd_xy(8,0) ;
lcd_gets("03");
lcd_xy(10,0);
lcd_writedat(1);
lcd_xy(11,0) ;
lcd_gets("06");
lcd_xy(13,0);
lcd_writedat(0);

lcd_xy(3,1) ;
lcd_gets("0");
lcd_xy(4,1) ;
lcd_gets("0");
lcd_xy(5,1) ;
lcd_gets(":");
lcd_xy(6,1) ;
lcd_gets("0");
lcd_xy(7,1) ;
lcd_gets("0");
lcd_xy(8,1) ;
lcd_gets(":");
lcd_xy(9,1) ;
lcd_gets("0");
lcd_xy(10,1) ;
lcd_gets("0");

while(1)
{

  //for(m=0;m<10;m++)
  lcd_xy(10,1);
  lcd_writedat(table[miaog]); //秒个位
  delay(1000);
  miaog++;

  if(miaog==10)
  {
    miaog=0;
lcd_xy(9,1);
    lcd_writedat(table[miaos]);  //秒十位
miaos++;
if(miaos==6)
{                     
  
   miaos=0;
   lcd_xy(7,1);
   lcd_writedat(table[feng]); //分个位
   feng++;
   if(feng==10)
    {
      feng=0;
   lcd_xy(6,1);
   lcd_writedat(table[fens]);  //分十位
   fens++;
   if(fens==6)
    {
     fens=0;
   lcd_xy(4,1);
   lcd_writedat(table[shig]);  //时个位
   shig++;
   if(shig==10)
    {
      shig=0;
      lcd_xy(3,1);
      lcd_writedat(table[shis]); //时十位
      shis++;
      if(shis==6)
       {
      shis=0;
    }
   

    }
    }
    }
}
  }
}

//lcd_xy(0,0);
//lcd_writedat(0);//自定义字符使用,0表示第一个字 ,1表示第二个字,依此类推
//lcd_xy(15,0);
//lcd_writedat(3); //自定义字符使用

}









来源于网络,仅供个人学习
回复

使用道具 举报

该用户从未签到

1

主题

6740

回帖

3

积分

二级逆天

积分
3

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

发表于 2021-6-26 07:33:01 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    22

    主题

    582

    回帖

    859

    积分

    二级逆天

    积分
    859

    终身成就奖

    发表于 2021-6-26 08:58:49 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 58 天

    [LV.5]常住居民I

    51

    主题

    3830

    回帖

    2973

    积分

    二级逆天

    积分
    2973

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2021-6-26 09:09:44 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    10

    主题

    3481

    回帖

    11

    积分

    二级逆天

    积分
    11

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2021-6-26 09:56:58 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-29 20:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    48

    主题

    6492

    回帖

    7755

    积分

    二级逆天

    积分
    7755

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2021-6-26 10:09:23 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-29 20:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    48

    主题

    6492

    回帖

    7755

    积分

    二级逆天

    积分
    7755

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2021-6-26 10:09:47 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    77

    主题

    359

    回帖

    0

    积分

    二级逆天

    积分
    0

    社区居民终身成就奖金点子奖

    QQ
     楼主| 发表于 2021-7-17 01:40:59 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    77

    主题

    359

    回帖

    0

    积分

    二级逆天

    积分
    0

    社区居民终身成就奖金点子奖

    QQ
     楼主| 发表于 2021-7-20 01:34:49 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    51

    主题

    545

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2021-8-15 06:29:52 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表