微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stc52单片机1602液晶显示问题

stc52单片机1602液晶显示问题

时间:10-02 整理:3721RD 点击:
用52单片机做的一个1602液晶显示时分秒的程序,按功能键时,定时器没关,按键没用,显示还在走,程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;//1602数据/指令选择端
sbit rw=P1^1;//1602读/写选择端
sbit e=P1^2;//1602使能信号端
sbit beep=P1^5;//蜂鸣器控制口
sbit s1=P3^7;//按键-功能键
sbit s2=P3^6;//按键-增大键
sbit s3=P3^5;//按键-减小键
uchar code table1[]="2013-12-16  MON";
char miao,fen,shi;
char zd;
uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
void delay(uint z)//延时子函数
{
  uint x,y;
  for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}
void di()//蜂鸣器发声子函数
{
  beep=0;
  delay(100);
  beep=1;
}

void write_com(uchar com)//1602液晶写指令子函数
{
  rs=0;//写指令
  P0=com;//送指令
  delay(5);
  e=1;//使能信号高脉冲
  delay(5);
  e=0;//使能信号低完成一次写指令
}
void write_date(uchar date)//1602液晶写数据子函数
{
  rs=1;//写数据
  P0=date;//送数据
  delay(5);
  e=1;//使能信号高脉冲
  delay(5);
  e=0;//使能信号低完成一次写数据
}
void write_sfm(uchar add,uchar date)//写时分秒子函数
{
  uchar ge,shi;
  shi=date/10;//数据除10商给shi,余给ge
  ge=date%10;
  write_com(0x80+0x40+add);//写液晶第二行指令定义位置
  write_date(0x30+shi);//ASCII表和1602的表,查表,液晶显示shi,ge数据
  write_date(0x30+ge);//
}

void keyscan()//键盘扫描子函数
{
  uint s1num;
  //uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
  if(s1==0)//功能键按下
  {
    delay(10);
         if(s1==0)//确认功能键按下
         {
           s1num++;//功能键按下次数记录
                while(!s1);//功能键释放确认
                di();//按键按下蜂鸣器发声
     if(s1num==1)//功能键第一次按下
                  {
                    TR0=0;//关定时器
          write_com(0x80+0x40+11);//光标定位到秒个位位置
                    write_com(0x0f);//光标开始闪烁
                  }
           if(s1num==2)//功能键第二次按下
                        {
                          write_com(0x80+0x40+10);//光标定位到秒十位位置
                        }
                if(s1num==3)//功能键第三次按下
                        {
                          write_com(0x80+0x40+8);//定位到分个位位置
                        }
           if(s1num==4)//功能键第四次按下
                        {
                          write_com(0x80+0x40+7);//定位到分十位位置
                        }
      if(s1num==5)//功能键第五次按下
                        {
                          write_com(0x80+0x40+5);//定位到时个位位置
                        }
           if(s1num==6)//功能键第五次按下
                        {
                          write_com(0x80+0x40+4);//定位到时十位位置
                        }
                if(s1num==7)//功能键第四次按下
                        {
                          s1num=0;//记录次数清零
                          write_com(0x0c);//关光标
                          TR0=1;//启动定时器
                        }
      }
        }

if(s1num!=0)//只有功能键按下,增大减小键才起作用
{
   
  if(s2==0)//增大键按下
  {
    delay(10);
    if(s2==0)//确认增大键按下
      {
             while(!s2);//释放确认
             di();//蜂鸣器响
        if(s1num==1)
         {
           miaoge=miao%10;
           miaoge++;
           if(miaoge==10)
               miaoge=0;
           write_com(0x80+0x40+11);
           write_date(0x30+miaoge);
           write_com(0x80+0x40+11);
         }
        if(s1num==2)
         {
          miaoshi=miao/10;
          miaoshi++;
          if(miaoshi==6)
              miaoshi=0;
          write_com(0x80+0x40+10);
          write_date(0x30+miaoshi);
          write_com(0x80+0x40+10);
         }
       if(s1num==3)
        {
          fenge=fen%10;
          fenge++;
          if(fenge==10)
             fenge=0;
         write_com(0x80+0x40+8);
         write_date(0x30+fenge);
         write_com(0x80+0x40+8);
        }
      if(s1num==4)
       {
         fenshi=fen/10;
         fenshi++;
         if(fenshi==10)
              fenshi=0;
         write_com(0x80+0x40+7);
         write_date(0x30+fenshi);
         write_com(0x80+0x40+7);
       }
     if(s1num==5)
       {
         shige=shi%10;
         shige++;
         if(shishi==2)
          {
            if(shige==5)
                shige=0;
          }
         else
          {
            if(shige==10)
                shige=0;
          }
        write_com(0x80+0x40+5);
        write_date(0x30+shige);
        write_com(0x80+0x40+5);
      }
     if(s1num==6)
      {
        shishi=shi/10;
        shishi++;
        if(shishi==3)
            shishi=0;
        write_com(0x80+0x40+4);
        write_date(0x30+shishi);
        write_com(0x80+0x40+4);
      }
     }
    }
if(s3==0)//减小键按下
   {
       delay(5);
       if(s3==0)//确认减小键按下
         {
           while(!s3);//释放确认
           di();//蜂鸣器响
           if(s1num==1)
           {
                   miaoge=miao%10;
                   miaoge--;
                   if(miaoge==-1)
                        miaoge=9;
              write_com(0x80+0x40+11);
                        write_date(0x30+miaoge);
              write_com(0x80+0x40+11);
           }
        if(s1num==2)
           {
                   miaoshi=miao/10;
                   miaoshi--;
                   if(miaoshi==-1)
                        miaoshi=5;
                   write_com(0x80+0x40+10);
              write_date(0x30+miaoshi);
              write_com(0x80+0x40+10);
           }
        if(s1num==3)
           {
                   fenge=fen%10;
                   fenge--;
                   if(fenge==-1)
                      fenge=9;
                  write_com(0x80+0x40+8);
             write_date(0x30+fenge);
             write_com(0x80+0x40+8);
           }
          if(s1num==4)
           {
                   fenshi=fen/10;
                   fenshi--;
                     if(fenshi==-1)
                        fenshi=5;
                   write_com(0x80+0x40+7);
              write_date(0x30+fenshi);
              write_com(0x80+0x40+7);
           }
          if(s1num==5)
           {
             shige=shi%10;
             shige--;
             if(shishi==2)
              {
               if(shige==-1)
                    shige=3;
              }
             else
              {
               if(shige==-1)
                   shige=9;
              }
            write_com(0x80+0x40+5);
            write_date(0x30+shige);
            write_com(0x80+0x40+5);
          }
        if(s1num==6)
           {
                  shishi=shi/10;
                  shishi--;
                  if(shishi==-1)
                       shishi=2;
                  write_com(0x80+0x40+4);
             write_date(0x30+shishi);
             write_com(0x80+0x40+4);
           }
         }
       }
  }
}

