STC学习:导航按键

效果
程序设计目标:利用STC15F2K60S2芯片的ADC口对来自导航按键不同方向的电压值进行采集,并将采集后的转换结果用数码管显示。程序主要是对ADC进行操作,并将寄存器相应位取出分别用8位二极管和数码管显示。第一位数码管显示8位转换结果中前三位值,最后两位数码管显示后五位值。数码管下方的发光二极管与数码管对应显示。
程序运行效果说明:根据用户对导航按键的操作情况,相应产生的ADC转换结果,在数码管最高位(命名Seg0)显示转换结果高三位,点亮对应的发光二极管L7—L5。数码管后两位(命名Seg6-Seg7)显示转换结果低五位,点亮对应的发光二极管L4—L0。具体显示情况如表1所示。注:实际数值如果有一点误差,是由于电阻的工艺使得电阻会有一定的误差,关系不大,我们在做导航按键的判断时,都只是取高三位的值,也就是数码管Seg0的值。

                                                按键3对应的数码管及二极管显示情况对照表

在这里插入图片描述

程序实现相关电路及工作原理说明
1.导航按键电路及工作原理说明
本案例需要使用ADC进行导航按键的电压采集,并将采集后的转换结果送到数码管及发光二极管的显示。
在这里插入图片描述
导航按键在上图的标注为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.数码管和发光二极管说明
数码管和发光二极管的具体电路和工作原理说明请参考“流水灯测试”和“8位数码管动态扫描测试”。这个案例中,使用了一个技巧将发光二极管和3位数码管进行同时显示:将发光二极管作为数码管位选的第四位,从而在数码管显示的同时,发光二极管也能同时显示。

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

代码如下:

