搜索
bottom↓
回复: 11

求一单片机高手决绝一下此小程序的毛病

[复制链接]

出0入0汤圆

发表于 2012-10-3 16:18:42 | 显示全部楼层 |阅读模式
请高人指点在keyscan函数中的if(k1num==4)中  当我按下键K1四下后  我启动定时器开始计数  为什么按完第四下 需要等待将近14秒 定时器才开始计数

请问毛病到底出在哪里啊    求大虾解决疑惑啊



#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;


uchar count,k1num;
char shi,fen,miao;
uchar code table[]="my name is yuan.";
uchar code table1[]="   00:00:00:0   ";
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}

void write_com(uchar com)
{
  delay(5);
  RS=0;//等于0时为写命令
  E=0;         //
  RW=0;           //写入指令或者数据
  delay(5);
  P0=com;
  E=1;           //读取信息
  delay(5);
  E=0;//from 1 to 0,the falling edge ,execute the command
}

void write_date(uchar date)
{
  delay(5);
  RS=1;//  一定注意按照时序图来写
  E=0;
  delay(5);
  E=1;
  P0=date;
  delay(5);
  E=0;
}

void init()
{
  uchar num;                  
  miao=0;
  fen=0;
  shi=0;

  E=0;
  write_com(0x38); //显示5*7点阵设置  16*2  八位数据接口
  delay(5);
    write_com(0x38);
  delay(5);
    write_com(0x38);
  
  
  write_com(0x08);//显示关闭
  write_com(0x01);//显示清屏
  write_com(0x06);//每写一个 指针地址自动加一
  write_com(0x0c);//指令屏幕开显示,不显示光标,不闪烁
  
  write_com(0x80);
  for(num=0;num<16;num++)
  {
     write_date(table[num]);
         delay(30);
  }
write_com(0x80+0x40);//写在第二行
  for(num=0;num<16;num++)
  {
    write_date(table1[num]);
         delay(30);
  }
  TMOD=0x01;
  TH0=0x3c;
  TL0=0xb0;
  EA=1;
  ET0=1;
  TR0=1;
}

void write_sfm(uchar add,uchar date)
{
  uchar shi,ge;
  shi=date/10;
  ge=date%10;
  write_com(0x80+0x40+add);
  write_date(0x30+shi);        //对应的表中  从十位(即地址0x80+0x40+ADD)开始        0x30加几屏幕就显示几  可以查表
  write_date(0x30+ge);/*写完十位(即地址0x80+0x40+10)
  地址自动加一开始写这一位的个位数字*/
}

void keyscan()
{

   if(k1==0)
   {
     delay(20);
         if(k1==0)
         {
           k1num++;        //检测按键0被按下几次

           while(!k1);//检测按键是否松手
                if(k1num==1)
                  {
                           TR0=0;//关闭定时器,时间静止
                           write_com(0x80+0x40+10);
                           write_com(0x0f);//光标闪烁
                  }
                if(k1num==2)
                  {
                          
                           write_com(0x80+0x40+7);
                         
                  }
                if(k1num==3)
          {
          
                 write_com(0x80+0x40+4);
         
          }
                if(k1num==4)
                {
                        k1num=0;
                                write_com(0x0c);//光标不显示不闪烁
                                TMOD=0x01;
                                  TH0=0x3c;
                                  TL0=0xb0;
                                  EA=1;
                                  ET0=1;
                                TR0=1;           //需调式,草的,这毛病到底出哪儿了
                                 
                }
         }
       
   }



   if(k1num!=0)//意味着k1num被按下
          {
            if(k2==0)         //如果被按下 进行PLUS
                  {
                     delay(20);
                         if(k2==0)
                           {
                             while(!k2);
                             if(k1num==1) //检测光标在哪个位置闪烁  进行加法修改数字
                                   {
                                     miao++;
                                         if(miao==60)
                                         miao=0;
                                          write_sfm(9,miao);
                                         write_com(0x80+0x40+10); //由于设置的指令时加完 指针地址自动加一,所以要保持他在这个地址
                                   }
                                 if(k1num==2)
                                   {
                                        fen++;
                                        if(fen==60)
                                        fen=0;
                                          write_sfm(6,fen);
                                         write_com(0x80+0x40+7);  
                                   }
                                  if(k1num==3)
                                    {
                                                shi++;
                                                if(shi==24)
                                                shi=0;               
                                                  write_sfm(3,shi);
                                                 write_com(0x80+0x40+4);
                                        }
                           }
                  }

                  /*如果被按下  进行加法*/
                  if(k3==0)
                  {
                     delay(20);
                         if(k3==0)
                           {
                             while(!k3);
                             if(k1num==1)
                                   {
                                     miao--;
                                         if(miao==-1)
                                                 miao=59;
                                          write_sfm(9,miao);
                                         write_com(0x80+0x40+10);
                                         
                                       
                                   }
                                 if(k1num==2)
                                   {
                                        fen--;
                                        if(fen==-1)
                                        fen=59;
                                          write_sfm(6,fen);
                                         write_com(0x80+0x40+7);  
                                   }
                                  if(k1num==3)
                                    {
                                                shi--;
                                                if(shi==-1)
                                                shi=23;               
                                                  write_sfm(3,shi);
                                                 write_com(0x80+0x40+4);
                                        }
                           }
                  }
          }
}

