历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | ATmega16计算器代码(数码管显示)

2019-10-17 来源:51hei

单片机源程序如下:

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


    /**计数器按键**

        

    (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;

推荐阅读

史海拾趣

台湾远翔(Feeling Technology)公司的发展小趣事

乔光电子成立于2009年,起初专注于过压、过流保护元器件的研发、生产和销售。公司凭借对技术的执着追求和对市场的敏锐洞察,迅速在行业内站稳脚跟。在创立初期,乔光电子就建立了先进的EMC实验室,致力于为客户提供顶级性能的过压、过流保护元器件和完整的电路保护解决方案。这一时期,乔光电子在福建和东莞建立了生产基地,为后续的快速发展奠定了坚实基础。

Cal-Chip Electronics公司的发展小趣事

随着公司实力的不断增强,Cal-Chip Electronics公司开始将目光投向国际市场。在XXXX年,公司成功开拓了欧洲市场,并在当地设立了分支机构。随后,公司又陆续进入北美、亚洲等多个国家和地区,实现了业务的全球化布局。在国际市场的拓展过程中,公司不仅提升了品牌知名度,也积累了丰富的国际运营经验。

Excelitas公司的发展小趣事

为了进一步提升竞争力,Excelitas公司积极寻求与其他企业的战略合作。在一次重要的合作中,Excelitas与一家知名的半导体公司达成合作协议,共同开发新型光电传感器。通过资源整合和优势互补,双方成功推出了多款具有竞争力的产品,实现了互利共赢。这次合作不仅增强了公司的技术实力,还为公司带来了新的市场机遇。

ZTE高新兴(Gosuncn)公司的发展小趣事

Excelitas公司自成立以来,一直致力于光电技术的研发与创新。在某次关键的技术突破中,公司成功研发出一种新型高效能LED灯,这种灯在紫外光固化领域具有显著优势。这一技术突破不仅为公司赢得了市场份额,还确立了Excelitas在光电领域的领先地位。公司随后围绕这一技术,推出了一系列相关产品,进一步巩固了市场地位。

Brainboxes公司的发展小趣事

Brainboxes一直注重与客户建立紧密的合作关系。公司深入了解客户的需求和应用场景,为其提供定制化的解决方案。此外,Brainboxes还积极参与工业连接领域的发展,与多家知名企业建立合作关系,共同推动行业的技术进步和应用创新。这种客户亲密度和工业连接能力使得Brainboxes在市场竞争中占据有利地位。

Hong Kong X'Tals Ltd公司的发展小趣事
在高负载或长时间工作的情况下,需要关注LM122的散热问题,以避免过热导致性能下降或损坏。

问答坊 | AI 解惑

模拟设计与验证工具现状

大约从20世纪80年代起,就有许多业内专家宣称模拟电路已走进死胡同,而数字应用将在电子世界中大放异彩,包括用在通信上的集成电路(integrated circuits,ICs)。在现实中,当然,现代化的通信系统同时需要将模拟及数字功能复杂地融合在一起。 不 ...…

查看全部问答>

技术以外的功夫

技术以外的功夫 这个社区大部分都是学生,且大部分都是为了学技术而来,很多人也许还没有太多职业经历,所以下面这篇以前写的非技术性文章,也许能给大家一点不同的提示和启发。     记得看过冯仑的“赚钱以外的功夫”有感而发,写写 ...…

查看全部问答>

vxworks源码问题???

在BSP文件configAll.h中,对于非ROM驻留型映像的堆栈定义如下两种: 堆栈向下增长:#define STACK_ADRS        _romInit 一直对这个定义有疑问,_romInit不是定义在ROM中吗?怎么映射到RAM的地址中呢?没有看到显 ...…

查看全部问答>

wince 编译问题

大伙或许对编译比较模糊 这是我对explorer编译时的观察记录 Build for Windows CE (Release) (Built on Apr 14 2005 13:54:39) File names: Build.log Build.wrn Build.err Build.dat BUILD: [Thrd:Sequence:Type  ] Message B ...…

查看全部问答>

想用PROTEL99做电路设计,遇到安装问题

安装protel 99时出现的错误信息为:Error extracting support files:服务器运行失败 请问这是因为什么? 如何处理,是不是需要安装什么WINXP的组件或者服务?…

查看全部问答>

嵌入式vxworks技术交流群:20640047

嵌入式vxworks技术交流群:20640047…

查看全部问答>

我将以前的MIDI键盘程序弄到万利的STM32板上来了,哈哈~~~

代码看得比较晕,经过一个晚上加一个上午的奋斗,终于把程序改好了~~~~ 我是拿原来的USB摇杆的那个程序来改的,所以里面还有很多原来的摇杆方面的东东, 懒得去改它了,能用就行了。 源代码包下载: https://bbs.eeworld.com.cn/upfiles/img/20 ...…

查看全部问答>

LM3S9B92 ADC采样频率问题

SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);  //设置ADC采样速率,每秒采样125千次;这个命令是指采样频率还是设置了采样频率的上限?如果在后面使用处理器触发时,即SysCtlSleep();//使处理器进入睡眠模式      &n ...…

查看全部问答>