单片机源程序如下:

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


    /**计数器按键**

        

    (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定时器的具体使用

推荐阅读

    根据最新的市调报告指出,在全球普通消费者的SSD市场中,中国企业的影响力已经逐渐增强,三星电子、SK海力士等韩国企业则主攻收益性相对高的B2B(企业间交易)事业,中国大陆和台湾企业反而快速的吞下普通消费者市场,反观美国等NAND闪存制造企业对SSD市场影响度则逐渐降低。SSD是一种使用NAND闪存半导体,作为储存信息使用,拥有低功耗、无噪音的特...
  本文分析了传统滤波器方法在处理非平稳信号时的缺点,研究了小波去噪的原理和方法,研究了利用LabVIEW 和Matlab混合编程的方法,将LabVIEW完美的图形编程技术和Matlab强大的的数学解算功能结合起来,实现了小波降噪的数学建模和信号图像显示。通过对振动冲击信号的滤波处理,表明了小波降噪方法在处理非平稳信号时的有效性。  0 引言  信号降噪是...
三星官方宣布,三星 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 采...
10月15日晚,广和通发布公告称,前三季度实现营收28.5亿元,同比增长45.03%;归属于上市公司股东的净利润为3.23亿元,同比增长44.45%。其中,第三季度实现营收10.32亿元,同比增长47.16%;归属于上市公司股东的净利润为1.21亿元,同比增长39.94%。报告期内,广和通拟向深圳市创新投资集团有限公司、深圳前海红土并购基金合伙企业(有限合伙)、深圳建华开...

史海拾趣

问答坊 | AI 解惑

国际汽车改装展/华南最大汽车改装展/2009汽车改装展/汽车改装展/广州汽车改装展

2009第七届中国(广州)国际汽车改装展暨2009广州房车、旅居车、礼宾车展览会 时间:2009年2月23-25日     地点:中国·广州琶洲国际采购中心 批准举办:中华人民共和国商务部 主办单位:中国对外贸易经济合作企业协会 中汽 ...…

查看全部问答∨

初始化SD卡时,等待卡退出空闲状态超时错误,总是在这里卡住,都快郁闷死了,高人指点一下!

在ZLG的SmartARM2200上做SD卡的读卡器实验,用的是uC/OS系统和ZLG_SD驱动。总是在卡初始化时返回“SD_ERR_TIMEOUT_WAITIDLE 0x34”错误,不知道为什么?SD卡是Kingstone 2G的。 …

查看全部问答∨

yl2440板子的扩展串口16c2550的驱动问题。请高赐教。

开发板是YL2440。扩展串口的驱动用wince自己的16C550的驱动。现在的情况是可以发送,但是不能接收。是什么原因,高手们赐教。…

查看全部问答∨

vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存?

vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存?…

查看全部问答∨

添加驱动的疑惑

1、我添加了一个流驱动,选择build and sysgen后,编译到最好报错,错误如下: Error:Could not find \'c:\\wince500\\pbworkspaces\\s3c2440\\smdk2440_arm4i_release\\ad.dll\'on disk\\ Error: failed setting line makeimg: fatal error:co ...…

查看全部问答∨

请教大家一个关于linux打印机驱动的问题

请问:在嵌入式linux中,打印机驱动有没有可能做到支持几乎所有型号的打印机,如果可行,请给点建议,如果不行,也请给点原因,谢谢了,小弟刚开始接触这行,老师要求,调查下这个问题:)…

查看全部问答∨

STM32f103Z串口的奇偶校验是不是有问题?

                                 试验中发现串口设为奇、偶校验数据传输不正确,不知为何?发0x01&nbsp;&nbsp;接收到0x81…

查看全部问答∨

怎样将MCLK的时钟源设置为LFXT1?

在寄存器FLL_CTL1中将SELM设置为11b后,OFIFG总是会自动置位,而且选择失败,MCLK始终为DCOCLK,快崩溃了,怎么弄啊?…

查看全部问答∨

体积最小的步进驱动控制器带有CAN总线

◆     PANdrive系列:控制器+驱动器+电机(步进,直流无刷)+编码器  PANdrive系列产品是一种智能产品集成了控制器,驱动器,电机,磁编码器与一体此外支持如USB,RS232,RS485,CAN等多种通讯方式。外部只需要提供 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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