#include<STC15F2K60S2.H>
#include<intrins.h>              //_cror_();
#define uint unsigned int
#define ulint unsigned long
#define uchar unsigned char
#define ADC_FLAG 0x10
sbit sbtSel0=P2^0;
sbit sbtSel1=P2^1;
sbit sbtSel2=P2^2;//位选
sbit sbtLedSel=P2^3;
uint uiSampleNum=0;//采样次数
ulint uiAdSum=0;//AD值累加和
uint uiAdDate8=0;//AD值八位数据
uint uiAdHigh3=0;//AD值高3位
uint uiAdLow5=0;//AD值高5位
uchar ucSegState;//数码管扫描状态
//段选
char arrSegSelect[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//位选
uchar arrDigSelect[]={0x00,0x06,0x07};
//初始化单片机SYS
void InitSYS()
{
    P0M1=0x00;
    P0M0=0xff;
    P2M1=0x00;
    P2M0=0x0E;
    ucSegState=0;
    TMOD=0x00;//中断设置
    EA=1; 
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    ET0=1;
    TR0=1;//启动定时器
}
//初始化ADC
void InitADC()
{
    P1ASF=0x80;//选择P1.7作为A/D使用=>可以检测到KEY3按下后的低电平
    ADC_RES=0;//清零ADC寄存器
    ADC_CONTR=0X8F;//打开POWER 540周期转换一次 选择P1.7作为A/D输入来用
    CLK_DIV=0X00;//ADRJ=0 ADC_RES存放高8位结果
    EADC=1;//允许ADC中断
    PADC=1;//ADC中断优先级为1
}
void Divide3and5()//分离AD转换结果的高3位
{
    uiAdHigh3=uiAdDate8&0xE0;//将8位转换结果的低5位清除
    uiAdHigh3=_cror_(uiAdHigh3,5);//循环右移5位
    uiAdLow5=uiAdDate8&0x1F;//将8位转换结果高3位清零
}
void T0_Process()interrupt 1//定时器T0中断
{
    ucSegState++;
    if(ucSegState==4)
        ucSegState=0;
    P0=0x00;
    switch(ucSegState)
    {
        case 0:
            sbtLedSel=0;//选择数码管亮
            P2=arrDigSelect[ucSegState];
            P0=arrSegSelect[uiAdHigh3];//显示高三位对应的十进制
            break;
        case 1:
            sbtLedSel=0;
            P2=arrDigSelect[ucSegState];
            P0=arrSegSelect[uiAdLow5/10];//显示低五位对应的十进制的十位
            break;
        case 2:
            sbtLedSel=0;
            P2=arrDigSelect[ucSegState];
            P0=arrSegSelect[uiAdLow5%10];//显示低五位对应的十进制的个位
            break;
        case 3:
            sbtLedSel=1;
            P0=uiAdDate8;//发光二极管亮
            break;
    }
}
void ADC_Process()interrupt 5//ADC中断处理
{
    IE=0x00;//关闭中断
    ADC_CONTR&=~0X10;//ADC_FLAG清零
    uiSampleNum++;
    if(uiSampleNum>1000)//采集数据1000次后
    {
        uiAdDate8=(uiAdSum+500)/1000;//四舍五入
        Divide3and5();//分离高3位AD值
        uiSampleNum=0;
        uiAdSum=0;
    }
    uiAdSum+=ADC_RES;
    ADC_CONTR|=0X08;//将ADC_START置位
    IE=0xa2;//重新打开中断
}
void main()
{
    InitSYS();
    InitADC();
    while(1);
}

说明:
头文件<intrins.h>中,包含两个函数:

_crol_(var,n):将var循环左移n位
_cror_(var,n):将var循环右移n位
  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STC8G1K08是一款具有按键功能的单片机芯片。在使用该芯片进行按键程序设计时,主要需要完成两个步骤:硬件配置和软件编程。 首先,进行硬件配置。首先需要将按键连接到芯片的GPIO引脚上。可以选择使用外部上拉电阻或下拉电阻来实现按键的稳定工作。接下来,需要在代码中配置相应的GPIO引脚为输入模式,以便读取按键状态。 其次,进行软件编程。首先,需要设置按键的检测方式,可以选择轮询检测或中断检测。轮询检测是在主程序中周期性地读取按键状态,而中断检测是在按键状态发生变化时触发中断函数。 对于轮询检测,可以使用一个循环,在每次循环中读取按键状态,并进行相应的处理。例如,当按键被按下时,可以执行某个操作,比如改变LED的状态等。 对于中断检测,首先需要在代码中配置相应的中断向量和中断优先级。当按键状态发生变化时,中断函数会被触发,可以在中断函数中进行相应的处理,比如改变LED的状态。 在按键程序设计中,还需要考虑到按键的消抖问题。可以使用软件消抖或硬件消抖的方式来解决。软件消抖是在读取按键状态之前进行一段延时,以排除按键抖动的影响。硬件消抖是通过添加RC电路或者使用专用的按键芯片来实现按键的消抖。 总结起来,针对STC8G1K08芯片的按键程序设计,需要进行硬件配置,包括按键的连接和GPIO引脚的配置;同时需要进行软件编程,包括选择合适的检测方式(轮询或中断)、处理按键状态变化以及解决按键抖动等问题。通过以上步骤,可以实现按键功能的正常运行。 ### 回答2: STC8G1K08是一款由STC微控制器公司生产的微控制器芯片。编写一个按键程序,一般包括以下几个步骤: 1. 引入头文件:在程序开头引入相关的头文件,以便可以使用对应的寄存器和函数。 2. 初始化按键:通过设置相关的引脚为输入模式和上拉/下拉电阻,来实现对按键的初始化。 3. 主循环中检测按键状态:在主循环中通过读取按键引脚的状态,来判断按键是否被按下。 4. 处理按键事件:如果按键被按下,则执行相应的操作。可以是改变某个状态、发送信号、触发中断等。 5. 延时:在按键被按下后,可以添加一段适当的延时,以避免按键的抖动现象。 6. 返回主循环:处理完按键事件后,返回主循环,等待下一次检测按键状态。 需要注意的是,具体的按键程序的编写还需根据具体的硬件电路和功能需求进行适配和扩展。以上仅为一个基本的框架,实际应用中还需根据具体情况进行调整和优化。 ### 回答3: STC8G1K08是华天微电子推出的一款单片机芯片,一般用于嵌入式系统中。编写按键程序时,主要涉及到按键检测、按键响应等方面。 首先,我们需要确定按键的硬件连接。STC8G1K08芯片通常会有多个I/O口可用于连接按键,需要根据实际情况选择合适的I/O口。同时,应在按键的位置上加入合适的上下拉电阻,以确保按键在按下和松开时的信号稳定。 其次,我们需要编写按键检测的代码。可以通过轮询的方式来检测按键的状态。可以设置一个定时器,在定时器中断中读取按键状态。如果检测到按键被按下,就可以进行相应的处理。 当检测到按键被按下后,可以进行一些按键响应的操作。比如可以在按键按下时点亮LED灯,发送一个信号给其他模块进行控制等。需要根据实际需求来确定按键的响应方式。 在编写按键程序时,还需要考虑防抖处理。由于按键机械结构的原因,按键在按下和松开的瞬间可能会有抖动现象。为了避免这种抖动对按键程序的影响,可以在软件中增加一个延时,使得在检测到按键状态变化后等待一段时间再进行处理。 最后,需要注意按键程序的实时性。当按键被按下时,可以通过立即处理按键的事件来提高响应速度。在处理按键事件时,可以设置一个标志位,表示按键已经被按下,在主程序中根据这个标志位来执行相应的按键操作。 综上所述,编写STC8G1K08的按键程序需要考虑硬件连接、按键检测、按键响应、防抖处理等方面的内容。在实际应用中,可以根据具体需求来进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布布要成为最负责的男人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值