找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1314|回复: 0
打印 上一主题 下一主题
收起左侧

没有完成长按

[复制链接]
跳转到指定楼层
楼主
ID:358998 发表于 2018-7-4 14:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "BS87D20A-3.h"
#define com1    _pc1
#define com2        _pc0
#define com3        _pc2
#define com4        _pc3
#define key1    _pd2
#define key2        _pd3
#define key3        _pa1
#define key4    _pa4
#define key_state_0        0   //按键的初始状态
#define key_state_1        1   //按键按下的状态
#define key_state_2        2   //按键释放的状态

volatile bit Flag_T5ms;
volatile bit Flag_T10ms;
volatile bit Flag_T1s;

const unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char strtab[3];//缓冲区
unsigned char key_number=0;
//unsigned char sec=0,min=0,hour=0;
unsigned char sec=0,min=0,hour=0;
unsigned char temp;
unsigned long s;  //秒级
unsigned long ms10;//毫秒
unsigned long ms5;
unsigned char n;
unsigned char read_key(void)
{
    static char key_state=0 ;     //按键的状态

    unsigned char key_press;       //按键是否被按下
        unsigned char key_return = 0;  //按键返回值
    key_press = key4;         // 读按键I/O电?

    switch (key_state)
    {
        case key_state_0:                 // 按键初始态
                if (!key_press)
                        {
                                if(Flag_T10ms)
                                {
                                        Flag_T10ms=0;
                                        }
                                key_return = 0;
                                key_state = key_state_1;// 键被按下,状态转换到键确认态
                }
                else key_state = key_state_0;
                        break;
                               
        case key_state_1:                   // 按键确认态
            if (!key_press)
            {
                    if(Flag_T10ms)
                    {
                            Flag_T10ms=0;
                            }
                key_return = 1;         // 按键仍按下,按键确认输出为“1”
                key_state = key_state_2;// 状态转换到键释放态
            }
            else
            {
                                key_state = key_state_0; // 按键已抬起,转换到按键初始态
                                key_return = 0;
                        }
            break;
                               
        case key_state_2:
            if (key_press)
                        {
                               
                            key_state = key_state_0;//按键已释放,转换到按键初始态
                            key_return = 0;
            }
            break;
   }
return key_return;                //返回按键值
}
void displaypro()
{
        strtab[0]=tab[sec%10];
        strtab[1]=tab[sec/10];
        strtab[2]=tab[min%10];
        strtab[3]=tab[min/10];

}
void display_drive()
{
        com1=1;com2=1;com3=1;com4=1;
                    switch(temp)
                {
                        case 0:com4=0;
                         _pb=strtab[temp]; break;
                        case 1:com3=0;
                         _pb=strtab[temp]; break;
                        case 2:com2=0;
                         _pb=strtab[temp]; break;
                        case 3:com1=0;
                         _pb=strtab[temp]; break;
                        default:break;
                }
                temp++;
                if(temp==4)
                        temp=0;

}
void init()
{
    _ctm0c0=0x20;  // fh/16   2us        
        _ctm0c1=0xc1; // 定时/计数器模式 比较器a
        _ctm0al=0xf4; // 1ms
    _ctm0ah=0x01;
       
        _pbc=0; //输出
        _pcc0=0;
        _pcc1=0;
        _pcc2=0;
        _pcc3=0;
       
        _pac1=1;
        _pac4=1;
        _pdc2=1;
        _pdc3=1;
        _pdpu3=1;
        _pdpu2=1;
        _papu1=1;
        _papu4=1;

        s=1000;
        ms10=10;
        ms5=5;
        temp=0;

        n=0;
        _mfe=1; //开多功能中断
    _ctm0ae=1; //CTM a中断使能
        _emi=1;        //开总中断
        _ct0on=1; //开定时器

        }
        void main()
        {
                init();
                while(1)
                {
       
                        if(Flag_T5ms)
                        {
                                Flag_T5ms=0;  
                               
                        }
                        if(Flag_T1s)
                        {
                                Flag_T1s=0;
                                displaypro();
                                }
                       
                        if(Flag_T10ms)  //10MS进入一次
                        {
                               
                                read_key();
                                key_number=read_key();//调用按键扫描函数,取得按键值,5MS调用一次
                        if(key_number==1)
                        {
                               
                                n++;
                                _pb=tab[n];

               
               
                        }
                                Flag_T10ms=0;  
                        }

                        GCC_CLRWDT();
               
                        com1=1;com2=1;com3=0;com4=0;
                       

                }
        }
       
        void __attribute__((interrupt(0x14))) ISR_CTMO(void)
        {
                _ctm0af=0;

                s--;
                ms5--;
                ms10--;       
                  if(! ms5)
                {   
                        ms5=5;//5MS 视觉暂留
                        Flag_T5ms=1;
                }       
                if(!ms10)
                {
                        ms10=10;
                        Flag_T10ms=1;
                        }

                if(! s)
                {   
                        Flag_T1s=1;
                        s=1000;//1s电子钟计数
                        sec++;       
                if(sec==60)
                {
               sec=0;
               min++;
               if(min==60)
               {
                min=0;
                 hour++;
                 if(hour==24)
                 {
                  hour=0;
                 }
                       }
               }
        }
       
       
        }

       
       
       
       

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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