/*
  程序说明: 快速调用显示及按键模块模板
  软件环境: Keil uVision 4.10
  硬件环境: CT107单片机综合实训平台(内部晶振11.0592HZ) STCF2K60F2K60S2单片机
  日    期: 2018-5-21
  备    注:输出结果为数码管显示01234567按下s4 led全部打开,按下s5 led全部关闭
*/
#include <stc15f2k60s2.h>
typedef unsigned char u8;
typedef unsigned int u16;

#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
/*************  本地常量声明    **************/
u8 code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
u8 key_scan();
bit key_flag;

/*************  定时器0初始化    **************/
void Timer0Init(void)        //1毫秒@11.0592MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0xCD;        //设置定时初值
    TH0 = 0xD4;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;        //打开定时器中断
    EA  = 1;        //打开总中断
}

/*************  中断服务程序    **************/
void timer0() interrupt 1 using 1
{
    static char smg_count=0,key_count=0,i=0;//定义中断进入计时数
    smg_count++;key_count++;   //每进一次中断自增1
    if(smg_count==3)                         //产生3ms定时
    {
        smg_count=0;
        P2=0XE0;P0=~t_display[i];P2=0X00;    //3ms刷新数码管段
        P2=0XC0;P0=T_COM[i];P2=0X00;        //3ms刷新数码管位
        i++;
        if(i==8)i=0;                        //选通所有数码管
    }
    if(key_count==10)                       //产生10ms定时
    {
        key_count=0;
        key_flag=1;                           //按键检测标志位置1
    }
}

/*************  主函数体    **************/
void main(void)
{    
    u8 key_val;
    P2=0XA0;P0=0X00;P2=0X00;                //关蜂鸣器
    Timer0Init();                            //初始化定时器0
    while(1)
    {
        if(key_flag)                       //10ms进入按键扫描一次
        {
            key_flag =0;                   //关闭标志位
            key_val = key_scan();           //调用按键扫描
            switch(key_val)                   //检测按下键值
            {
                case 4:P2=0X80;P0=0X00;P2=0X00;break;     //打开所有led
                case 5:P2=0X80;P0=0Xff;P2=0X00;break;     //关闭所有led
            }
        }    
    }

}
/*************  按键扫描程序    **************/
u8 key_scan()
{
    static char key_state=key_state_0;       //定义初始状态
    u8 key1,key2,key_temp,key_value =0;       //零时按键

P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;   //把按键相关io口置0置1
    if(P44==0)key1=0x70;
    if(P42==0)key1=0xb0;
    if(P35==0)key1=0xd0;
    if(P34==0)key1=0xe0;
    if((P44==1)&&(P42==1)&&(P35==1)&&(P34==1))key1=0xf0;

P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;
    if(P33==0)key2=0x07;
    if(P32==0)key2=0x0b;
    if(P31==0)key2=0x0d;
    if(P30==0)key2=0x0e;
    if((P33==1)&&(P32==1)&&(P31==1)&&(P30==1))key2=0x0f;
    key_temp = key1|key2;             //组成矩阵判断按键临时值

switch(key_state)                //扫描按键状态
    {
        case key_state_0:
            if(key_temp!=0xff)key_state=key_state_1;   //有按键按下
        break;
        case key_state_1:
            if(key_temp==0xff)key_state=key_state_0;    //滤出抖动
            else
            {
                switch(key_temp)
                {
                    case 0x77:key_value=4;break;
                    case 0x7b:key_value=5;break;
                    case 0x7d:key_value=6;break;
                    case 0x7e:key_value=7;break;

case 0xb7:key_value=8;break;
                    case 0xbb:key_value=9;break;
                    case 0xbd:key_value=10;break;
                    case 0xbe:key_value=11;break;

case 0xd7:key_value=12;break;
                    case 0xdb:key_value=13;break;
                    case 0xdd:key_value=14;break;
                    case 0xde:key_value=15;break;

case 0xe7:key_value=16;break;
                    case 0xeb:key_value=17;break;
                    case 0xed:key_value=18;break;
                    case 0xee:key_value=19;break;
                        
                }
                key_state=key_state_2;                
            }

break;
        case key_state_2:
            if(key_temp==0xff)key_state=key_state_0;     //检测按键是否松开
        break;
    }
    return key_value;
}

转载于:https://www.cnblogs.com/scr971023/p/9065295.html

蓝桥杯单片机比赛模板相关推荐

  1. 蓝桥杯单片机比赛学习:11、频率测量的基本原理

    在蓝桥杯单片机比赛中,频率测量一次都没考过,但是也不排除不考的可能.频率测量相对前面的几个模块来说相对简单,只需要两个定时器就可以实现. 频率测量的基本原理 产生脉冲的主要元件是555定时器.555定 ...

  2. 蓝桥杯单片机比赛学习:8、PWM的基本原理之呼吸灯

    经过7节的学习,我们已经掌握了基本的硬件的使用规则,从本节开始我们开始学习一些模块的使用PWM.PCF8591.AT24C02.DS18B20.DS1302.555频率测量.光敏电阻测量.超声波测距等 ...

  3. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  4. 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块--PCF8591.我主页有其他模块的使用方法和基本原理(2条消息) Do My Best ...

  5. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  6. 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取

    蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...

  7. 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理

    这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...

  8. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

  9. 蓝桥杯单片机标准模板

    写在开头,笔者第一次写CSDN博文,建议可以提在评论区. 个人情况:第十二届省赛赛区第四 建立标准模板,一是为了将函数,工程,hex文件放在不同的文件夹中:二是为了修改的时候方便*(一开始因为懒不想学 ...

最新文章

  1. R新旧模型、计算净重新分类指数(NRI)和整体鉴别指数(IDI)详解及实战
  2. SAP PM IW33里查看维护订单相关的维护计划
  3. java static修饰方法_浅析Java中static修饰符
  4. 通过一组RESTful API暴露CQRS系统功能
  5. 杨氏矩阵定义及其查找的实现C++
  6. SAP UI5 应用 XML 视图的加载逻辑分析
  7. 异步复位的串联T触发器
  8. 针对access数据库的增删改查
  9. Thinkphp5.0内核仿阿里巴巴小说双端网站源码
  10. 任正非华为为什么暂不推出鸿蒙,任正非表示,华为的鸿蒙系统已经上网?惊喜吗...
  11. javascript删除数组某个元素
  12. mysql迁移升级_MYSQL迁移或者升级的故障解决大全
  13. next_permutation()
  14. matlab各种文件类型,MATLAB中的文件类型总结
  15. 实验吧——WEB-天下武功唯快不破
  16. MT【305】丹德林双球
  17. SylixOS中的CPU集合及其操作
  18. 中国小微企业调查数据CMES:小型微型家庭作坊式企业收支工商税收营商情况
  19. 2016年总结和2017年计划
  20. 【绊脚石】安装pycocotools和lap失败

热门文章

  1. matlab spm批量配准
  2. Java语言对于大数据而言是什么样的存在?
  3. RedisDesktopManager源码编译windows版(基于2022.1版本)
  4. 唯智信息:制造业如何在物流4.0时代更好地智能化发展
  5. 从 RDO到 ADO 的移植 (转)
  6. Zemax学习笔记(9)- 双胶合透镜消除色差的实例
  7. android 1像素变粗,一亿像素的意义:聊聊图像采样与重建
  8. 某网站登录页面存在用户手机号信息泄露
  9. 手机与座机号码正则表达式/特殊字符
  10. C# 生成单色图的代码