void main()//主函数
{
  uchar num1;
                     //1602液晶初始化
  rw=0;//写选择
  write_com(0x38);//设置16*2显示,5*7点阵。8位数据接口
  write_com(0x0c);//开显示
  write_com(0x06);//写一个字符后指针加1
  write_com(0x01);//显示清屏
                   //初始第一行显示
  write_com(0x80);
  for(num1=0;num1<15;num1++)
    {
           write_date(table1[num1]);
                delay(10);
         }
                  //初始第二行显示
  write_com(0x80+0x40+4);
  write_date('0');
  write_date('0');
  delay(5);
  write_com(0x80+0x40+6);
  write_date(':');
  delay(5);
  write_com(0x80+0x40+7);
  write_date('0');
  write_date('0');
  delay(5);
  write_com(0x80+0x40+9);
  write_date(':');
  delay(5);
  write_com(0x80+0x40+10);
  write_date('0');
  write_date('0');
  delay(5);
                 // 定时器0初始
  TMOD=0x01;//选定时器0工作方式1
  TH0=(65536-50000)/256;//给定时器0赋初值
  TL0=(65536-50000)%256;
  EA=1;//开总中断
  ET0=1;//开定时器0中断
  TR0=1;//启动定时器0*/
  while(1)
  {
   keyscan();
  }
}
void time0(void) interrupt 1//定时器0中断服务程序
{
  
  TH0=(65536-50000)/256;//重装定时器0初值
  TL0=(65536-50000)%256;
  zd++;
  if(zd==20)//1秒时间到
  {
    zd=0;
         miao++;
         if(miao==60)//一分钟到
         {
           miao=0;
                fen++;
                if(fen==60)//一小时到
                {
                  fen=0;
                  shi++;
                  if(shi==24)//一天到
                  {
                    shi=0;
                  }
                  write_sfm(4,shi);//小时变化重新写入
                }
                write_sfm(7,fen);//分钟变化重新写入
         }
         write_sfm(10,miao);//秒变化重新写入
  }
}

看看。

有没有人知道什么问题呀?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top