滚动条目 1602 液晶显示纵向.docx

上传人:b****2 文档编号:24437807 上传时间:2023-05-27 格式:DOCX 页数:23 大小:21.72KB
下载 相关 举报
滚动条目 1602 液晶显示纵向.docx_第1页
第1页 / 共23页
滚动条目 1602 液晶显示纵向.docx_第2页
第2页 / 共23页
滚动条目 1602 液晶显示纵向.docx_第3页
第3页 / 共23页
滚动条目 1602 液晶显示纵向.docx_第4页
第4页 / 共23页
滚动条目 1602 液晶显示纵向.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

滚动条目 1602 液晶显示纵向.docx

《滚动条目 1602 液晶显示纵向.docx》由会员分享,可在线阅读,更多相关《滚动条目 1602 液晶显示纵向.docx(23页珍藏版)》请在冰豆网上搜索。

滚动条目 1602 液晶显示纵向.docx

滚动条目1602液晶显示纵向

滚动条目1602液晶显示,纵向

/*

51mcu液晶时钟(ZYB-MCU51-LCD-A0)

通过一个跳线进行1602和12864之单进行切换

本单片机具有完整的时间初始化和时间日期调校功能。

设计制作:

Nathen.zhang@

lcd12864部分还未完成,仅能显示欢迎信息。

*/

#include

#include

#include  //使用_nop_()将会用到此头文件

#defineucharunsignedchar

#defineuintunsignedint

#defineucharunsignedchar

#defineuintunsignedint

//跳线设置   1-2则key=1(lcd12864)  2-3则key=0(lcd1602);

sbitkey=P0^4;

//ds1302寄存器宏定义

#defineWRITE_SECOND0x80

#defineWRITE_MINUTE0x82

#defineWRITE_HOUR  0x84

#defineWRITE_DATE0x86

#defineWRITE_MONTH0x88

#defineWRITE_DAY  0x8A

#defineWRITE_YEAR  0x8C

#defineREAD_SECOND  0x81

#defineREAD_MINUTE0x83

#defineREAD_HOUR   0x85

#defineREAD_DATE  0x87

#defineREAD_MONTH0x89

#defineREAD_DAY   0x8B

#defineREAD_YEAR  0x8D

#defineWRITE_PROTECT0x8E

#defineucharunsignedchar

#defineL10x80   //液晶显示第一行起始地址然后再加上所有位序号(从0开始)

#defineL20xc0   //液晶显示第二行起始地址0x80+0x40

#defineDATAP3

#definepos_year  L1+0

#definepos_monthL1+3

#definepos_date  L1+6

#definepos_day   L1+9

#definepos_hour  L2+0

#definepos_minuteL2+3

#definepos_secL2+6

//位寻址寄存器定义

sbitACC_7=ACC^7;

//管脚定义

sbitsclk=P0^2;//DS1302时钟信号7脚

sbitclk_io=P0^1;   //DS1302数据信号  6脚

sbitclk_rst=P0^0;  //DS1302片选  5脚

sbitRS1602=P1^5;

sbitRW1602=P1^6;

sbitE1602=P1^7;

//功能按键定义

sbitfunc_key=P2^2;

sbitinc_key=P2^1;

sbitdec_key=P2^0;

//地址、数据发送子程序

voiddelay(uchar);

voidwrite1602_comd(uchar);

voidwrite1602_data(uchar);

voidinit1602_lcd();

voidkeyscan();

voidInit_DS1302();   

voidread_real_time();

uchari,j,flag=0;

ucharcodetable1[]="--/";

ucharcodetable2[]=":

:

";

//LCD12864相关函数

//数据线使用P3

#defineDATA   P3  

//控制线使用P1

#defineCONTROLP1

#defineRS12864  0    //并行的指令数据选择信号

#defineRW12864  1    //并行的读写信号     

#defineE12864   2    //并行的使能信号  

#definePSB128643    //并/串行接口选择       12864LCD分为字符型和点阵型,字符型即内带中文字库的有PSB串并选择引脚。

#defineRST128645    //复位低电平有效     

#defineSETB(x,y)(x|=(1<

#defineCLRB(x,y)(x&=(~(1<

#defineCHKB(x,y)(x&(1<

voidlcd12864_init(void);

voidclr_lcd12864(void);

voidsend12864_com(unsignedcharcmd);

voidsend12864_data(unsignedchardat);

voidchek12864_busy(void);

voidset12864_xy(unsignedcharxpos,unsignedcharypos);

voidprint12864(unsignedcharx,unsignedchary,char*str);

voidprint12864str(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedchark);

unsignedcharcodebuf[4]={0xbb,0xb6,0xd3,0xad};//欢迎

/********************测忙碌**********************/

