程序设计目标及运行效果说明
程序设计目标:利用IAP15F2K60S2芯片的ADC口对来自导航按键不同方向的电压值进行采集,并将采集后的转换结果获取高三位值,将此值作为导航按键方向判断标准。程序主要是将导航按键和数字按键综合控制数码管,区别导航按键和数字按键的区别。

程序运行效果说明:
导航按键的上键:控制数码管上数字的数值增加1;
导航按键的下键:控制数码管上数字的数值减少1;
K1键:数码管上的数字右移一位;
K2键:数码管上的数字左移一位;
K3键:按一下K1,K2键锁死,再按一下K1,K2键解锁。

程序实现相关电路及工作原理说明
本案例需要使用ADC进行导航按键的电压采集,并将采集后的转换结果送到数码管及发光二极管的显示。
1.导航按键电路及工作原理说明

导航按键在上图的标注为MINI_KEY5,导航按键的每一个方向被按下,都会引起实际电压的改变,从而根据这个原理,与A/D转换器配合,可以判断哪个部位被按下,获取按下后A/D转换的结果。

2.AD数据采集电路及采集步骤说明

ADC数据采集的步骤:
1.将ADC0~7的模拟量送到比较器中,用DAC(数/模转换器)转换的模拟量与输入的模拟量通过比较器进行比较。
2.转换结束后,将比较结果放入转换结果寄存器(ADC_RES和ADC_RESL)。
3.同时,需要将ADC_FLAG软件清零。
4.注意硬件会自动将ADC_START清零,如果需要进行下一次转换,则需要将ADC_START置位。

特别说明:

(1)数码管所显示的ADC转换结果并不是电压值,而是电压进行转换后所得的一个值。如果需要实际的电压值可以参照STC15F2K60S2数据手册的760页上面的公式进行计算得出。

(2)ADC转换结果是一个10位数据,若ADRJ=0,则ADC_RES存放高八位,ADC_RESL存放低两位。若ADRJ=1,则ADC_RESL存放低八位,ADC_RES存放高两位。本案例采用的是ADRJ=0,而且只取了高八位结果。

3.数码管与发光二极管说明
这个案例中,使用了一个技巧将发光二极管和3位数码管进行同时显示:将发光二极管作为数码管位选的第四位,从而在数码管显示的同时,发光二极管也能同时显示。

测试方法
(1)用STC ISP默认设置,打开工程中的HEX并下载

(2)下载后观察现象为:(从左至右边的数码管依次命名为Seg0~Seg7,Seg0 = L7~L5, Seg(6-7) = L4~L3)

用途
可以作为按键控制时钟,收音机等。

代码如下:

