| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 777 人关注过本帖
标题:输入一个数字,显示一个七段数字,要用到数组。
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
test.zip (13.23 KB)

授人以渔,不授人以鱼。
2015-10-21 18:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用边小白在2015-10-21 18:31:12的发言:

T版这个人家用不上,楼主要的是单片机的c代码,直接访问硬件的。

點亮一個燈管與在屏幕上顯示一個圖案是同樣的原理,衹需要發送一條指令。

授人以渔,不授人以鱼。
2015-10-21 18:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這種編程,其實再簡單不過。關鍵是硬件的排綫,排好了就有一張端口地址表,要哪條管亮,就向哪個地址發0/1訊號(實際上這種訊號是可編程的,不必所有製作都一樣),與在屏幕上點亮一個點是完全一樣的原理。我寫的這個樣板,已經把畫一組七段管的函數封裝起來,操縱者衹要發數字即可(這就是系統調用的道理,文本模式的用BOIS中斷請求向屏幕輸出字符就是這樣)。作爲使用者,是不需要知道硬件細節的。完成任務,就靠那張(字符圖案)對應表,不同硬件,換一份就是了。

授人以渔,不授人以鱼。
2015-10-21 18:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這是主程序:
程序代码:
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "tools.h"
#include "LED.h"

HANDLE Console_Output = GetStdHandle(STD_OUTPUT_HANDLE);

int main(void)
{
    SetConsoleTitleA("七段管演示");

    const char* tips = "Press any key...";
    const char* message = "請輸入需要顯示的數字(直接按<Enter>鍵結束程序):";
    COORD pos;

    char buffer[81];
    do
    {
        ClearScreen();
        pos.X = 0;
        pos.Y = 0;
        Say(message, pos);
        GotoXY((SHORT)strlen(message) + 1, pos.Y);
        if (gets_s(buffer, _countof(buffer)) && (buffer[0] != '\0'))
        {
            int number = atoi(buffer);
            sprintf_s(buffer, "%u", number);
            SHORT length = (SHORT)strlen(buffer);
            for (SHORT index = 0; index < length; ++index)
            {
                LED_On(buffer[index] - '0', 1 + index * (LED_Width + 1), 5);    // 向指定組輸出一位數字
            }
            pos.X = 0;
            pos.Y = 24;
            Say(tips, pos);
            GotoXY((SHORT)strlen(tips), pos.Y);
            _getch();
        }
    } while (buffer[0] != '\0');

    return EXIT_SUCCESS;
}

授人以渔,不授人以鱼。
2015-10-21 19:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
重點是這張表:
程序代码:
static const WORD Light[10][4]
{ 
    // 0
    { 
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_LVERTICAL, 
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL, 
        COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_LVERTICAL, 
        COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL 
    },
    // 1
    { 
        0, 
        COMMON_LVB_GRID_RVERTICAL,
        0, 
        COMMON_LVB_GRID_RVERTICAL 
    },
    // 2
    { 
        COMMON_LVB_GRID_HORIZONTAL, 
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL, 
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_LVERTICAL, 
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE 
    },
    // 3
    {
        COMMON_LVB_GRID_HORIZONTAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL
    },
    // 4
    {
        COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_RVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL
    },
    // 5
    {
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL
    },
    // 6
    {
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL
    },
    // 7
    {
        COMMON_LVB_GRID_HORIZONTAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL,
        0,
        COMMON_LVB_GRID_RVERTICAL
    },
    // 8
    {
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL
    },
    // 9
    {
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_LVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_GRID_RVERTICAL,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE,
        COMMON_LVB_GRID_HORIZONTAL + COMMON_LVB_UNDERSCORE + COMMON_LVB_GRID_RVERTICAL
    }
};


在控制機那裏,這張表是10個char的數組char[10],每個char衹使用7bit,按照前面a-g的順序(由排綫決定)依次填0/1,則每個char就是一個0-9數字的點陣圖,要顯示哪個數字,就提取對應的char,依次點亮對應燈管就是了。每組(7段)都有一個起始地址,相當於我16樓代碼LED_On()函數的第二個參數。封裝的LED_On()函數,接口協議衹是接收需要顯示的數字和組地址,該函數的動作,就是提取數字對應的char,按順序把用到的7bit以0/1模式發出即可。其實,單片機在板上,根本用不着靠bit壓縮空間,所有10字符點陣,用char:0/1存儲,也不過是70字節,代碼上比用位操作直接得多。比特壓縮的情形,以前是用在通過串口傳遞點陣圖案上的,在本地機上,不必這麽繞圈,寫位操作的代碼占用内存,也不止70字節,畢竟你最終還是把0/1以1Byte的代價發出去。換句話説,這張表可以用char[10][7]的,總共也就70Byte的消耗,比寫晦澀難懂的位操作代碼清晰得多。

[此贴子已经被作者于2015-10-21 19:28编辑过]


授人以渔,不授人以鱼。
2015-10-21 19:21
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
单片机里通常是位操作,假设如楼主7楼所示a到g对应一个字节的0到7位,则显示8的数据为0x7F,显示0的数据为0x3F,显示1为0x06.

能编个毛线衣吗?
2015-10-21 19:57
快速回复:输入一个数字,显示一个七段数字,要用到数组。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035453 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved