欢迎来到51自学网!

51自学网

当前位置: 主页 > 软件教程 > 单片机教程 >

LCD1602液晶显示带汉字的万年历程序(51单片机)(2)

时间:2018-08-21 14:41来源:网络整理 作者:51自学网
#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=P

#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<len;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--) ;
}

(责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容