单片机源程序如下:

/**********************************************************************/


    /**计数器按键**

        

    (1) (2) (3) (4)

        (5) (6) (7) (8)

        (9) (0) (C) (=)

        (+) (-) (*) (/)

        

        10:清零 11:确认 12:加 13:减 14:乘 15:除

        

**********************************************************************/

//头文件

#include    //包含型号头文件

#include   //包含"位"操作头文件

//宏定义

#define uchar unsigned char

#define uint unsigned int

//定义按键返回值

unsigned char keyvalue;

//定义数码管段码(共阳)

uchar LED[]= 

{        

        0xC0,0xF9,0xA4,0xB0,

        0x99,0x92,0x82,0xF8,

        0x80,0x90

};

//定义数码管位的控制端

uchar tab[]={0,0,0,0}; 

//IO端口初始化

void IO_init(void)         

{          

         DDRA = 0XFF;

         DDRB = 0XFF;

         DDRC = 0XFF;

         DDRD = 0XF0; 

        PORTA = 0X00;

        PORTB = 0X00;

        PORTC = 0X08;

        //PORTD = 0XFF;

}

//8M晶振下,延时1ms

void delayms(uint z)  

{

         uint x,y;

         for(x=z;x>0;x--)

                  for(y=1333;y>0;y--);

}

//数码管显示

void display(uint num)

{

        tab[0]=num%10;                   //取个位数

        tab[1]=num/10%10;        //取十位数

        tab[2]=num/100%10;        //取百位数

        tab[3]=num/1000%10; //取千位数

        

        if(num<=9)//检测为小于等于9的在个位数显示

        {

                 PORTA=LED[tab[0]];

                PORTC=0x08;

                delayms(1);

        }

        if(num>9&&num<=99)//检测为大于9与小于等于99在个十位显示

        {

                 PORTA=LED[tab[0]];

                PORTC=0x08;

                delayms(1);

                PORTA=LED[tab[1]];

                PORTC=0x04;

                delayms(1);

        }

        if(num>99&&num<=999)//检测为大于99与小于等于999在个十百位显示

        {

                 PORTA=LED[tab[0]];

                PORTC=0x08;

                delayms(1);

                PORTA=LED[tab[1]];

                PORTC=0x04;

                delayms(1);

                PORTA=LED[tab[2]];

                PORTC=0x02;

                delayms(1);

        }

        if(num>999&&num<=9999)//检测为大于999与小于等于9999在个十百千位显示

        {

                 PORTA=LED[tab[0]];

                PORTC=0x08;

                delayms(1);

                PORTA=LED[tab[1]];

                PORTC=0x04;

                delayms(1);

                PORTA=LED[tab[2]];

                PORTC=0x02;

                delayms(1);

                PORTA=LED[tab[3]];

                PORTC=0x01;

                delayms(1);

        }

}

//按键扫描

int key_scan(void)