//测忙碌子程序

//RS=0,RW=1,E=H,D0-D7=状态字

/************************************************/

voidchek12864_busy(void)

{unsignedchartemp1;//状态信息(判断是否忙)

  CLRB(CONTROL,RS12864);   //RS=0;

  SETB(CONTROL,RW12864);   //RW=1;

  SETB(CONTROL,E12864);   //E=1;

  do{temp1=DATA;DATA=0xFF;}while(temp1&0x80);

  SETB(CONTROL,E12864);  //E=1;

  DATA=0xFF;

}

/********************写命令**********************/

//写命令子程序

//

/************************************************/

voidsend12864_com(unsignedcharcmd)/*写命令*/

{

   chek12864_busy();

   CLRB(CONTROL,RS12864);//RS=0;

   CLRB(CONTROL,RW12864);//RW=0;

   DATA=cmd;

   SETB(CONTROL,E12864);//E=1;

   CLRB(CONTROL,E12864);//E=0;

}

/********************写数据**********************/

//写数据子程序

//

/************************************************/

voidsend12864_data(unsignedchardat)

{

chek12864_busy();

SETB(CONTROL,RS12864);//RS=1;

CLRB(CONTROL,RW12864);//RW=0;

DATA=dat;

SETB(CONTROL,E12864);//E=1;

CLRB(CONTROL,E12864);//E=0;

}

/********************初始化**********************/

//复位、通讯方式选择

/************************************************/

voidlcd12864_init(void)

{

   SETB(CONTROL,RST12864);  //复位RST=1

   SETB(CONTROL,PSB12864);  //通讯方式为并口PSB=1

         //send12864_com(0x34);//34H--扩充指令操作

   send12864_com(0x30);//功能设置,一次送8位数据,基本指令集

   send12864_com(0x0C);//0000,1100整体显示,游标off,游标位置off

   send12864_com(0x01);//0000,0001清DDRAM

   send12864_com(0x02);//0000,0010DDRAM地址归位

   send12864_com(0x80);//1000,0000设定DDRAM7位地址000,0000到地址计数器AC

}

/*******************************************************************/

//         设置显示位置   xpos(1~16),tpos(1~4)

/*******************************************************************/

voidset12864_xy(unsignedcharxpos,unsignedcharypos)

{

switch(ypos)

{

  case1:

   send12864_com(0X80|xpos);break;

  case2:

   send12864_com(0X90|xpos);break;

  case3:

   send12864_com(0X88|xpos);break;

  case4:

   send12864_com(0X98|xpos);break;

  default:

break;

}

}

/*******************************************************************/

//         在指定位置显示字符串

/*******************************************************************/

voidprint12864(unsignedcharx,unsignedchary,char*str)

{

   unsignedcharlcd_temp;

   set12864_xy(x,y);

   lcd_temp=*str;

   while(lcd_temp!

=0x00)

   {

       send12864_data(lcd_temp);

       lcd_temp=*(++str);

   }

}

/********************写字符串******************/

//写字符串子程序

//xpos1取0~7共八列,ypos1取0~3共四行。

/**********************************************/

voidprint12864str(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedchark)

