lcd1602显示数字程序,基于89S52单片机的lcd1602显示数字程序代码

光电显示

1051人已加入

描述

  为了可以让大家清楚的了解到lcd1602显示数字程序,小编用89S52单片机做了个程序实验。先来科普一下88S52单片机,AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。

  用89S52单片机写了个驱动1602液晶显示输入数字程序,大家看看如何简化if部分代码。如果需要输入数字10位以上,if代码会很长,是否必须这样写?另一个问题,想把显示的数字读出来放到一个数组里供其他函数调用,这部分还没有思路。也不知如何写?

  这个程序运行是这样的。初次加电,1602液晶第1行显示“please input dat”,第2行首列显示数字1。有两个按键,SW1移动光标,SW2调数字。本程序是4位数字输入。也算是给初学者一个驱动1602液晶的例子。这是关于以下程序的一个说明。

  

  基于89S52单片机的lcd1602显示数字程序

  #include《reg51.h》

  #define uchar unsigned char

  #define uint unsigned int

  #define lcd_DO P2

  uchar code TAB[]={“1234567890”};

  uchar code TAB1[]={“please-input-dat”};

  sbit SW1=P0^0;

  sbit SW2=P0^1;

  sbit lcdrs=P3^7;

  sbit lcdrw=P3^6;

  sbit lcden=P3^5;

  void delay(); //延时

  void write_com(); //写命令

  void write_data();//写数据

  void lcd_init(); //lcd初始化

  void main();

  void delay(uchar z) //延时

  {

  uint x,y;

  for(x=z;x》0;x--);

  for(y=110;y》0;y--);

  }

  void write_com(uchar com) //写命令

  {

  lcdrw=0;

  lcdrs=0;

  delay(5);

  P2=com;

  delay(5);

  lcden=1;

  delay(5);

  lcden=0;

  }

  void write_data(uchar date) //写数据

  {

  lcdrw=0;

  lcdrs=1;

  delay(5);

  P2=date;

  delay(5);

  lcden=1;

  delay(5);

  lcden=0;

  }

  lcd_init() //lcd初始化

  {

  write_com(0x38);//两行显示

  write_com(0x0c);//开显示不显示光标

  write_com(0x01);//清屏

  }

  void main()

  {

  uchar a=0;

  uchar n=0;

  uchar k=0;//光标

  lcd_init();

  SW1=SW2=1;

  write_com(0x80); //第1行1列

  for(n=0;n《16;n++)

  write_data(TAB1[n]);

  write_com(0x80+0x40);//第2行第1列

  write_data(TAB[a]);

  while(1)

  {

  if(SW1==0)

  {

  k++;

  delay(10);

  if(SW1==0)

  {

  if(k==1)

  {

  while(!SW1);

  write_com(0x80+0x40);第2行第1列

  write_com(0x0f);//光标闪烁

  }

  if(k==2)

  {

  while(!SW1);

  write_com(0x80+0x40+1);第2行第2列

  write_com(0x0f);

  }

  if(k==3)

  {

  while(!SW1);

  write_com(0x80+0x40+2);第2行第3列

  write_com(0x0f);

  }

  }

  if(k==4)

  {

  while(!SW1);

  write_com(0x80+0x40+3);第2行第4列

  write_com(0x0f);

  }

  if(k==5)

  {

  while(!SW1);

  k=0;//光标标志清零

  write_com(0x0c);//光标关闭

  }

  }

  if(k==1)

  {

  if(SW2==0)

  {

  delay(10);

  if(SW2==0)

  {

  while(!SW2);

  a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0

  write_com(0x80+0x40);//在第2行第1列位置写入新数据

  write_data(TAB[a]);

  }

  }

  }

  if(k==2)

  {

  if(SW2==0)

  {

  delay(10);

  if(SW2==0)

  {

  while(!SW2);

  a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0

  write_com(0x80+0x40+1);//在第2行第2列位置写入新数据

  write_data(TAB[a]);

  }

  }

  }

  if(k==3)

  {

  if(SW2==0)

  {

  delay(10);

  if(SW2==0)

  {

  while(!SW2);

  a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0

  write_com(0x80+0x40+2);//在第2行第3列位置写入新数据

  write_data(TAB[a]);

  }

  }

  }

  if(k==4)

  {

  if(SW2==0)

  {

  delay(10);

  if(SW2==0)

  {

  while(!SW2);

  a=(a《9)?a+1:0;//若i小于9则a=a++,若a》=9则清除为0

  write_com(0x80+0x40+3);//在第2行第4列位置写入新数据

  write_data(TAB[a]);

  }

  }

  }

  }

  }

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

全部0条评论

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

×
20
完善资料,
赚取积分