羽逸_UAV 2021-03-23 16:45 采纳率: 100%
浏览 27
已采纳

51单片机无法准确停止读秒,求大神相助。

一,现象描述:(1)秒钟可以正常读数(2)S1按键需要长按3秒才可以停止读秒和开始读秒,我需要一按下松开,就停止和开始。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sdi=P1^0;//定义595数据输入口
sbit lck=P1^4;//定义595数据位移缓存器并行输出时钟
sbit sck=P2^3;//定义595数据存入缓存器时钟 
sbit rs=P2^5; //段选
sbit rw=P2^6; //位选
sbit s1=P3^7;
sbit s2=P3^6;
sbit s3=P3^5;
sbit s4=P3^4;
sbit lcden=P2^4;
uchar code table[]=" 2020-11-29 Sat.";
uchar code table1[]="    23:59:55   ";
uchar temp,flag,shi,fen,miao,s1num;//temp定数计数器变量,flag开启中断标志位

void delay(uint z)
{
    uchar x,y;
    for(x=z;x>0;x--)
    {
        for(y=110;y>0;y--)
        {
            
        }
    }
}

void delay1(uint z)
{
    uchar x,y;
    for(x=100;x>0;x--)
        for(y=z;y>0;y--);
        {
            
        }
}

void write_595(uchar date2)
{
    uchar i;
    sck=0;
    for(i=0;i<8;i--)
    {
         lck=0;
        sdi=(date2<<i)&0x80;
        lck=1;
    }
    sck=1;
    sdi=1;
}
                          
void write_com(uchar com)//写指令子函数
{
   rs=0;
   rw=0;
   P0=com;
   delay(5);
   lcden=1;
   delay(5);
   lcden=0;
}

void write_data(uchar date)//写数据子函数
{
   rs=1;
   rw=0;
   P0=date;
   delay(500);
   lcden=1;
   delay(500);
   lcden=0;       
}

void write_sfm(uchar add,uchar date3)
{
    uchar shi,ge;//分离用变量
    shi=date3/10;
    ge=date3%10;
    write_com(0x80+0x40+add);
    write_data(0x30+shi);
    write_data(0x30+ge);
    write_com(0x80+0x40+14);//光标换行,为时钟输入:
    write_data(0x20+0);
    delay(5);
    write_com(0x80+0x40+15);//光标换行,为时钟输入:
    write_data(0x20+0);
    delay(5);
    write_com(0x80+0x40+16);//光标换行,为时钟输入:
    write_data(0x20+0);
    delay(5);
}

/*void delete()
{
    write_com(0x80+0x40+14);//光标换行,为时钟输入:
    write_data(0x20+0);
    delay(5);
    write_com(0x80+0x40+15);
    write_data(0x20+0);
    delay(5);
    write_com(0x80+0x40+16);
    write_data(0x20+0);
    delay(5);
}*/

void init()//初始化函数
{    
    uchar num;
    lcden=0;
    write_595(0x40);
    write_com(0x38);//设置显示屏
    write_com(0x0c);//开启显示屏以及设置光标开启且闪烁
    write_com(0x80);//设置光标位置为0
    write_com(0x06);//设置光标书写后右移一位
    write_com(0x01);//清除显示屏原有数据
    EA=1;//打开总中断
    TMOD=0x01;//定时计数器工作方式为8位移位计数器
    ET0=1;//打开定时计数定时计数器中断;
    TR0=0;//打开定数计数器
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    temp=1;
    s1num=0;
    shi=23;
    fen=59;
    miao=55;
    for(num=0;num<16;num++)
    {
        write_data(table[num]);
        delay(5);
    }
    write_com(0x80+0x40+7);//光标换行,为时钟输入:
    write_data(':');
    delay(5);
    write_com(0x80+0x40+10);
    write_data(':');
    delay(5);
/*    for(num1=0;num1<12;num1++)
    {
        write_data(table1[num1]);
        delay(5);
    }
*/
/*    write_com(0x01);//显示屏清零
    write_com(0x80);//写指针位置
    write_com(0x0c);//开启显示屏显示
    write_com(0x0a);//开启光标显示
    write_com(0x09);//开启光标闪烁
    write_com(0x06);*/
}                                  

void display()
{
    write_sfm(5,shi);
    write_sfm(8,fen);
    write_sfm(11,miao);    
}

void keyscan()
{
    if(s1==0)
    {
        delay1(10);
        if(s1==0)
        {
            s1num++;
            while(!s1);
            if(s1num==1)
            {
                TR0=0;
            }
            if(s1num==2)
            {
                s1num=0;
                TR0=1;
            }
        }
    }        
}
void main()
{
    init();
    TR0=1;
    while(1)
    {    
        keyscan();
        display();
    }    
}

void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    temp++;
    if(temp==20)
    {
        temp=0;
        miao++;
        if(miao==60)
        {
            miao=0;
            fen++;
            if(fen==60)
            {
                fen=0;
                shi++;
                if(shi==24)
                {
                    shi=0;
                }
                write_sfm(5,shi);
            }
        write_sfm(8,fen);
        }
    write_sfm(11,miao);
    }
}

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况