void main()
{        uchar paomiao;

   init();
   while(1)
{
   
   keyscan();
   if(count==2)
   {
     count=0;
         paomiao++;
         if(paomiao==9)
         {
           paomiao=0;
           miao++;
                 if(miao==60)
                 {
                   miao=0;
                   fen++;
                   if(fen==60)
                   {
                     fen=0;
                         shi++;
                         if(shi==24)
                         {
                           shi=0;
       
                         }
                         write_sfm(3,shi);
                   }
                   write_sfm(6,fen);
                 }
                 write_sfm(9,miao);
     }
     write_com(0x80+0x40+12); //打开跑秒的地址
         
         write_date(0x30+paomiao);//按照表格 显示跑秒的数字
   }
  }
//   while(1);  
}


void timer0() interrupt 1
{
  TH0=0x3c;
  TL0=0xb0;
  count++;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-3 17:15:24 | 显示全部楼层
我表示程序看了一半就不想看下去了。


最好给个大致的问题啊,你写程序的思路。。

出0入0汤圆

 楼主| 发表于 2012-10-3 17:34:14 | 显示全部楼层
ylyfxzsx 发表于 2012-10-3 17:27
看到这一堆杂草,表示,就想点
屏幕左上角的X

程序很混乱么   请您提提意见  就是KEYSCAN函数那儿的开启中断  为么有十几秒的延迟之后才定时器又开始工作的啊

出0入0汤圆

发表于 2012-10-3 17:35:08 | 显示全部楼层
杨工,我怎么记得,X是在右上角。。。

出0入0汤圆

 楼主| 发表于 2012-10-3 17:37:14 | 显示全部楼层
RUANJI 发表于 2012-10-3 17:15
我表示程序看了一半就不想看下去了。

我写的一个1602的液晶时钟   按键KEY1按第一下定时器停止计数 光标闪烁在自己指定的地址上 设置时分秒  KEY2   KEY3  分别是加或者减  

当KEY被按下四次以后我的想法是定时器开启 立刻开始计数   但是没有实现  请您帮帮忙

出0入0汤圆

发表于 2012-10-3 19:46:18 | 显示全部楼层
把 TMOD=0x01;
                                  TH0=0x3c;
                                  TL0=0xb0;
                                  EA=1;
                                  ET0=1;
                                TR0=1;           //需调式,草的,这毛病到底出哪儿了
换成TR0=1;试试

出0入0汤圆

 楼主| 发表于 2012-10-3 20:57:29 | 显示全部楼层
WYK 发表于 2012-10-3 19:46
把 TMOD=0x01;
                                  TH0=0x3c;
                                  TL0=0xb ...

                     k1num=0;
                                write_com(0x0c);//光标不显示不闪烁
                  
                                TR0=1;           //需调式,草的,这毛病到底出哪儿了


我刚开始就是这么写的  但是烧进去还是不行 所以我改成帖子上的那种形式  但是也不行   不知道这是为什么啊

出0入0汤圆

发表于 2012-10-3 21:51:53 | 显示全部楼层
little_Monkey 发表于 2012-10-3 17:35
杨工,我怎么记得,X是在右上角。。。

他用的是ubuntu 嘿嘿~~

出0入0汤圆

发表于 2012-10-3 22:18:51 | 显示全部楼层
count未赋初值,可能初值已大于2了,所以
if(count==2)
   {
     count=0;
这里就晚了

出0入0汤圆

发表于 2012-10-4 09:49:27 | 显示全部楼层
这不是郭天祥的程序吗  自己对比。。。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^4;
sbit lcden=P3^7;
sbit lcdrw=P3^6;
sbit K4=P2^3;
sbit s1=P2^7;
sbit s2=P2^6;
sbit s3=P2^5;
sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;
sbit a5=P1^4;
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2011-06-17 MON";
sbit sda=P1^6;
sbit scl=P1^5;

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

void delay0()  //微妙延迟函数
{ ;; }

void start()  //开始信号
{       
        sda=1;
        delay0();
        scl=1;
        delay0();
        sda=0;
        delay0();
}

void stop()   //停止
{
        sda=0;
        delay0();
        scl=1;
        delay0();
        sda=1;
        delay0();
}

void respons()  //应答
{
        uchar i;
        scl=1;
        delay0();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay0();
}

void init_24c02()        //I2C初始化函数
{
        sda=1;
        delay0();
        scl=1;
        delay0();
}

void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
            delay0();
                sda=CY;
                delay0();
                scl=1;
                delay0();
        }
        scl=0;
        delay0();
        sda=1;
        delay0();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay0();
        sda=1;
        delay0();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay0();       
                k=(k<<1)|sda;
                scl=0;
                delay0();       
        }
        return k;
}

