Arduino-Proteus仿真08-按键控制数码管闪烁增减显示

Posted 村头陈师傅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino-Proteus仿真08-按键控制数码管闪烁增减显示相关的知识,希望对你有一定的参考价值。

Arduino-Proteus仿真08-按键控制数码管闪烁增减显示

设计者:STCode(公众号同名)

Arduino-Proteus仿真-按键控制数码管闪烁增减显示


前言:

Proteus是英国Labcenter公司开发的电路分析与实物仿真及印制电路板设计软件,它可以仿真、分析各种模拟电路和集成电路,其提供了大量模拟与数字元器件及外部设备,以及各种虚拟仪器(如电压表、电流表、示波器、逻辑分析仪、信号发生器等),特别是它具有对单片机及其外围电路组成的综合系统交互仿真功能,
目前,Proteus仿真系统支持的主流单片机有ARM7(LPC21xx)、8051/52、AVR、PIC 10/12/16/18/24、MSP430、CotexM0/M3、HC11等,其支持的开发环境有Keil u Vision2/3/4、MPLAB、Atmel Studio等。

提示:

Proteus仿真Arduino中,关于所需硬件获取、软件编译、HEX文件获取、代码导入等问题请参考文章:Arduino-Proteus仿真01-LED灯闪烁

1.练习描述

这次我们通过4个按键可分别实现数字增/减调节,确定及取消调节功能。在调节过程中数码管被设计为闪烁显示,确定后则恢复正常显示,按下取消按键时将恢复调节之前的值。

2.元器件选择

在元件模式中点击P选项,在元件库中搜索所需的元件名称,双击后便可添加到元件清单中。

3.电路连接

4.程序设计

//按键控制数码管闪烁增/减显示
//说明:通过按键加/减数码管所显示的数字,调节过程中数码管闪烁显示
//确定后恢复正常显示,按下取消时将回复到调节之前的值

#define k1_down() (digitalRead(14) == 0)  //加
#define k2_down() (digitalRead(15) == 0)  //减
#define k3_down() (digitalRead(16) == 0)  //确定
#define k4_down() (digitalRead(17) == 0)  //取消

const uint8_t CA_SEGCODE[]=   //0~9共阳数码管段码表
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;
uint16_t count = 2021;   //显示初始值
uint16_t temp;            //临时变量,用于存储按取消键前的已确定的值
uint8_t array[]=0,0,0,0;  //保存数位分解结果的数组
uint8_t adjust = 0;          //标识当前是否处理调节状态
uint8_t pre_key = 0xff;    //保存上次按键状态

uint8_t i,j,t;      //定义变量

void setup()

    DDRD = 0XFF;PORTD = 0XFF;      //数码管段码端口配置
    DDRB = 0XFF;PORTB = 0XFF;      //数码管位码端口配置
    DDRC = 0X00;PORTC = 0XFF;      //按钮输入端口端口设为内部上拉


void loop()

    for(t = 0;t<35;t++)    //正常刷新显示
    
        INT_TO_4Digit(count);     //数为分解
        for(i = 0;i<4;i++)         //4位数码管扫描刷新显示
        
            PORTD = 0XFF;          //先暂时关闭段码
            PORTB = 1 << i;        //输出位码
            PORTD = CA_SEGCODE[array[i]];   //发送段码
            delay(2);                         //延时
        
        key_handle();                         //处理按键
    
    if(adjust)                            //如果处于调节状态,脱离了扫描刷新,数码管开始闪烁
        
            PORTD = 0XFF;                 //关闭所有数码管
            for(t = 0;t < 15;t++)         //在此循环中保持按键响应
            
                delay(10);              //延时
                key_handle();          //处理按键
            
        


//数位分解函数
//使用循环减法分解的速度优于使用/与%分解
void INT_TO_4Digit(uint16_t n)   

    array[0] = 0;
    while(n >= 1000)
    
        array[0]++;
        n -= 1000;
    
    array[1] = 0;
    while(n >= 100)
    
        array[1]++;
        n -= 100;
    
    array[2] = 0;
    while(n >= 10)
    
        array[2]++;
        n -= 10;
    
    array[3] = n;


void key_handle()         //按键处理函数

    if(pre_key == PINC) return;     //按键状态未改变时退出
    pre_key = PINC;                  //保存当前新的按键状态
    //增按键
    if(k1_down())              //按键1按下
    
        delay(10);
        if(k1_down())
        
            if(temp == 0) temp = count;     //备份temp,以便按下取消时还原
            count++;                         //递增
            adjust = 1;                      //进入调节状态
        
    
    //减按键
    else if(k2_down())
    
        delay(10);
        if(k2_down())
        
            if(temp == 0) temp = count;
            count--;                          //递减
            adjust = 1;
        
    
    //确定按键
    else if(k3_down())
    
        delay(10);
        if(k3_down())
        
            adjust = 0;          
            temp = 0;
        
    
    //取消按键
    else if(k4_down())
    
        delay(10);
        if(k4_down())
        
            if(temp)
            
                count = temp;   //还原count
               
            temp = 0;             //temp清零
            adjust = 0;
        
    

对于4位整数的数位分解,程序中使用了循环递减的方法(详见函数–INT_TO_4Digit(uint16_t n)),虽然代码比使用整除及取余运算的代码要复杂一些,但是其分解效果要高于后者。
对于4个按键的处理,加入了消抖语句,以防出现操作不稳定的问题(详见-- key_handle() 仿真过程不加入消抖也不会有影响,但在应用在实物上有必要加入)。
为了增/减调节时数码管出现整体闪烁效果,程序中引入了adjust变量,变量值为1时,则表示进入调节状态,主循环内第二部分的15次循环及延时在跟踪按键操作的同时,由于延时达150ms,故而使数码管出现闪烁现象;主循环第一部分循环次数设置的越大,在150ms的黑屏显示后正常稳定显示的时间就越长。
另外,示例中对于端口的配置、写入、读取这3类操作,没有使用pinMode()\\digitalWrite()\\digitalRead()这3个函数,而是直接针对AVR寄存器进行操作。
Arduino的核心微控制器为Atemga328,其每个IO口相关寄存器有3个,分别是:
1) 数据方向寄存器DDRx
2) 端口数据寄存器PORTx
3) 端口输入引脚地址寄存器PINx
(其中x = B\\C\\D)
pinMode()\\digitalWrite()\\digitalRead() 3个函数分别主要针对DDRx、PORTx、PINx进行操作

5.软件操作

程序编写完成后点击Arduino IDE编译器的文件—首选项,将编译选项勾选上。点击好以后进行编译,编译完成后复制HEX文件所在的路径,复制完成后返回Proteus软件,双击Arduino控制板,在Program File处粘贴HEX文件的路径。点击确定以后即可进行仿真,点击Proteus软件下方运行仿真按钮,可以看到仿真的效果。

源文件请关注公众号“STCode”获取~

以上是关于Arduino-Proteus仿真08-按键控制数码管闪烁增减显示的主要内容,如果未能解决你的问题,请参考以下文章

单片机原理及其应用——单片机控制按键点亮发光二极管

PROTUSE 仿真STM32按键控制LED,按键不起作用

单片机原理及其应用——单片机控制按键依次点亮8只发光二极管

Proteus仿真直流电机方向和速度按键控制

Proteus仿真Arduino UNO按键控制数码管闪烁增/减显示

Proteus仿真Arduino UNO+按键控制2位数码管倒计时