标题: 哪位解释一下这个单片机数码管显示代码详细工作来龙去脉 [打印本页]

作者: samxon    时间: 2024-11-24 18:40
标题: 哪位解释一下这个单片机数码管显示代码详细工作来龙去脉
哪位解释一下这个代码详细工作来龙去脉。谢谢。

//数码管显示缓存区
unsigned char Nixie_Buf[14]={0,0,1,2,3,4,5,6,7,8,9,10,11,32};

//数码管段码表
unsigned char NixieTable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
                                                        0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0xFF,
};
               


作者: xiaobendan001    时间: 2024-11-24 19:01
14字节缓冲,32个段码,不懂
作者: lkc8210    时间: 2024-11-24 20:57
unsigned char NixieTable[] = {
    0xc0, // 0  -> NixieTable[0]
    0xf9, // 1  -> NixieTable[1]
    0xa4, // 2  -> NixieTable[2]
    0xb0, // 3  -> NixieTable[3]
    0x99, // 4  -> NixieTable[4]
    0x92, // 5  -> NixieTable[5]
    0x82, // 6  -> NixieTable[6]
    0xf8, // 7  -> NixieTable[7]
    0x80, // 8  -> NixieTable[8]
    0x90, // 9  -> NixieTable[9]
    0x88, // A  -> NixieTable[10]
    0x83, // b  -> NixieTable[11]
    0xc6, // C  -> NixieTable[12]
    0xa1, // d  -> NixieTable[13]
    0x86, // E  -> NixieTable[14]
    0x8e, // F  -> NixieTable[15]
    0x40, // G  -> NixieTable[16]
    0x79, // H  -> NixieTable[17]
    0x24, // I  -> NixieTable[18]
    0x30, // J  -> NixieTable[19]
    0x19, // K  -> NixieTable[20]
    0x12, // L  -> NixieTable[21]
    0x02, // M  -> NixieTable[22]
    0x78, // N  -> NixieTable[23]
    0x00, // O  -> NixieTable[24]
    0x10, // P  -> NixieTable[25]
    0x08, // Q  -> NixieTable[26]
    0x03, // R  -> NixieTable[27]
    0x46, // S  -> NixieTable[28]
    0x21, // T  -> NixieTable[29]
    0x06, // U  -> NixieTable[30]
    0x0e, // V  -> NixieTable[31]
    0xFF  // 关闭显示 -> NixieTable[32]
};
作者: zhuls    时间: 2024-11-24 22:44
就是典型的一维数组,没什么好讲的;
unsigned char Nixie_Buf[14]={0,0,1,2,3,4,5,6,7,8,9,10,11,32};
表示这个数组的数据格式是 unsigned char 类型的;
这个数组名字叫  Nixie_Buf ,下标从0开始到13,共有14个成员,
分别就是{0,0,1,2,3,4,5,6,7,8,9,10,11,32},按顺序排列。
如果要取第一个数,就 Nixie_Buf[0]=0;第二个是 Nixie_Buf[1]=0;余下类推,直到Nixie_Buf[13]=32
这样数组常用于一大堆毫无规律,却又反复调用的数据,基本上就是以空间换效率?
当然,在你这里因为数据量不大,效率并不差太多。
不用数组的话,可能你要用一个switch分支来赋值:
u8 Nixie_Buf;
u8 index;
switch (index)
{
case 0: Nixie_Buf=0; break;
case 1: Nixie_Buf=0; break;
case 2: Nixie_Buf=1; break;
case 3: Nixie_Buf=2; break;
.
.
case 13: Nixie_Buf=32; break;
default: break;
}
或用 if 来分支:
if (index==0) Nixie_Buf=0;
else if  (index==1) Nixie_Buf=0;
else if  (index==2) Nixie_Buf=1;
else if  (index==3) Nixie_Buf=2;
.
.
.
else if  (index==13) Nixie_Buf=32;

