找回密码
 立即注册

QQ登录

只需一步,快速开始

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

哪位解释一下这个单片机数码管显示代码详细工作来龙去脉

[复制链接]
跳转到指定楼层
楼主
ID:705846 发表于 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,
};
               

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-11-24 19:01 | 只看该作者
14字节缓冲,32个段码,不懂
回复

使用道具 举报

板凳
ID:161164 发表于 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]
};
回复

使用道具 举报

地板
ID:69038 发表于 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,
当然这也不是强推的,依个人喜好,并没有太大的优劣区别。
~~个人观点,仅供参考~~
回复

使用道具 举报

5#
ID:1109793 发表于 2024-11-25 07:55 | 只看该作者
lkc8210 发表于 2024-11-24 20:57
unsigned char NixieTable[] = {
    0xc0, // 0  -> NixieTable[0]
    0xf9, // 1  -> NixieTable[1]

一个7段数码管,花样还整这么多
回复

使用道具 举报

6#
ID:705846 发表于 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};
花括号内的数字是什么意思。
回复

使用道具 举报

7#
ID:1109793 发表于 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];
花括号里面的是写代码时预填的内容,实际使用时这些内容往往是随时变化的。大概会在上电瞬间即被冲掉。
回复

使用道具 举报

8#
ID:624769 发表于 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;
}
回复

使用道具 举报

9#
ID:1109793 发表于 2024-11-25 17:27 | 只看该作者
188610329 发表于 2024-11-25 16:00
意思就是:
unsigned char  Nixie_Tran(unsigned char temp)
{

不懂啊,给解释一下呗
回复

使用道具 举报

10#
ID:705846 发表于 2024-11-25 21:35 | 只看该作者
xiaobendan001 发表于 2024-11-25 12:29
显示缓冲区,一般都是直接定义一个比如unsigned char Nixie_Buf[14];
花括号里面的是写代码时预填的内容 ...

也就是说花括号内的数字可以随便写吗
回复

使用道具 举报

11#
ID:1133081 发表于 2024-11-25 21:50 | 只看该作者
unsigned char NixieTable[]是共阳数码管段码表对应字符0~9、A~Z(部分字母不能显示)和清屏0xFF。如果代码Px=NixieTable[Nixie_Buf[11]],则显示“A”。
回复

使用道具 举报

12#
ID:705846 发表于 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呢。
回复

使用道具 举报

13#
ID:1133081 发表于 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. }
复制代码



回复

使用道具 举报

14#
ID:1109793 发表于 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里面的值,改变显示内容
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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