#include<STC15F2K60S2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define cstAdcPower 0X80     /*ADC电源开关*/
#define cstAdcFlag 0X10      /*当A/D转换完成后,cstAdcFlag要软件清零*/
#define cstAdcStart 0X08     /*当A/D转换完成后,cstAdcStart会自动清零,所以要开始下一次转换,则需要置位*/
#define cstAdcSpeed90 0X60   /*ADC转换速度 90个时钟周期转换一次*/
#define cstAdcChs17 0X07     /*选择P1.7作为A/D输入*/
sbit sbtLedSel=P2^3;     /*数码管和发光二极管选择位*/
sbit sbtSel0=P2^0;
sbit sbtSel1=P2^1;
sbit sbtSel2=P2^2;
sbit sbtKey1=P3^2;
sbit sbtKey2=P3^3;
uchar ucSegSelectState;         /*段选标志*/
uchar ucDigSelectState;         /*位选标志*/
bit btKey3Flag;             /*key3键按下标志*/
//0123456789ABCDEF
uchar arrSegSelect[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
//选择哪一位数码管
uchar arrDigSelect[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void Init()//初始化
{P0M1=0x00;P0M0=0xff;P2M1=0x00;P2M0=0xff;sbtLedSel=0;      //选择数码管作为输出P1ASF=0x80;       //P1.7作为模拟功能A/D使用ADC_RES=0;        //转换结果清零ADC_CONTR=0x8F;   //cstAdcPower=1CLK_DIV=0X00;     //ADRJ=0    ADC_RES存放高八位结果btKey3Flag=0;ucDigSelectState=0;ucSegSelectState=0;IT0=0;            //设置IT0上升沿触发IT1=0;EA=1;             //CPU开放中断
}
void Delay5ms()     //@11.0592MHz  延时5ms
{unsigned char i,j;i=54;j=199;do{while(--j);}while (--i);
}
void Delay100ms()       //@11.0592MHz  延时100ms
{unsigned char i,j,k;_nop_();_nop_();i=5;j=52;k=195;do{do{while(--k);}while(--j);}while(--i);
}
/*---------获取AD值子函数--------*/
unsigned char GetADC()
{uchar ucAdcRes;ADC_CONTR=cstAdcPower|cstAdcStart|cstAdcSpeed90|cstAdcChs17;//没有将cstAdcFlag置1,用于判断A/D是否结束_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&cstAdcFlag)); //等待直到A/D转换结束ADC_CONTR&=~cstAdcFlag;           //cstAdcFlagE软件清0ucAdcRes=ADC_RES;                 //获取AD的值return ucAdcRes;
}
/*---------获取导航按键值子函数--------*/
uchar NavKeyCheck()
{unsigned char key;key=GetADC();     //获取AD的值if(key!=255)    //有按键按下时{Delay5ms();key=GetADC();if(key!=255)            //按键消抖 仍有按键按下{key=key&0xE0;       //获取高3位,其他位清零key= _cror_(key,5); //循环右移5位 获取A/D转换高三位值,减小误差return key;}}return 0x07;        //没有按键按下时返回值0x07
}
/*---------导航按键处理子函数--------*/
void NavKey_Process()
{uchar ucNavKeyCurrent;  //导航按键当前的状态uchar ucNavKeyPast;     //导航按键前一个状态ucNavKeyCurrent=NavKeyCheck();    //获取当前ADC值if(ucNavKeyCurrent!=0x07)       //导航按键是否被按下 不等于0x07表示有按下{ucNavKeyPast=ucNavKeyCurrent;while(ucNavKeyCurrent!=0x07)        //等待导航按键松开ucNavKeyCurrent=NavKeyCheck();switch(ucNavKeyPast){case 0x00:                     //K3if(btKey3Flag==0)btKey3Flag=1;elsebtKey3Flag=0;break;case 0x05:                     //上键:显示的数字加1if(ucSegSelectState==15)ucSegSelectState=0;elseucSegSelectState++;break;case 0x02:                     //下键:显示的数字减1if(ucSegSelectState==0)ucSegSelectState=15;elseucSegSelectState--;break;}}Delay100ms();
}
void main()
{Init();P0=0x00;while(1){NavKey_Process();         //获取按键按下情况P2=arrDigSelect[ucDigSelectState];           //显示位P0=arrSegSelect[ucSegSelectState];       //显示数字if(btKey3Flag==0)   //KEY3=0则K1,K2键解锁,否则K1,K2键锁死{if(sbtKey1==0)    //sbtKey1按下,显示位右移一位{Delay5ms();if(sbtKey1==0){while(!sbtKey1);if(ucDigSelectState==7)ucDigSelectState=0;elseucDigSelectState++;}}if(sbtKey2==0)   //sbtKey2按下,显示位左移一位{Delay5ms();if(sbtKey2==0){while(!sbtKey2);if(ucDigSelectState==0)ucDigSelectState=7;elseucDigSelectState--;}}}}
}

STC学习:导航按键与数字按键综合控制数码管相关推荐

  1. STC学习:可校准的实时时钟

    程序设计目标及程序运行效果说明 程序设计目标:通过DS1302芯片.晶振.电池和数码管实现实时时钟的数码管显示,并实现实时时钟的时间的准确校准. 程序运行效果说明:将程序下载至芯片,数码管会出现实时的 ...

  2. 湖南大学STC学习板导航键的使用

    前言:发现STC板子上的按键不够用了,想着用导航键,但无奈在网上找了很久都没有任何一个字眼是关于STC学习板导航按键的使用和详细的代码.今天下午我帅帅的学长教会了我如何去使用导航键,为了更好的巩固和理 ...

  3. STM32学习:按键控制LED

    STM32学习:按键控制LED 文章目录 前言 一.所用知识点复习 1.stm32工作模式(*注意上下拉输入的区别*) 2.按键抖动与常见按键接法 按键抖动: 按键消抖: 常见按键接法: 3.GPIO ...

  4. 单片机学习笔记 —— 导航按键

      在ADC模数转换的基础上,我们可以设计一个导航按键案例,通过将模拟电压转化为数字电压,根据数字电压值进行相应的处理. 一.导航按键电路 电流图: 说明:左边有6个电阻,加起来700Ω,当按下/松开 ...

  5. HNU小学期计算机系统设计与创新基础训练——基于STC学习板的加密信息存储与游戏操作系统(第一部分设计思路+基础原理)

    HNU小学期计算机系统设计与创新基础训练--加密信息存储与游戏操作系统 一. 选题名称 二. 选题背景 三. 实现功能 1. 主要功能 2. 细节设计 四. 设计思路 五. 基本原理 1. 数码管与发 ...

  6. 一个按键控制数码管的开和关_基于FPGA的数字电路实验3:点亮数码管

    今天我们任务是通过小脚丫板载的两个数码管来显示字符,所以首先我们要了解一下数码管的基本工作原理,接下来再研究怎么通过捣鼓小脚丫把数码管给点亮,并且显示出有效信息. 小脚丫板载的数码管是7段数码管(如果 ...

  7. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...

    基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文) 物理与电子工程学院2014级课程设计 PAGE IV 物理与电子工程学院 <单片机原理与接口技术> 课程设计报告书 ...

  8. 基于深度强化学习的智能船舶航迹跟踪控制

    基于深度强化学习的智能船舶航迹跟踪控制 人工智能技术与咨询 昨天 本文来自<中国舰船研究> ,作者祝亢等 关注微信公众号:人工智能技术与咨询.了解更多咨询! 0.   引 言 目前,国内外 ...

  9. 最简单DIY基于ESP8266的智能彩灯②(在网页用按键和滑动条控制RGB灯)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键 ...

  10. 应广单片机PFS123按键中断控制数码管显示例程

    目录 应广单片机PFS123按键中断控制数码管显示视频 led数码管图片 应广单片机PFS123按键中断控制数码管显示代码 应广科技网址,开发工具,PMS123规格书:http://www.padau ...

最新文章

  1. 安卓中实现两端对齐,中间fill_parent的方法
  2. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
  3. MySQL如何修改表的储存方式_修改mysql默认存储引擎的方法
  4. 初见akka-02:rpc框架
  5. 【Python】Python3.7.3 - 虚拟环境:pyvenv过时;使用python -m venv命令
  6. android地图三段滑动,android – 像谷歌地图一样滑动BottomSheet
  7. 当Github上下载的代码需要安装作者写的库时
  8. [转载] 利用python对csv文件进行简单的数据分析
  9. python降维方法_python大战机器学习——数据降维
  10. MAC可以在.zshrc中修改PATH
  11. StylesheetLanguage--如何使用Less--前端样式语言
  12. win10无法安装迅雷精简版解决办法
  13. 哪里有周末java培训_北京哪里里Java周末学习班
  14. 数商云:打造B2B大宗电商供应链服务系统,落地产业互联网
  15. linux下postgresql创表添加数据
  16. 解决windows电脑蓝屏的方法
  17. VS2010在加载项目时,提示无法打开项目文件, 此安装不支持该项目类型的解决方法
  18. html绘制三维,在HTML + JS画布中绘制三维图形
  19. imagemagick安装问题
  20. Metal Stack(Metal Scheme)

热门文章

  1. 不懂代码也想学会深度学习?这本书告诉你真的很简单
  2. VMware vCenter Server安装与配置
  3. 高速缓存dns/ddns
  4. 软件构架 课堂练习一
  5. 老web换新枝----Sails.js移动设备的全新生产力(一)
  6. 设置Linux中的Mysql不区分表名大小写
  7. 大话数据结构学习笔记-第三章线性表
  8. 什么是ajax?ajax作用是什么?
  9. 一个借口几万条数据但是只返回十条_爬虫实践之爬取10000条菜谱数据
  10. 解析docx C语言,c语言习题解析【含基础知识讲解】.docx