找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1423|回复: 1
打印 上一主题 下一主题
收起左侧

ATMEGA16A 按键数码管

[复制链接]
跳转到指定楼层
楼主
ID:587926 发表于 2019-7-24 12:26 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
* 【编译环境】: ICCAVR  
* 【函数功能】: 按键K5 K6 实现数码管加减1  初始值 8888
* 【晶    振】:  8M               
* 【芯    片】:  ATMEGA16A         
*                                              */   
/******************************************************************************/
      #define uchar unsigned char
          #define uint  unsigned int
          #include <iom16v.h>
          #define Set_Bit(val, bitn)    (val |=(1<<(bitn)))
      #define Clr_Bit(val, bitn)    (val&=~(1<<(bitn)))
      #define Get_Bit(val, bitn)    (val &(1<<(bitn)) )
          
      uchar disbuf[4]={0,0,0,0};
      uchar  discode[10]={ 0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };  //段码表
      uchar  disbit[4]  ={ 0xFE, 0xFD,0xFB,0xF7}; //选通值   
      uchar  Key_Up;
      uchar  Key_Down;
          static uint k=8888;  
/******************************************************************************/
//延时函数
/******************************************************************************/                                                                                                                   
      void delay(void)
           {uint i;
             for(i=0;i<500;i++);
           }
/******************************************************************************/

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

//显示函数
/******************************************************************************/                    
          void Display(void)
         {  uchar i;
            for(i=0;i<4;i++)
                {
                         PORTB=discode[disbuf[i]];
                 PORTA=disbit[i];
                 delay();
                 PORTA=0xff;
                            }
                 }       
/******************************************************************************/
//显示数据处理
/******************************************************************************/                 
      void Process(uint i,uchar *disbuf)
         { disbuf[0]=i/1000;
                   i=i%1000;
                   disbuf[1]=i/100;
                   i=i%100;
                   disbuf[2]=i/10;
                   i=i%10;
                   disbuf[3]=i;
          }
/******************************************************************************/
//按键处理子程序
/******************************************************************************/            
      void Get_Key(void)
             {
                     if(Get_Bit(PINA,4)==0)    //PA4 按键处理函数        
                        {
                           Display();
                           Display();
                           Display();
                           Display();
                          while(!(Get_Bit(PINA,4)))//等待按键松开
                  {
                                  Display();
                  }
                                  k++;
                  if(k>9999)k=0;
                  Process(k,disbuf);   
                        }
                       
                      if(Get_Bit(PINA,5)==0)   //PA5 按键处理函数
                {  
                                  Display();
                                  Display();
                                  Display();
                               
                                 while(!Get_Bit(PINA,5))  //等待按键松开
                  {
                                  Display();
                                   Display();
                  }  
                  k--;   
                                     if(k==65535)k=9999;
                      Process(k,disbuf);     
                            }
         }
         void main (void)
             {
                         
                           DDRA|=1<<0|1<<1|1<<2|1<<3|0<<4|0<<5;//设置PA0,PA1,PA2为输出,PA4,PA5为输入
                   PORTA=0x00;
                                      
               DDRB=0xFF;
               PORTB=0xFF;
                        
               Process(k,disbuf);
                  while(1)
                 {   
                    Get_Key();
                                    Display();  
                              }
                         }
                                 
                     
                     
                       
                           
               
               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-7-24 14:32 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表