void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}

//

void write_com(uchar com)
{
        lcdrs=0;
        lcdrw=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}

void write_date(uchar date)
{
        lcdrs=1;
        lcdrw=0;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_com(0x80+0x40+add);
        write_date(0x30+shi);
        write_date(0x30+ge);
}

void init()                           //初始化函数
{
    uchar num;
        K4=0;
    a1=a2=a3=a4=a5=0;
        lcden=0;
        fen=0;
        miao=0;
        shi=0;
        count=0;
        s1num=0;
        init_24c02();
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<15;num++)
                {
                        write_date(table[num]);
                        delay(5);
                }

                write_com(0x80+0x40+6);
                write_date(':');
                delay(5);
                write_com(0x80+0x40+9);
                write_date(':');
                delay(5);
        miao=read_add(1);
        fen=read_add(2);
        shi=read_add(3);
        write_sfm(10,miao);
        write_sfm(7,fen);
        write_sfm(4,shi);

        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void keyscan()                        //按键扫描函数
{
        if(s1==0)       
        {
                delay(5);
                if(s1==0)
                {        s1num++;
                        while(!s1);
                        if(s1num==1)
                        {
                                TR0=0;
                                write_com(0x80+0x40+10);
                                write_com(0x0f);       
                        }
        }
                        if(s1num==2)
                        {
                                write_com(0x80+0x40+7);
                        }
                        if(s1num==3)
                        {
                                write_com(0x80+0x40+4);
                        }
                        if(s1num==4)
                        {
                                s1num=0;
                                write_com(0x0c);
                                TR0=1;
                        }
                               
                }
                if(s1num!=0)
                {
                        if(s2==0)
                        {
                                delay(5);
                                if(s2==0)
                                {
                                        while(!s2);
                                        if(s1num==1)
                                        {
                                                miao++;
                                                if(miao==60)
                                                        miao=0;
                                                write_sfm(10,miao);
                                                write_com(0x80+0x40+10);
                                                write_add(1,miao);           //数据改变立即存入24c02                                                       

                                               
                                        }
                                        if(s1num==2)
                                        {
                                                fen++;
                                                if(fen==60)
                                                        fen=0;
                                                write_sfm(7,fen);
                                                write_com(0x80+0x40+7);
                                                write_add(2,fen);           //数据改变立即存入24c02
                                        }
                                        if(s1num==3)
                                        {
                                                shi++;
                                                if(shi==24)
                                                        shi=0;
                                                write_sfm(4,shi);
                                                write_com(0x80+0x40+4);
                                                write_add(3,shi);           //数据改变立即存入24c02
                                        }
                                }
                        }
                        if(s3==0)
                        {
                                delay(5);
                                if(s3==0)
                                {
                                        while(!s3);
                                        if(s1num==1)
                                        {
                                                miao--;
                                                if(miao==-1)
                                                        miao=59;
                                                write_sfm(10,miao);
                                                write_com(0x80+0x40+10);
                                                write_add(1,miao);           //数据改变立即存入24c02               
                                        }
                                        if(s1num==2)
                                        {
                                                fen--;
                                                if(fen==-1)
                                                        fen=59;
                                                write_sfm(7,fen);
                                                write_com(0x80+0x40+7);
                                                write_add(2,fen);           //数据改变立即存入24c02       
                                        }
                                        if(s1num==3)
                                        {
                                                shi--;
                                                if(shi==-1)
                                                        shi=23;
                                                write_sfm(4,shi);
                                                write_com(0x80+0x40+4);
                                                write_add(3,shi);           //数据改变立即存入24c02
                                        }
                                }
                        }
                }
}

void main()
{
        init();
        while(1)
        {
                keyscan();               
        }
}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
if(count==20)
                {
                        count=0;
                        miao++;
                        if(miao==60)
                        {
                                miao=0;
                                fen++;
                                if(fen==60)
                                {
                                        fen=0;
                                        shi++;
                                        if(shi==24)
                                        {
                                                shi=0;
                                        }
                                        write_sfm(4,shi);
                                        write_add(3,shi);           //数据改变立即存入24c02
                                }
                                write_sfm(7,fen);
                                write_add(2,fen);           //数据改变立即存入24c02       
                        }
                        write_sfm(10,miao);
                        write_add(1,miao);           //数据改变立即存入24c02                               
                }       
}


出0入0汤圆

发表于 2012-10-4 14:22:50 来自手机 | 显示全部楼层
一样蛋疼的程序,好纠结,水平太菜了,完全看不懂

出0入0汤圆

发表于 2012-10-4 16:33:10 | 显示全部楼层
void main()
{        uchar paomiao;

   init();
定时器已启动了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表