if..else if 超过5个,建议用switch,
当然这也不是强推的,依个人喜好,并没有太大的优劣区别。
~~个人观点,仅供参考~~
作者: xiaobendan001    时间: 2024-11-25 07:55
lkc8210 发表于 2024-11-24 20:57
unsigned char NixieTable[] = {
    0xc0, // 0  -> NixieTable[0]
    0xf9, // 1  -> NixieTable[1]

一个7段数码管,花样还整这么多
作者: samxon    时间: 2024-11-25 11:22
xiaobendan001 发表于 2024-11-25 07:55
一个7段数码管,花样还整这么多

unsigned char Nixie_Buf[14]={0,0,1,2,3,4,5,6,7,8,9,10,11,32};
花括号内的数字是什么意思。
作者: xiaobendan001    时间: 2024-11-25 12:29
samxon 发表于 2024-11-25 11:22
unsigned char Nixie_Buf[14]={0,0,1,2,3,4,5,6,7,8,9,10,11,32};
花括号内的数字是什么意思。

显示缓冲区,一般都是直接定义一个比如unsigned char Nixie_Buf[14];
花括号里面的是写代码时预填的内容,实际使用时这些内容往往是随时变化的。大概会在上电瞬间即被冲掉。
作者: 188610329    时间: 2024-11-25 16:00
samxon 发表于 2024-11-25 11:22
unsigned char Nixie_Buf[14]={0,0,1,2,3,4,5,6,7,8,9,10,11,32};
花括号内的数字是什么意思。

意思就是:
unsigned char  Nixie_Tran(unsigned char temp)
{
   if(temp != 0)
   {
         if(temp <13)    temp--;
         else temp = 32;
   }
   return temp;
}
作者: xiaobendan001    时间: 2024-11-25 17:27
188610329 发表于 2024-11-25 16:00
意思就是:
unsigned char  Nixie_Tran(unsigned char temp)
{

不懂啊,给解释一下呗
作者: samxon    时间: 2024-11-25 21:35
xiaobendan001 发表于 2024-11-25 12:29
显示缓冲区,一般都是直接定义一个比如unsigned char Nixie_Buf[14];
花括号里面的是写代码时预填的内容 ...

也就是说花括号内的数字可以随便写吗
作者: WL0123    时间: 2024-11-25 21:50
unsigned char NixieTable[]是共阳数码管段码表对应字符0~9、A~Z(部分字母不能显示)和清屏0xFF。如果代码Px=NixieTable[Nixie_Buf[11]],则显示“A”。
作者: samxon    时间: 2024-11-25 22:14
WL0123 发表于 2024-11-25 21:50
unsigned char NixieTable[]是共阳数码管段码表对应字符0~9、A~Z(部分字母不能显示)和清屏0xFF。如果代码 ...

为什么要用Px=NixieTable[Nixie_buf[11]],而不用NexieTable[11]来显示A呢。
作者: WL0123    时间: 2024-11-26 06:49
samxon 发表于 2024-11-25 22:14
为什么要用Px=NixieTable[Nixie_buf[11]],而不用NexieTable[11]来显示A呢。

数码管段码NixieTable[]的成员是常量,数码管显示缓存Nixie_Buf[]的成员通常是变量,比如存储的是年月日时分秒。当你编程水平达到一定高度,就能感受到用此方法编写数码管驱动函数会简单高效。这是一段用于TX-1C学习板的数码管动态显示函数部分的示例。
  1. #define uint unsigned int                         //宏定义整型
  2. #define uchar unsigned char                 //宏定义字符型
  3. sbit dula=P2^6;                        //段
  4. sbit wela1=P2^7;                        //位
  5. uchar code table[]={                                        //数码管0~f段码
  6. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  7. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  8. uchar code wela[]={0x7e,0x7d,0x7b,0x77,0xef,0xdf};//数码管位码
  9. uchar data dis_buf[6];                                //6位数据缓存
  10. uint  Cntus=0;                                                        //2500us
  11. uchar Cnt1s=0,Cnt1min=0,hour=12;        //秒、分、时

  12. /***********分解数据位程序*************/
  13. void Separate()
  14. {
  15.         dis_buf[0]= hour/10;                        // 时十位
  16.         dis_buf[1]= hour%10;                        // 时个位
  17.         dis_buf[2]= Cnt1min/10;                        // 分十位
  18.         dis_buf[3]= Cnt1min%10;                        // 分个位
  19.         dis_buf[4]= Cnt1s/10;                        // 秒十位
  20.         dis_buf[5]= Cnt1s%10;                        // 秒个位
  21. }
  22. /**********6位数码管动态显示程序**********/
  23. void display()
  24. {
  25.         static uchar i=0;                        //静态变量
  26.         P0=0x00;                                                //消隐
  27.         dula=1;                                                //锁存
  28.         dula=0;

  29.         P0=wela[i];                                        //送位码
  30.         wela1=1;                                                //锁存
  31.         wela1=0;

  32.         if((i==1)||(i==3))                                //如果显示第2、4位
  33.                 P0=table[dis_buf[i]]|0x80;  //送段码+点
  34.         else P0=table[dis_buf[i]];                //送段码
  35.         dula=1;                                                //锁存
  36.         dula=0;
  37.         i++;
  38.         if(i>=6)
  39.                 i=0;
  40. }
复制代码




作者: xiaobendan001    时间: 2024-11-26 08:09
samxon 发表于 2024-11-25 22:14
为什么要用Px=NixieTable[Nixie_buf[11]],而不用NexieTable[11]来显示A呢。

NexieTable[11]显示的是段码的第12个元素大概是B,NixieTable[Nixie_buf[11]],缓冲区第12个元素的值是10,就等于NexieTable[10],是A,其他地方的代码可以通过改变Nixie_buf里面的值,改变显示内容




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1