{

         uint j;//按键循环次数变量定义

        PORTD=0xEF;// PD端口输出 1111 1110

        for(j=0;j<5;j++)//按键检测4次

        if((PIND&0x0F)!=0x0F)//按键检测

        {

                 delayms(20);//延时消抖

                if((PIND&0x0F)!=0x0F)//再次检测

                {

                         if((PIND&0x01)==0)        //第一个按键按下

                        keyvalue=1;                        //返回按键值 1

                        if((PIND&0x02)==0)        //第二个按键按下

                        keyvalue=2;                        //返回按键值 2

                        if((PIND&0x04)==0)        //第三个按键按下

                        keyvalue=3;                        //返回按键值 3

                        if((PIND&0x08)==0)        //第四个按键按下

                        keyvalue=4;                        //返回按键值 4

                        while((PIND&0x0F)!=0x0F);//等待按键释放

                }

        }

        PORTD=0xDF;

        for(j=0;j<5;j++)

        if((PIND&0x0F)!=0x0F)

        {

                 delayms(20);

                if((PIND&0x0F)!=0x0F)

                {

                         if((PIND&0x01)==0)

                        keyvalue=5;

                        if((PIND&0x02)==0)

                        keyvalue=6;

                        if((PIND&0x04)==0)

                        keyvalue=7;

                        if((PIND&0x08)==0)

                        keyvalue=8;

                        while((PIND&0x0F)!=0x0F);

                }

        }

        PORTD=0xBF;

        for(j=0;j<5;j++)

        if((PIND&0x0F)!=0x0F)

        {

                 delayms(20);

                if((PIND&0x0F)!=0x0F)

                {

                         if((PIND&0x01)==0)

                        keyvalue=9;

                        if((PIND&0x02)==0)

                        keyvalue=0;

                        if((PIND&0x04)==0)

                        keyvalue=10;

                        if((PIND&0x08)==0)

                        keyvalue=11;

                        while((PIND&0x0F)!=0x0F);

                }

        }

        PORTD=0x7F;

        for(j=0;j<5;j++)

        if((PIND&0x0F)!=0x0F)

        {

                 delayms(20);

                if((PIND&0x0F)!=0x0F)

                {

                         if((PIND&0x01)==0)

                        keyvalue=12;

[1] [2] [3]
关键字:ATmega16  计算器  数码管显示 引用地址:ATmega16计算器代码(数码管显示)

上一篇:AVR单片机简单计算器的Proteus仿真实现+源码
下一篇:AVR定时器—关于16位的timer1定时器的具体使用

推荐阅读

1、开启AFIO时钟:RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO, ENABLE)2、改变指定管脚的映射GPIO_Remap_SWJ_Disable,SWJ完全禁用(JTAG+SW-DP):GPIO_PinRemapConfig (GPIO_Remap_SWJ_Disable, ENABLE)3、改变指定管脚的映射GPIO_Remap_SWJ_JTAGDisable,JTAG-DP禁用+SW-DP 使能:GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE)注意:注意顺序,一定要先使能复用时钟,再失能JATG。
昨天是realme X2 Pro发布的日子,该机虽然极具市场竞争力,但是由于PPT出现错误,引发热议,在昨天晚间realme CMO徐起正式发表致歉声明。徐起表示真诚向公众道歉,并下架了所有错误视频及图片信息,未来在使用或展示地图前,会严格核对,会提交自然资源主管部门审核。以下是致歉声明原文:郑重道歉在10月15日产品发布活动中,我们在PPT的地图素材使用上...
三星官方宣布,三星 Galaxy S20 FE 5G 新品发布会将于 2020 年 10 月 16 日 19:30 举行。IT之家曾报道,三星 Galaxy S20 FE 9 月底海外发布。三星 Galaxy S20 粉丝版有 LTE 和 5G 两种版本,三星 Galaxy S20 FE 5G 采用的是骁龙 865 芯片组,三星 Galaxy S20 FE 4G 则搭载 Exynos 990。三星 Galaxy S20 FE 采...
按往年惯例,三星应该在8/9月份推出新一代 Galaxy Note 系列旗舰,不过很可惜今年的 Note 系列已被官方取消。但从近期爆料来看,全新的三星 Galaxy S22 Ultra 将会在外观以及部分配置上继承 Galaxy Note 系列的特色。IT之家曾报道,三星 Galaxy S22系列已通过3C 认证,显示依然配备了25W 快充,充电器可自由选配。@WaqarKhanHD 现公布了一系列...

史海拾趣

问答坊 | AI 解惑

有没有对isp下载线感兴趣的~~~

有没有对isp下载线感兴趣的~~~ …

查看全部问答∨

PID控制

一直不怎么明白PID的运算输出结果怎么换算成执行机构的控制量,例如通过PWM控制电机的转速,很多书上都讲PID,但是从来没发现有哪一本书仔细讲清PID的运算结果通过怎样处理换算成实际的控制量,例如直流电机通过PWM调压控制转速,假如设定值为S,测量值为 ...…

查看全部问答∨

单片机学习秘诀

很多想学单片机的人问我的第一句话就是怎样才能学好单片机?对于这个问题我今天就我自己是如何开始学单片机,如何开始上手,如何开始熟练这个过程给大家讲讲。 先说说单片机,一般我们现在用的比较多的的MCS-51的单片机,它的资料比较多,用的人也 ...…

查看全部问答∨

矢量控制的几个物理量解释

磁通,磁动势,磁势,磁链,转子归算,磁场定向, 有明白可以回帖…

查看全部问答∨

转载:硬件工程师面试试题及答案

转载:硬件工程师面试试题及答案 [ 2010-7-13 6:19:00 | By: master0722 ]   模拟电路 1、基尔霍夫定理的内容是什么? 基尔霍夫定律包括电流定律和电压定律 电流定律:在集总电路中,任何时刻,对任一节点, ...…

查看全部问答∨

串口信息如下,请高手分析~

MMC::MMCCommandResponse: MMCSendCommand error, command = 17 MMC::MMCCommandResponse: Command Response Error MMCRead: MMCCommandResponse error on READ_SINGLE_BLOCK! read error SDHC: command response timeout CTO! MMC::MMCComman ...…

查看全部问答∨

谁具有输入法编程基础,请联系041181988118,有私活

谁具有输入法编程基础,请联系041181988118,有私活…

查看全部问答∨

51单片机移植uC/OS-II编译出错

本人在编译uC/OS-II的时候,出现了一个比较难缠的编译错误,望高手指点! 先看OS_CPU.H文件,该头文件包含与cpu有关的定义 typedef unsigned char  INT8U;         //无符号8位数 复制代码 OS_CFG.H文件 ...…

查看全部问答∨

問,斷電保護中的備用電池一般是什麼電池?有5V的電池嗎?

查了下,好像是镍镉電池,有3.6V的,不知有沒有5V的??…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved