简易四位一体数码管显示数字(部分代码查询获得)

本文详细介绍了共阴极数码管的工作原理及其控制方法,包括如何通过编程控制多位数码管显示不同的数字,并提供了具体的代码实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 共阳极数码管是指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制

共阴极数码管是指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制

共阴级输入高电平有效,共阳级输入低电平有效。 




HS42056  1K-32是共阴极四位一体数码管,有十二个引脚,a,b,c,d,e,f,g,dp为段引脚,1,2,3,4为四个数码管的位。


#define d_a 2  //定义数码管a 接引脚 2  
#define d_b 3  
#define d_c 4  
#define d_d 5  
#define d_e 6  
#define d_f 7  
#define d_g 8  
#define d_h 9  
  
#define COM1 10   //定义 第一组数码管 com1 接引脚2  
#define COM2 11  
#define COM3 12  
#define COM4 13  
  
unsigned char num[17][8] =  
{  
 //a  b  c  d  e  f  g  h   
  {1, 1, 1, 1, 1, 1, 0, 0},     
  {0, 1, 1, 0, 0, 0, 0, 0},       
  {1, 1, 0, 1, 1, 0, 1, 0},     
  {1, 1, 1, 1, 0, 0, 1, 0},     
  {0, 1, 1, 0, 0, 1, 1, 0},      
  {1, 0, 1, 1, 0, 1, 1, 0},     
  {1, 0, 1, 1, 1, 1, 1, 0},      
  {1, 1, 1, 0, 0, 0, 0, 0},      
  {1, 1, 1, 1, 1, 1, 1, 0},      
  {1, 1, 1, 1, 0, 1, 1, 0},       
  {1, 1, 1, 0, 1, 1, 1, 1},      
  {1, 1, 1, 1, 1, 1, 1, 1},     
  {1, 0, 0, 1, 1, 1, 0, 1},     
  {1, 1, 1, 1, 1, 1, 0, 1},      
  {1, 0, 0, 1, 1, 1, 1, 1},       
  {1, 0, 0, 0, 1, 1, 1, 1},     
  {0, 0, 0, 0, 0, 0, 0, 1},     
};  
  
void setup()  
{  
    pinMode(d_a,OUTPUT);        //设置为输出引脚  
    pinMode(d_b,OUTPUT);  
    pinMode(d_c,OUTPUT);  
    pinMode(d_d,OUTPUT);  
    pinMode(d_e,OUTPUT);  
    pinMode(d_f,OUTPUT);  
    pinMode(d_g,OUTPUT);  
    pinMode(d_h,OUTPUT);  
  
    pinMode(COM1,OUTPUT);  
    pinMode(COM2,OUTPUT);  
    pinMode(COM3,OUTPUT);  
    pinMode(COM4,OUTPUT);  
}  
  
void loop()  
 
          {  
            Display(1,1);//第一位数码管显示l的值  
            
            Display(2,3);  
            
            Display(3,1);  
             
            Display(4,4);  
             
          }  
  
         
    
  


  
void Display(unsigned char com,unsigned char n)        
{  
    digitalWrite(d_a,LOW);          //去除余晖  
    digitalWrite(d_b,LOW);  
    digitalWrite(d_c,LOW);  
    digitalWrite(d_d,LOW);  
    digitalWrite(d_e,LOW);  
    digitalWrite(d_f,LOW);  
    digitalWrite(d_g,LOW);  
    digitalWrite(d_h,LOW);  
  
    switch(com)                       
    {  
        case 1:  
            digitalWrite(COM1,LOW);     //选择位1  
            digitalWrite(COM2,HIGH);  
            digitalWrite(COM3,HIGH);  
            digitalWrite(COM4,HIGH);  
            break;  
        case 2:  
            digitalWrite(COM1,HIGH);  
            digitalWrite(COM2,LOW);     //选择位2  
            digitalWrite(COM3,HIGH);  
            digitalWrite(COM4,HIGH);  
            break;  
        case 3:  
            digitalWrite(COM1,HIGH);  
            digitalWrite(COM2,HIGH);  
            digitalWrite(COM3,LOW);     //选择位3  
            digitalWrite(COM4,HIGH);  
            break;  
        case 4:  
            digitalWrite(COM1,HIGH);  
            digitalWrite(COM2,HIGH);  
            digitalWrite(COM3,HIGH);  
            digitalWrite(COM4,LOW);     //选择位4  
            break;  
        default:break;  
    }  
  
    digitalWrite(d_a,num[n][0]);            
    digitalWrite(d_b,num[n][1]);  
    digitalWrite(d_c,num[n][2]);  
    digitalWrite(d_d,num[n][3]);  
    digitalWrite(d_e,num[n][4]);  
    digitalWrite(d_f,num[n][5]);  
    digitalWrite(d_g,num[n][6]);  
    digitalWrite(d_h,num[n][7]);  
}

要在ATmega16单片机上通过数码管显示数字“1234”,需要完成以下几个步骤: ### 步骤一:硬件连接 首先,你需要将数码管与 ATmega16 进行正确的连接。数码管通常有两种类型:共阳极和共阴极。假设我们使用的是共阴极数码管,则每个段(a~g及小数点)都应分别接到一个 I/O 引脚。 例如: - 数码管的 a 段 -> PB0 (PORTB 的第 0 位) - 数码管的 b 段 -> PB1 (PORTB 的第 1 位) - ... 以此类推直到 g 和 dp 段接好为止 此外还需要考虑多位数码管的情况。如果是静态显示的话可以直接给对应的段送电平;如果动态扫描则需加上选择公共端口来控制点亮哪一位。 ### 步骤二:初始化设置 接下来,在程序里对端口进行配置。这里以 PORTB 作为输出端为例: ```c DDRB = 0xFF; // 设置 DDRB 寄存器的所有位为输出方向。 ``` ### 步骤三:编写函数转换字符到字模数据 创建一个数组用于存放每一位对应于特定值时应该亮起哪些LED的信息表(也叫编码)。对于十进制从 '0' 到 '9': ```c unsigned char code[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 其中code[i]表示数字i(i=0..9)所对应的7段显示格式. ``` 然后可以制作简单的查表函数获取某个数字所需的字形图案: ```c void setNumber(unsigned char num){ if(num >=0 && num <=9){ PORTB = code[num]; } } ``` ### 实现轮流刷新每位上的数值 假如你是四个独立的一位七段数码显示器并联起来构成四位一体型式下工作模式之一——动态扫瞄方式, 那么就需要周期性的改变每一个单独的位置,并同时调整相应的SEGMENT DATA LINE OUTPUT LEVELS 来让各个位置显示出恰当的内容: 主循环部分代码示例如下: ```pseudo_code while(true){ for(i=0;i<4;i++){ selectDigitPosition(i); // 只允许当前 i-th digit 显示 setNumber(digitsArray[i]); // 设定该digit 应当显示的具体内容 delay(); // 延迟一段时间保证人眼看到稳定的图像效果 } } ``` 以上就是如何利用Atmel AVR系列微控制器atmega16配合适当外围电路驱动普通七段发光二极体(LED)-组成之简易电子记分板系统的一个概述过程了!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值