lcd12864万年历程序

HDL语言及源代码

6人已加入

描述

  lcd12864带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符 集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字。 也可完成图形显示。低电压低功耗是其又一显著特点。

  lcd12864万年历程序

  #include《reg52.H》#include《intrins.h》#include《math.h》

  ////////////////////////////////////////DS18B20#defineucharunsignedchar#defineuintunsignedintsbitDQ=P1^0;

  //定义DS18B20的单总线

  #defineLcd_BusP0

  sbitLCD_RS=P2^7;//数据/命令选择sbitLCD_RW=P2^6;//读写控制sbitLCD_EN=P2^5;//片选信号

  #defineLCD_DATAP0//8bit数据线#defineLOW0#defineHIGH1

  //初始化指令

  #defineCLEAR_SCREEN0x01//清屏指令:清屏且AC值为00H#defineAC_INIT0x02//将AC设置为00H。且游标移到原点位置

  #defineCURSE_ADD0x06//设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)

  #defineFUN_MODE0x30//工作模式:8位基本指令集

  #defineDISPLAY_ON0x0c//显示开,显示游标,且游标位置反白#defineDISPLAY_OFF0x08//显示关

  #defineCURSE_DIR0x14//游标向右移动:AC=AC+1

  #defineSET_CG_AC0x40//设置AC,范围为:00H~3FH

  #defineSET_DD_AC0x80

  #defineFUN_MODEK0x36//扩展指令集,8位指令

  #defineX1address0x80//上半屏X轴起始地址

  #defineX2address0x88//下半屏X轴起始地址

  #defineYaddress0x80//Y轴起始地址

  #defineSet_Column0x40#defineSet_Page0xB8

  ucharcodeshu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

  ucharcodexingqi[]=“星期”;

  ucharcodehanzishu[]=“一二三四五六日”;unsignedcharTempData=0;doubleDS18B20Data;uintjiemian=0;

  //////////////////////////////////////////DS1302sbitDS1302_RST=P1^4;sbitDS1302_IO=P1^3;sbitDS1302_SCK=P1^2;

  unsignedchartable[]={0X00,0X18,0X0c,0X15,0X06,0X01,0X0a};//0s24min12hour14ri5yue5zhou2010nianunsignedchardatatable1[7];

  //ucharcodetable2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};ucharcodeshuzi[]={

  0x00,

  0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,};

  unsignedcharaa,bb;

  ucharmiaoge,miaoshi,fenge,fenshi,shige,shishi,rige,rishi,yuege,yueshi,zhou,niange,nianshi;

  ucharshezhinum=0;

  //unsignedcharshi,ge;

  ////////////////////////////////////////////////键盘扫描

  sbitkey_mnue=P3^7;

  sbitkey_jia=P2^0;

  sbitkey_jian=P2^1;

  sbitkey_enter=P2^2;

  ucharkey_number=0;

  //intnian,yue,ri,shi,fen;

  /////////////////////////////////////////////////红外

  sbitHW_IRQ=P3^2;//定义38KHz一体化红外接收头与

  CPU的连接unsignedchar

  DT;

  staticunsignedchardataIRCode[3],IRCON,IRCON2;

  //////////////////////////////////////////////////蜂鸣器sbitBEEP=P1^1;

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

  *函数名称:DS18B20_Delay()

  *功能:DS18B20软件延时专用

  *入口参数:count延时参数,值越大,延时越长

  *出口参数:无

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

  voidDS18B20_Delay(uintcount)//延时函数{

  while(count--);}

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

  *函数名称:DS18B20_Init()*功能:DS18B20初始化*入口参数:无

  *出口参数:返回值为1则初始化成功*返回值为0则初始化失败

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

  ucharDS18B20_Init(void){

  ucharx=0;

  DQ=1;

  //DQ复位DS18B20_Delay(8);

  //稍做延时

  DQ=0;

  //单片机将DQ拉低DS18B20_Delay(80);//精确延时,大于480usDQ=1;

  //拉高总线DS18B20_Delay(14);//稍做延时后

  x=DQ;//若x=0则初始化成功,若x=1则

  初始化失败

  DS18B20_Delay(20);

  return(~x);}

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

  *函数名称:DS18B20_Read1Byte()*功能:从DS18B20读一个字节*入口参数:无

  *出口参数:从DS18B20读出的一个字节

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

  ucharDS18B20_Read1Byte(void){

  uchari=0;uchardat=0;for(i=8;i》0;i--){

  DQ=0;//给脉冲信号dat》》=1;DQ=1;

  //给脉冲信号

  if(DQ)dat|=0x80;DS18B20_Delay(4);}

  return(dat);}

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

  *函数名称:DS18B20_Write1Byte()

  *功能:向DS18B20写一个字节

  *入口参数:dat要写入DS18B20的一字节数据

  *出口参数:无

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

  voidDS18B20_Write1Byte(uchardat){

  uchari=0;

  for(i=8;i》0;i--){

  DQ=0;

  DQ=dat&0x01;DS18B20_Delay(5);

  DQ=1;dat》》=1;}}

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

  *函数名称:Read_Disp_Temperature()*功能:读取并显示温度*入口参数:无*出口参数:无

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

  doubleRead_Disp_Temperature(void){

  uinta=0,b=0,c=0,d=0,e=0,t=0;doublett=0;

  DS18B20_Init();

  DS18B20_Write1Byte(0xCC);//跳过读序号列号的操作

  DS18B20_Write1Byte(0x44);//启动温度转换

  DS18B20_Init();

  DS18B20_Write1Byte(0xCC);//跳过读序号列号的操作

  DS18B20_Write1Byte(0xBE);//读取温度寄存器

  a=DS18B20_Read1Byte();

  b=DS18B20_Read1Byte();

  t=b;

  t《《=8

  t=t|a;

  //tt=t*0.0625;

  returnt;

  }

  //*****************************************************************//函数名称:delay(uintt)延时函数。对于12M晶振大约延时1ms//入口参数:t//出口参数:无

  //*****************************************************************voiddelay(uintt){

  uinti;while(t--){

  for(i=0;i《125;i++);}}

  ////////////////////////////////////////////////////////////////蜂鸣器鸣叫voidFM(){

  BEEP=0;delay(100);BEEP=1;}

  //*****************************************************************//函数名称:write_cmd(uintlcd_cmd)写指令//入口参数:lcd_cmd//返回参数:无

  //*****************************************************************voidWriteCmd12864(ucharlcd_cmd){

  LCD_RS=LOW;LCD_RW=LOW;LCD_EN=HIGH;

  LCD_DATA=lcd_cmd;LCD_EN=LOW;}

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

  //函数名称:write_data(uintlcd_data)写数据

  //入口参数:current_data

  //返回参数:无

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

  voidWriteData12864(ucharlcd_data)

  {

  LCD_RS=HIGH;

  LCD_RW=LOW;

  LCD_EN=HIGH;

  LCD_DATA=lcd_data;

  LCD_EN=LOW;}

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

  函数名称:Write12864(uint)写数据

  入口参数:cmd,data

  返回参数:无

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

  voidWrite12864(ucharlcd_cmd,ucharlcd_data)

  {

  WriteCmd12864(lcd_cmd);

  WriteData12864(lcd_data);

  }

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

  //函数名称:ReadBusy()判忙

  //入口参数:无

  //返回参数:

  “1”忙;

  “0”不忙

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

  voidReadBusy(void)

  {

  uchari=5;

  while(i--);}

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

  函数名称:LcdInit()初始化

  入口参数:无

  返回参数:无

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

  voidLcdInit()

  {

  delay(50);

  WriteCmd12864(FUN_MODE);delay(1);

  //WriteCmd12864(FUN_MODE);//delay(1);

  WriteCmd12864(DISPLAY_ON);delay(1);

  //WriteCmd12864(AC_INIT);//delay(1);

  WriteCmd12864(CLEAR_SCREEN);delay(20);

  WriteCmd12864(CURSE_ADD);delay(1);}

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

  函数名称:LcdClear()清屏

  入口参数:无

  返回参数:无

  ****************************************************************/voidLcdClear(void){

  ReadBusy();

  WriteCmd12864(CLEAR_SCREEN);delay(3);}

  voidwrite_date(uchardate){

  LCD_RS=1;

  LCD_RW=0;

  LCD_EN=0;

  P0=date;delay(5);

  LCD_EN=1;delay(5);

  LCD_EN=0;

  }

  voidinput1byte(unsignedchardate)

  {

  unsignedchari;for(i=0;i《8;i++)

  {

  DS1302_IO=date&0x01;DS1302_SCK=0;DS1302_SCK=1;date》》=1;}}

  unsignedcharread1byte(){

  unsignedchari,date=0;for(i=0;i《8;i++){

  date》》=1;

  DS1302_SCK=1;DS1302_SCK=0;DS1302_IO=1;

  if(DS1302_IO)date=date|0x80;}

  returndate;}

  voidwrite1302(unsignedcharaddress,unsignedchardate){

  DS1302_RST=0;DS1302_SCK=0;DS1302_RST=1;input1byte(address);input1byte(date);DS1302_RST=0;DS1302_SCK=1;}

  unsignedcharread1302(unsignedcharaddress){

  unsignedcharucdat;

  DS1302_RST=0;

  DS1302_SCK=0;

  DS1302_RST=1;

  input1byte(address);

  ucdat=read1byte();

  DS1302_RST=0;

  DS1302_SCK=1;

  returnucdat;

  }

  voidset1302(unsignedcharaddress,unsignedchartable[],unsignedcharn){

  unsignedchari;

  write1302(0x8e,0x00);for(i=0;i《n;i++){

  write1302(address,table[i]);address+=2;}

  write1302(0x8e,0x80);}

  voidread1302xulie(unsignedcharaddress,unsignedcharn){

  unsignedchari;for(i=0;i《n;i++){

  table1[i]=read1302(address);address+=2;}}

  voidinit1302(){

  DS1302_RST=0;DS1302_SCK=0;

  write1302(0x8e,0x00);//取消写保护

  write1302(0x90,0x00);//清零涓流充电寄存器

  }

  voidchuli()

  {

  unsignedcharaa,bb,i;

  for(i=0;i《7;i++)

  {

  aa=table[i]/10;

  bb=table[i]%10;

  table[i]=(aa《《4)|bb;

  }

  }

  voidchuli2(unsignedcharz){

  aa=table1[z]&0x0f;

  //年

  bb=(table1[z]&0xf0)》》4;table1[z]=bb*10+aa;}

  voidjiashijian(){

  switch(key_number)

  {

  case0:break;case1:table1[6]++;

  //if(table1[6]==10)table1[6]=5;

  write1302(0x8e,0x00);

  write1302(0x8c,table[6]);

  write1302(0x8e,0x80);_nop_();

  _nop_();break;

  case2:table1[4]++;

  if(table1[4]==13)table1[4]=1;

  write1302(0x8e,0x00);

  write1302(0x88,table1[4]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  case3:table1[3]++;

  if(table1[3]==31)table1[3]=1;

  write1302(0x8e,0x00);

  write1302(0x86,table1[3]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  case4:table1[5]++;

  if(table1[5]==8)table1[5]=1;

  write1302(0x8e,0x00);

  write1302(0x8a,table1[5]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  case5:table1[2]++;

  if(table1[2]==24)table1[2]=0;

  write1302(0x8e,0x00);

  write1302(0x84,table1[2]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;case6:

  table1[1]++;

  if(table1[1]==61)table1[1]=0;

  write1302(0x8e,0x00);

  write1302(0x82,table1[1]);

  table1[0]=0;

  write1302(0x80,0);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  }

  }

  voidjianshijian(){

  switch(key_number)

  {

  case0:break;case1:table1[6]--;

  if(table1[6]》99)table1[6]=99;

  write1302(0x8e,0x00);

  write1302(0x8c,table1[6]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  case2:table1[4]--;

  if(table1[4]==0)table1[4]=12;

  write1302(0x8e,0x00);

  write1302(0x88,table1[4]);

  write1302(0x8e,0x80);_nop_();

  _nop_();

  break;

  case3:table1[3]--;

  if(table1[3]==0)table1[3]=31;

  write1302(0x8e,0x00);

  write1302(0x86,table1[3]);

  write1302(0x8e,0x80);

  _nop_();

  _nop_();

  break;

  case4:table1[5]--;

  if(table1[5]==0)table1[5]=7;

  write1302(0x8a,table1[5]);write1302(0x8e,0x80);_nop_();_nop_();break;case5:

  table1[2]--;

  if(table1[2]==-1)table1[2]=0;write1302(0x8e,0x00);write1302(0x84,table1[2]);write1302(0x8e,0x80);_nop_();

  _nop_();break;case6:

  table1[1]--;

  if(table1[1]》60)table1[1]=60;write1302(0x8e,0x00);write1302(0x82,table1[1]);table1[0]=0;

  write1302(0x80,0);write1302(0x8e,0x80);_nop_();

  _nop_();break;

  }

  }keyscan(){

  if(key_mnue==0){

  delay(10);

  if(key_mnue==0){FM();

  key_number++;}

  if(key_number==7)

  {FM();

  key_number=1;}}

  while(!key_mnue);if(key_jia==0){

  delay(10);if(key_jia==0){

  FM();

  jiashijian();}}

  while(!key_jia);if(key_jian==0){

  delay(10);

  if(key_jian==0){

  FM();

  jianshijian();}

  }

  while(!key_jian);if(key_enter==0){

  delay(10);

  if(key_enter==0){FM();

  key_number=0;}}

  while(!key_enter);

  jiemian++;

  if(jiemian==15){

  ReadBusy();jiemian=0;

  switch(key_number)//调时间时界面显示{

  //case0:WriteCmd12864(0x08);

  break;case1:WriteCmd12864(0x83);

  ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;

  case2:WriteCmd12864(0x84);

  ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;

  case3:WriteCmd12864(0x85);

  ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;

  case4:WriteCmd12864(0x95);

  ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;

  case5:WriteCmd12864(0x8a);

  ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;

  case6:WriteCmd12864(0x8b);

  ReadBusy();

  WriteData12864(0x3a);ReadBusy();

  WriteData12864(0x5f);ReadBusy();

  WriteData12864(0x5f);break;}}}

  voidmain(void){

  uinta=0,b=0,c=0,t=0,tt;ucharerhang=0;

  TMOD=0x01;

  //定时器0方式1

  EA=1;//允许CPU中断IT0=1;

  //INT0下降沿有效EX0=1;

  //开INT0中断

  init1302();//chuli();

  //set1302(0x80,table,7);

  LcdClear();

  while(1){

  LcdInit();

  //液晶初始化

  LcdClear();

  delay(100);

  WriteCmd12864(FUN_MODE);

  LcdClear();

  ReadBusy();

  while(1){

  tt=Read_Disp_Temperature();

  DS18B20Data=tt*0.0625;

  t=DS18B20Data*10+0.5;

  //放大10倍

  输出并四舍五入

  a=t/100;

  //十位b=t/10-a*10;//个位//DS_20[1]=0x24;c=t-a*100-b*10;//小数位

  read1302xulie(0x81,7);

  chuli2(0);

  //miaomiaoshi=table1[0]/10;

  miaoge=table1[0]%10;

  chuli2(1);

  //minfenshi=table1[1]/10;

  fenge=table1[1]%10;

  chuli2(2);

  //hourshishi=table1[2]/10;

  shige=table1[2]%10;

  chuli2(3);

  //ririshi=table1[3]/10;

  rige=table1[3]%10;

  chuli2(4);

  //yueyueshi=table1[4]/10;

  yuege=table1[4]%10;

  chuli2(5);

  //xingqi

  zhou=table1[5];

  chuli2(6);

  //年nianshi=table1[6]/10;

  niange=table1[6]%10;

  ReadBusy();

  WriteCmd12864(0x9b);

  //第四行显示ReadBusy();

  WriteData12864(shu[a]);

  ReadBusy();

  WriteData12864(shu[b]);

  //WriteCmd12864(0x9d);

  ReadBusy();

  WriteData12864(0x2e);

  ReadBusy();

  WriteData12864(shu[c]);

  ReadBusy();

  //WriteCmd12864(0x9e);

  ReadBusy();

  WriteData12864(0x60);

  ReadBusy();

  WriteData12864(0x43);

  ReadBusy();

  keyscan();

  ReadBusy();

  WriteCmd12864(0x92);

  //第二行显示

  ReadBusy();

  for(erhang=0;

  erhang《4;erhang++)

  {

  write_date(xingqi[erhang]);

  ReadBusy();

  }

  WriteCmd12864(0x95);

  ReadBusy();

  for(erhang=0;erhang《2;

  erhang++)

  {

  write_date(hanzishu[erhang+zhou*2-2]);

  ReadBusy();}

  ReadBusy();

  keyscan();

  ReadBusy();

  WriteCmd12864(0x82);

  //第一行显示ReadBusy();

  WriteData12864(shu[2]);

  ReadBusy();

  WriteData12864(shu[0]);

  ReadBusy();

  WriteData12864(shu[nianshi]);

  ReadBusy();

  WriteData12864(shu[niange]);

  //WriteCmd12864(0x9d);

  ReadBusy();

  WriteData12864(shu[yueshi]);

  ReadBusy();

  WriteData12864(shu[yuege]);

  ReadBusy();

  //WriteCmd12864(0x9e);

  ReadBusy();

  WriteData12864(shu[rishi]);

  ReadBusy();

  WriteData12864(shu[rige]);

  ReadBusy();

  keyscan();

  ReadBusy();

  第19页共19页

  WriteCmd12864(0x8a);

  //第三行显示ReadBusy();

  WriteData12864(shu[shishi]);

  ReadBusy();

  WriteData12864(shu[shige]);

  //WriteCmd12864(0x9d);

  ReadBusy();

  WriteData12864(0x3a);

  ReadBusy();

  WriteData12864(shu[fenshi]);

  ReadBusy();

  //WriteCmd12864(0x9e);

  ReadBusy();

  WriteData12864(shu[fenge]);

  ReadBusy();

  WriteData12864(0x3a);

  ReadBusy();

  WriteData12864(shu[miaoshi]);

  ReadBusy();

  //WriteCmd12864(0x9e);

  ReadBusy();

  WriteData12864(shu[miaoge]);

  ReadBusy();

  ReadBusy();

  keyscan();

  ReadBusy();

  ReadBusy();

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分