专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

Arduino-数码管和LED显示十六进制数

作者:快乐的尧   来源:不详   点击数:  更新时间:2014年08月02日   【字体:

这个实验更麻烦,因为要将电位器采样值map到0~255后以16进制显示,其中高位用数码管显示,低位用4个LED显示(4位二进制)。

 
 
这里主要学习了表格的使用方法。第一个参数是行数,第二个参数是列数。如果点亮数字“5”的话,则要让table1中的第五行从右向左分别为a~h段输出,让b,e和h段不亮。
 
另一个要点为把十进制的数(0~255)变成十六进制的数,分别取高低位进行显示,变成两位十六进制数。将该数右移4位(8位二进制数右移4位,左边填0,即取高4位的值);再将二进制数“00001111”进行“与”运算,(即取低4位的值)。
 
  程序如下:
#include  
 
#define LED1 9
#define LED2 10
#define LED3 11
#define LED4 12
 
#define SEG_a 2 //IO命名
#define SEG_b 3
#define SEG_c 4
#define SEG_d 5
#define SEG_e 6
#define SEG_f 7
#define SEG_g 8
#define Pot A0
byte i;
byte a;
byte b;
int PotBuffer = 0;
 
 
 
//数码管0-9数字码值
unsigned char table1[16][8] =         //表格1,16行8列
{
//     h        g       f       e       d       c       b       a
  {    0, 0, 1, 1, 1, 1, 1, 1  }  , //0
  {    0, 0, 0, 0, 0, 1, 1, 0  }  , //1
  {    0, 1, 0, 1, 1, 0, 1, 1  }  , //2
  {    0, 1, 0, 0, 1, 1, 1, 1  }  , //3
  {    0, 1, 1, 0, 0, 1, 1, 0  }  , //4
  {    0, 1, 1, 0, 1, 1, 0, 1  }  , //5
  {    0, 1, 1, 1, 1, 1, 0, 1  }  , //6
  {    0, 0, 0, 0, 0, 1, 1, 1  }  , //7
  {    0, 1, 1, 1, 1, 1, 1, 1  }  , //8
  {    0, 1, 1, 0, 1, 1, 1, 1  }  , //9
  {    0, 1, 1, 1, 0, 1, 1, 1  }  ,        //A
  {    0, 1, 1, 1, 1, 1, 0, 0  }  ,
  {    0, 0, 1, 1, 1, 0, 0, 1  }  ,
  {    0, 1, 0, 1, 1, 1, 1, 0  }  ,
  {    0, 1, 1, 1, 1, 0, 0, 1  }  ,
  {    0, 1, 1, 1, 0, 0, 0, 1  }          //F
};
 
unsigned char table2[16][4] =        //表格2,16行4列
{
//  8     4     2      1
  { 0,    0, 0,     0}  , //0
  { 0,    0, 0,     1}  , //1  
  { 0,    0, 1,     0}  , //2
  { 0,    0, 1,     1}  , //3
  { 0,    1, 0,     0}  , //4
  { 0,    1, 0,     1}  , //5
  { 0,    1, 1,     0}  , //6
  { 0,    1, 1,     1}  , //7
  { 1,    0, 0,     0}  , //8
  { 1,    0, 0,     1}  , //9
  { 1,    0, 1,     0}  , //A
  { 1,    0, 1,     1}  , //B
  { 1,    1, 0,     0}  , //C
  { 1,    1, 0,     1}  , //D
  { 1,    1, 1,     0}  , //E
  { 1,    1, 1,     1}    //F
} ;
  
void setup()
{
  pinMode(SEG_a,OUTPUT); //设置引脚为输出
  pinMode(SEG_b,OUTPUT);
  pinMode(SEG_c,OUTPUT);
  pinMode(SEG_d,OUTPUT);
  pinMode(SEG_e,OUTPUT);
  pinMode(SEG_f,OUTPUT);
  pinMode(SEG_g,OUTPUT);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
}
 
void loop()
{
    PotBuffer = analogRead(Pot); //读取AD值
    i = map(PotBuffer, 0, 1023, 0, 255);
    a = i >> 4;          //a=v右移4位(8位二进制数右移4位,左边填0,即取高4位的值)
    b = i & 0b1111;      //v和二进制数“00001111”进行“与”运算,即取低4位的值)
    
    digitalWrite(SEG_a,table1[a][7]); //数码管段a的输出
    digitalWrite(SEG_b,table1[a][6]);  
    digitalWrite(SEG_c,table1[a][5]);
    digitalWrite(SEG_d,table1[a][4]);
    digitalWrite(SEG_e,table1[a][3]);
    digitalWrite(SEG_f,table1[a][2]);
    digitalWrite(SEG_g,table1[a][1]); //数码管段g的输出
    
    digitalWrite(LED4,table2[b][3]); // LED4(bit0)的输出
    digitalWrite(LED3,table2[b][2]);
    digitalWrite(LED2,table2[b][1]);
    digitalWrite(LED1,table2[b][0]); // LED1(bit3)的输出
 
    delay(50);
}
 
测试视频(为了显示精确,用了一个多圈电位器):
 
关闭窗口

相关文章