单片机实现液晶显示两种状态的切换程序

电子说

1.3w人已加入

描述

  硬件电路:51最小系统,没有采用总线方式,直接的I/O形式,包括矩阵键盘,1602液晶,一个数码管,LED4个,蜂鸣器等。

  /////design by HUAZ 2006.8.9

  //单片机液晶秒表计算器完整修改版本

  可以实现两种功能的切换,其他功能自行对照代码研究。4*4矩阵键盘,第一排前三列是实现小时分钟秒的加。第二排前三列是实现小时分钟秒的减。当然还可以通过设置矩阵键盘的键值,来实现加减乘除四则运算,由数码管显示参与运算的数字以及最终的运算结果

  #include《reg51.h》

  #include《stdio.h》

  #include《stdlib.h》

  #include《intrins.h》

  #include《absacc.h》

  #define uchar unsigned char

  #define uint unsigned int

  #define wc 0x8fff

  #define wd 0xdfff

  #define rc 0xbfff

  void displayListChar(unsigned char X, unsigned char Y, uchar DData);

  uchar dispbuf[]={‘’0‘’,‘’1‘’,‘’2‘’,‘’3‘’,‘’4‘’,‘’5‘’,‘’6‘’,‘’7‘’,‘’8‘’,‘’9‘’,‘’:‘’};

  uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,

  0x92,0x82,0xf8,0x80,0x90,0x88,0x83,

  0xc6,0xa1,0x86,0x8e,0x00

  };

  uchar second;

  uchar temp1;

  uchar minute;

  uchar hour;

  uint tcnt,g;

  uchar suanfa;

  bit flag2;

  bit flag1=1;//////控制计算器还是液晶调整的状态灯

  uint i=0,f,m,g,s,t;// for里的计数值,用于循环

  // 用来标记按了什么,如+,-.*,或是/

  sbit P2_0=P2^0;// 定义P2.0口用来,当计算值超过15时,P2.0所对应的灯闪几下

  sbit P2_1=P2^1;// 定义P2.1口用来,当除数为0时,P2.1所对应的灯闪几下

  sbit P2_2=P2^2;

  sbit P2_3=P2^3;

  uint num[4]={0}; //用于记录外面输入的数字

  uint Tablenum;

  sbit P3_4=P3^4;

  sbit P3_5=P3^5;

  void jieguo(void);

  void Settime(uchar verify);

  uchar kbscan(void);///键盘扫描

  void Show_Time(void);////显示时间

  void Settime(uchar verify);//verify 在这里为调整的意思

  uint transfor( uchar key1);

  void delay400ms(void) ;

  void delay200ms(void);

  void delay5ms(void);

  void delay_1s(void);

  void dlms(void);

  void dlms1(void)

  {

  uint g=20000;

  while(--g); //延时100mS钟

  }

  void clr(void)

  {

  i=0;

  suanfa=0;

  Tablenum=0;

  for(f=0;f《4;f++)

  {

  num[f]=0;

  }

  P2_0=1;

  P2_1=1;

  P2_2=1;

  P2_3=0;

  P3_4=0;

  P3_5=1;

  P0=0xc0;

  P3_5=0;

  }

  //***************************************以下单片机液晶显示****************************************************

  void waitLcd() //just wait until 液晶不忙为止

  {

  char temp;

  bit flag=1;

  while(flag==1)

  {

  temp=XBYTE[rc];

  if (temp》》7==0) flag=0;

  P1=temp;

  }

  P1=0xff;

  }

  //just wait until 液晶不忙为止

  void WriteCommand_Lcd(bit isCheck,char c)

  {

  if (isCheck==1) waitLcd();

  XBYTE[wc]=c;

  }

  void writedata(char c)

  {

  waitLcd();

  XBYTE[wd]=c;

  }

  void LcdInit()

  {

  delay5ms();

  delay5ms();

  delay5ms();

  WriteCommand_Lcd(0,0x38); //三次显示模式设置,不检测忙信号

  delay5ms();

  WriteCommand_Lcd(0,0x38);

  delay5ms();

  WriteCommand_Lcd(0,0x38);

  delay5ms();

  WriteCommand_Lcd(1,0x38); //显示模式设置,开始要求每次检测忙信号,8位2行5*7

  WriteCommand_Lcd(1,0x08); //关闭显示

  WriteCommand_Lcd(1,0x01); //清显示

  WriteCommand_Lcd(1,0x06); // 文字不动,光标右移

  WriteCommand_Lcd(1,0x0C); // 显示开及光标设置

  }

  void displayListChar(unsigned char X, unsigned char Y, uchar DData)

  {

  Y &= 0x1;

  X &= 0xF;

  if (X 《= 0xF)

  {

  Y &= 0x1;

  X &= 0xF;

  if (Y) X = 0x40;

  X = 0x80;

  WriteCommand_Lcd(0,X);

  writedata(dispbuf[DData]);

  }

  }

  //****************************************以上单片机液晶显示驱动*****************************************************

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

  //**********************************以下显示时间*****************************************************

  void Show_Time(void)

  {

  displayListChar(0,0,hour/10);

  displayListChar(1,0,hour%10);

  displayListChar(2,0,10);

  displayListChar(3,0,minute/10);

  displayListChar(4,0,minute%10);

  displayListChar(5,0,10);

  displayListChar(6,0,second/10);

  displayListChar(7,0,second%10);

  }

  //**********************************以上显示时间*****************************************************

  void main(void)

  {

  TMOD=0x02; //置自动重装载模式

  TH0=0x06; //设初值

  TL0=0x06; //设初值

  TR0=1; //开始计数

  ET0=1; //开定时器/计数器

  EA=1; //中断开

  delay400ms();//启动等待,等LCM讲入工作状态

  LcdInit(); //LCM初始化

  P3_4=0;

  P2_0=1;

  P2_1=1;

  P2_2=0;

  P2_3=1;

  P3_5=1;

  P0=0xc0;

  P3_5=0;

  while(1)

  {

  uchar key;

  key=kbscan();

  dlms();

  // 0(11100111 0xe7)

  ///*****************************以下是单片机液晶显示两种状态的切换********************

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

  if(key==0xe7)

  {

  dlms();

  flag1=~flag1;

  key=0x00;

  if(flag1==1)

  {

  P2_0=1;

  P2_1=1;

  P2_2=0;///液晶状态灯

  P2_3=1;

  }

  if(flag1==0)

  {

  P2_0=1;

  P2_1=1;

  P2_2=1;

  P2_3=0;///计算器状态灯

  }

  dlms1();

  }

  ///*****************************以上是单片机液晶显示两种状态的切换*************

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

全部0条评论

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

×
20
完善资料,
赚取积分