{

unsignedcharn;

    switch(ypos)

   {case1:

xpos|=0x80;break;        //第一行

     case2:

xpos|=0x90;break;        //第二行

     case3:

xpos|=0x88;break;        //第三行

     case4:

xpos|=0x98;break;        //第四行

     default:

break;

    }

     send12864_com(xpos);                                   //此处的Xpos已转换为LCM的显示寄存器实际地址

     for(n=0;n

    {

     send12864_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字

     }

}

/********************清屏************************/

//清屏

/************************************************/

voidclr_lcd1286412864(void)

{

  send12864_com(0x01);

}

/********以下为液晶1602子程序*********************/

voidinit1602_lcd()

{

write1602_comd(0x01);

write1602_comd(0x0c);

write1602_comd(0x06);

   write1602_comd(0X3C);//功能设置:

2行显示模式,数据为8位。

还有字体的设置。

write1602_comd(0x80);   //设置第一行地址指针

for(i=0;i<10;i++)  //初始化显示,用于显示格式符

   {

        write1602_data(table1[i]);

   delay(20);

  }

write1602_comd(0Xc0);//设置第二行地址指针

for(j=0;j<8;j++)

   {

        write1602_data(table2[j]);

   delay(20);

       }

i=0;j=0;  

}

voiddelay(ucharz)

{

uchari,j;

for(j=z;j>0;j--)  

for(i=125;i>0;i--);

}

voidwrite1602_comd(ucharcom)

{

RS1602=0;

DATA=com;

RW1602=0;

delay(5);

E1602=1;

delay(5);

E1602=0;

}

voidwrite1602_data(uchardate)

{

RS1602=1;

DATA=date;

RW1602=0;

delay(5);

E1602=1;

   delay(5);

E1602=0;

}

/********以上为液晶子程序******************/

/********以下为DS1302子程序*******************************/

voidwriteds1602_byte(uchardat)   

{

uchari,dat_w;

dat_w=dat;       //数据送给变量dat_w

for(i=0;i<8;i++)

{

   clk_io=0;           //数据线先拉低

   if(dat_w&0x01)   //如果是1

   {clk_io=1;}

   else             //如果是0

   {clk_io=0;}

   dat_w=dat_w>>1;//右移一位

   sclk=0;         //先拉低时钟信号

   sclk=1;         //拉高时钟信号

}   

sclk=0;           //写一字节完毕,拉低时钟信号

}

//-------------------------------

//----从DS1302读一字节(下降沿有效)--------

//----读出数据时从低位0位到高位7-----------

//-------------------------------

ucharreadds1602_byte()

{

uchari,k;

k=0;

for(i=0;i<8;i++)

{

k=k>>1;

if(clk_io)

{k=k|0x80;}

sclk=1;         //先拉低时钟信号

sclk=0;

}

sclk=0;

return(k);

}

//-------------------------------

//----指定地址写一数据--------

//-------------------------------

voidWrite1602(ucharadd,uchardat)//dat为十进制数

{

clk_rst=0;

sclk=0;

clk_rst=1;                             //拉高RST

writeds1602_byte(add);                 //写地址

writeds1602_byte((dat/10<<4)|(dat%10));//DS1302中的时间数据是BCD码形式

sclk=0;

clk_rst=0;

}

//-------------------------------

//----指定地址读出一数据------

//-------------------------------

ucharRead1302(ucharadd)

{

uchartemp,dat1,dat2;

clk_rst=0;

sclk=0;

clk_rst=1;

writeds1602_byte(add);

temp=readds1602_byte();//读取的数据为16进制

sclk=0;             //读取完毕,拉低SCLK

clk_rst=0;             //拉低SCLK

dat1=temp/16;       //16进制转成BCD

dat2=temp%16;

temp=dat1*10+dat2;//转换成10进制数字

return(temp);   

}

//初始化DS1302

voidInit_DS1302(void)   

{   //设置初始化时间

      Write1602(WRITE_PROTECT,0X00);delay

(1);//禁止写保护

    Write1602(WRITE_SECOND,0x00);delay

(1);  //秒位初始化

      Write1602(WRITE_MINUTE,0x00);delay

(1);//分钟初始化

      Write1602(WRITE_HOUR,0x0C);delay

(1);//小时初始化

   Write1602(WRITE_DAY,0x01);delay

(1);  //星期初始化

      Write1602(WRITE_DATE,0x12);delay

(1);//日初始化

      Write1602(WRITE_MONTH,0x05);delay

(1);//月初始化

   Write1602(WRITE_YEAR,0x09);delay

(1);//年初始化

      Write1602(WRITE_PROTECT,0x80);delay

(1);//允许写保护

}

/***************以下为:

读写年、月、日、时、分、秒的子程序*******************/

/*不包括星期在内

功能:

从DS1302中读出时间和日期,并在1602液晶上显示出来

三个参数分别为:

1.读时间日期存储器地址2.写入的十位光标地址3.个位光标地址*/

voidread_write_date_time(ucharcom_addr,cusr_addr)

{

ucharhour_wei,ge_wei,call_data;

  Write1602(WRITE_PROTECT,0x00);delay

(1);//禁止写保护

  call_data=Read1302(com_addr);//秒

  hour_wei=call_data/10;

  ge_wei=call_data%10;

  write1602_comd(cusr_addr);//设置第二行地址指针

  write1602_data(hour_wei+0X30);

  write1602_data(ge_wei+0X30);

  Write1602(WRITE_PROTECT,0x80);delay

(1);//允许写保护

}

voidwrite_lcd(ucharcusr_addr,time_data)

{

ucharhour_wei,ge_wei;

  hour_wei=time_data/10;

  ge_wei=time_data%10;

  write1602_comd(cusr_addr);//设置第二行地址指针

  write1602_data(hour_wei+0X30);

  write1602_data(ge_wei+0X30);

}

voidread_real_time()

{

ucharxq;

  read_write_date_time(READ_HOUR,L2);//小时

  read_write_date_time(READ_MINUTE,L2+3);

  read_write_date_time(READ_SECOND,L2+6);

  read_write_date_time(READ_YEAR,L1);

  read_write_date_time(READ_MONTH,L1+3);

  read_write_date_time(READ_DATE,L1+6);//日期

  xq=Read130

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1