找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1221|回复: 14

16数字集

[复制链接]
发表于 2025-12-6 15:34:09 | 显示全部楼层 |阅读模式
本帖最后由 zzz19760225 于 2026-1-26 08:46 编辑

1234567890a,;:.(小数点不在16数字集层面考虑,而是作为载体层面上,再次十进制表达十进制里表现。又或者增加小数点.和中文句号。)
全组合的内容。1名实相对关系里选择定义的制标准单元,2单元组合的排序排列全组合地图,3地图上的选择全组合,4选择全组合里的万物生物动物人类需求循环自转的各种规律选择集合。
 楼主| 发表于 2025-12-6 15:42:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-6 16:42 编辑

通义:linux mint22.2 C语言SDL2建立3X5点阵,二维数组代表,二维数组的15个值为单元全组合,依次显示每个组合内容的点阵效应。不用字符,每行中文注释。
修正一个SDL_CreateWindow 函数调用语法错误
直接使用 SDL_WINDOWPOS_CENTERED
文件dotmatrix.c

  1. // 引入标准输入输出库
  2. #include <stdio.h>
  3. // 引入标准库(用于延时等)
  4. #include <stdlib.h>
  5. // 引入SDL2图形库
  6. #include <SDL2/SDL.h>

  7. // 定义点阵宽度(列数)
  8. #define WIDTH 3
  9. // 定义点阵高度(行数)
  10. #define HEIGHT 5
  11. // 定义每个点的像素大小(方便可视化)
  12. #define DOT_SIZE 40
  13. // 定义窗口宽度(含边距)
  14. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 20)
  15. // 定义窗口高度(含边距)
  16. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 20)
  17. // 定义每帧显示时间(毫秒)
  18. #define FRAME_DELAY 100

  19. // 主函数
  20. int main(int argc, char* argv[])
  21. {
  22.     // 初始化SDL系统
  23.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  24.         printf("无法初始化SDL:%s\n", SDL_GetError());
  25.         return -1;
  26.     }

  27.     // 创建窗口
  28.     SDL_Window* window = SDL_CreateWindow(
  29.         "3x5点阵全组合演示",               // 窗口标题
  30.         SDL_WINDOWPOS_CENTERED,          // 横向居中
  31.         SDL_WINDOWPOS_CENTERED,          // 纵向居中
  32.         WINDOW_WIDTH,                    // 窗口宽度
  33.         WINDOW_HEIGHT,                   // 窗口高度
  34.         SDL_WINDOW_SHOWN                 // 显示窗口
  35.     );
  36.     if (!window) {
  37.         printf("无法创建窗口:%s\n", SDL_GetError());
  38.         SDL_Quit();
  39.         return -1;
  40.     }

  41.     // 创建渲染器
  42.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  43.     if (!renderer) {
  44.         printf("无法创建渲染器:%s\n", SDL_GetError());
  45.         SDL_DestroyWindow(window);
  46.         SDL_Quit();
  47.         return -1;
  48.     }

  49.     // 定义点阵二维数组(初始为0)
  50.     int dot[HEIGHT][WIDTH] = {0};

  51.     // 总组合数:2的15次方
  52.     const int total = 1 << (WIDTH * HEIGHT); // 即32768

  53.     // 遍历所有组合(从0到32767)
  54.     for (int combo = 0; combo < total; combo++) {
  55.         // 清空屏幕为白色背景
  56.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  57.         SDL_RenderClear(renderer);

  58.         // 将当前组合编号转换为点阵状态
  59.         int temp = combo;
  60.         for (int y = 0; y < HEIGHT; y++) {
  61.             for (int x = 0; x < WIDTH; x++) {
  62.                 dot[y][x] = temp & 1;      // 取最低位作为该点状态(0或1)
  63.                 temp >>= 1;                // 右移一位处理下一点
  64.             }
  65.         }

  66.         // 绘制点阵
  67.         for (int y = 0; y < HEIGHT; y++) {
  68.             for (int x = 0; x < WIDTH; x++) {
  69.                 if (dot[y][x]) {
  70.                     // 若该点为1,则绘制黑色实心矩形
  71.                     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
  72.                 } else {
  73.                     // 若该点为0,则绘制浅灰色填充(可清晰看到灭点)
  74.                     SDL_SetRenderDrawColor(renderer, 220, 220, 220, 255);
  75.                 }
  76.                 // 计算矩形位置(加边距10像素)
  77.                 SDL_Rect rect = {
  78.                     10 + x * DOT_SIZE,
  79.                     10 + y * DOT_SIZE,
  80.                     DOT_SIZE - 2,  // 留1像素间隙
  81.                     DOT_SIZE - 2
  82.                 };
  83.                 SDL_RenderFillRect(renderer, &rect);
  84.             }
  85.         }

  86.         // 更新屏幕显示
  87.         SDL_RenderPresent(renderer);

  88.         // 处理退出事件(如点击关闭按钮)
  89.         SDL_Event event;
  90.         while (SDL_PollEvent(&event)) {
  91.             if (event.type == SDL_QUIT) {
  92.                 goto cleanup; // 跳出循环并清理资源
  93.             }
  94.         }

  95.         // 延迟一段时间以便观察
  96.         SDL_Delay(FRAME_DELAY);
  97.     }

  98. cleanup:
  99.     // 释放渲染器资源
  100.     SDL_DestroyRenderer(renderer);
  101.     // 释放窗口资源
  102.     SDL_DestroyWindow(window);
  103.     // 关闭SDL系统
  104.     SDL_Quit();

  105.     // 程序正常结束
  106.     return 0;
  107. }
复制代码
gcc -o dotmatrix dotmatrix.c -lSDL2
./dotmatrix
或鼠标双击dotmatrix
可以运行,产生一个页面黑色和灰色相对的快速组合递增,类似二进制有序堆积。
下面需要抽出这些组合,排序,在排序的序数序号中,提取使用4位01的16个点阵字符对应组合数组。(要不要过一百遍呢?)
所有 32768 种亮灭组合,只要其中的16种。余下的作为点阵牌使用,人怎么调用点阵牌呢。
通过指针,将3万组合里的16个提出来,怎么使用。
并行一个15点阵的线条,三个点阵为一线段,点阵需求的位置,可以相对二进制数量算出来。不需要自己算,让自动信息安排这个程序功能,点击点阵,就汇总出二进制数量。
需要手工点击点阵尝试点阵组合的各种样子,找个人认为不错的组合,然后获取对应显示的序数序号,在另一个输入框里输入,就可以调用。手工寻找,输入框再现点阵组合。
 楼主| 发表于 2025-12-6 17:16:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-6 17:39 编辑

通义:在上面的程序继续修改,鼠标左键点击点阵就变黑,再点击就变白,汇总显示黑色点阵所代表的数。

dotmatrix5.c

  1. // 引入标准输入输出库
  2. #include <stdio.h>
  3. // 引入标准库(用于字符串等)
  4. #include <stdlib.h>
  5. // 引入SDL2图形库
  6. #include <SDL2/SDL.h>

  7. // 定义点阵宽度(列数)
  8. #define WIDTH 3
  9. // 定义点阵高度(行数)
  10. #define HEIGHT 5
  11. // 定义每个点的像素大小
  12. #define DOT_SIZE 60
  13. // 定义边距
  14. #define MARGIN 20
  15. // 定义窗口宽度
  16. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  17. // 定义窗口高度
  18. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  19. // 定义每帧刷新间隔(毫秒)
  20. #define FRAME_DELAY 50

  21. // 主函数
  22. int main(int argc, char* argv[])
  23. {
  24.     // 初始化SDL系统
  25.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  26.         printf("无法初始化SDL:%s\n", SDL_GetError());
  27.         return -1;
  28.     }

  29.     // 创建窗口(初始标题)
  30.     SDL_Window* window = SDL_CreateWindow(
  31.         "数值: 0",
  32.         SDL_WINDOWPOS_CENTERED,
  33.         SDL_WINDOWPOS_CENTERED,
  34.         WINDOW_WIDTH,
  35.         WINDOW_HEIGHT,
  36.         SDL_WINDOW_SHOWN
  37.     );
  38.     if (!window) {
  39.         printf("无法创建窗口:%s\n", SDL_GetError());
  40.         SDL_Quit();
  41.         return -1;
  42.     }

  43.     // 创建渲染器
  44.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  45.     if (!renderer) {
  46.         printf("无法创建渲染器:%s\n", SDL_GetError());
  47.         SDL_DestroyWindow(window);
  48.         SDL_Quit();
  49.         return -1;
  50.     }

  51.     // 点阵状态数组(0=灭,1=亮)
  52.     int dot[HEIGHT][WIDTH] = {0};

  53.     // 主循环标志
  54.     int running = 1;

  55.     // 事件结构体
  56.     SDL_Event event;

  57.     while (running) {
  58.         // 处理所有待处理事件
  59.         while (SDL_PollEvent(&event)) {
  60.             if (event.type == SDL_QUIT) {
  61.                 running = 0;
  62.             }
  63.             // 处理鼠标左键点击
  64.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  65.                 int mouse_x = event.button.x;
  66.                 int mouse_y = event.button.y;

  67.                 // 转换为点阵坐标(减去边距)
  68.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  69.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  70.                 // 检查是否在有效范围内
  71.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  72.                     // 切换该点状态
  73.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  74.                 }
  75.             }
  76.         }

  77.         // 计算当前点阵对应的整数值
  78.         unsigned int value = 0;
  79.         int bit_index = 0;
  80.         for (int y = 0; y < HEIGHT; y++) {
  81.             for (int x = 0; x < WIDTH; x++) {
  82.                 if (dot[y][x]) {
  83.                     value |= (1U << bit_index);  // 设置第 bit_index 位
  84.                 }
  85.                 bit_index++;
  86.             }
  87.         }

  88.         // 更新窗口标题(显示当前数值)
  89.         char title[64];
  90.         snprintf(title, sizeof(title), "数值: %u", value);
  91.         SDL_SetWindowTitle(window, title);

  92.         // 清屏(白色背景)
  93.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  94.         SDL_RenderClear(renderer);

  95.         // 绘制点阵
  96.         for (int y = 0; y < HEIGHT; y++) {
  97.             for (int x = 0; x < WIDTH; x++) {
  98.                 if (dot[y][x]) {
  99.                     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);   // 黑色(亮)
  100.                 } else {
  101.                     SDL_SetRenderDrawColor(renderer, 220, 220, 220, 255); // 浅灰(灭)
  102.                 }
  103.                 SDL_Rect rect = {
  104.                     MARGIN + x * DOT_SIZE,
  105.                     MARGIN + y * DOT_SIZE,
  106.                     DOT_SIZE - 2,
  107.                     DOT_SIZE - 2
  108.                 };
  109.                 SDL_RenderFillRect(renderer, &rect);
  110.             }
  111.         }

  112.         // 更新画面
  113.         SDL_RenderPresent(renderer);

  114.         // 控制刷新率
  115.         SDL_Delay(FRAME_DELAY);
  116.     }

  117.     // 清理资源
  118.     SDL_DestroyRenderer(renderer);
  119.     SDL_DestroyWindow(window);
  120.     SDL_Quit();

  121.     return 0;
  122. }
复制代码
gcc -o dotmatrix5 dotmatrix5.c -lSDL2
./dotmatrix5
可以鼠标点击点阵,页面眉头显示对应十进制数字。
 楼主| 发表于 2025-12-21 15:14:59 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-25 10:59 编辑

以十进制为主,
是否应该修改为11个单元的排序全组合,另外一个信息间隔的逗号,一共12个单元的12元集合,12集。
0,1,2,3,4,5,6,7,8,9,
a(10),
,(逗号专门的间隔单元)
8        4,0320        ×8
9        36,2880        ×9
10        362,8800        ×10
11        3991,6800        ×11
12        4,7900,1600        ×12
11位的排序全组合总数,可以覆盖24位颜色的1677万。
人耳可听的声波20赫兹~20000赫兹,2万的1,9980。

39916800-16777216-19980=2311,9604
空闲2311万可以自由发挥。

双逗号,,为一个信息条结束或更大层面的间隔。

类似16进制去表达二进制,用相对大的数量代表数字字符集,去表达太大的排序全组合空间,量化为文字和数字代表,对接八卦64卦等排序全组合。
 楼主| 发表于 2025-12-25 10:55:21 | 显示全部楼层
9数字亿进制点阵1
可以显示两竖,每竖4个数字,八个点阵阿拉伯数字,但是没有适度的间隔开来。

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>  // 必须包含!

  4. #define DOT_SIZE 20
  5. #define PADDING 4   // 点与点之间,以及数字块之间的间隔

  6. // 3x5 点阵数字图案:0~9(这里只用前8个)
  7. const bool digits[10][5][3] = {
  8.     {{true, true, true}, {true, false, true}, {true, false, true}, {true, false, true}, {true, true, true}}, // 0
  9.     {{false, true, false}, {false, true, false}, {false, true, false}, {false, true, false}, {false, true, false}}, // 1
  10.     {{true, true, true}, {false, false, true}, {true, true, true}, {true, false, false}, {true, true, true}}, // 2
  11.     {{true, true, true}, {false, false, true}, {true, true, true}, {false, false, true}, {true, true, true}}, // 3
  12.     {{true, false, true}, {true, false, true}, {true, true, true}, {false, false, true}, {false, false, true}}, // 4
  13.     {{true, true, true}, {true, false, false}, {true, true, true}, {false, false, true}, {true, true, true}}, // 5
  14.     {{true, true, true}, {true, false, false}, {true, true, true}, {true, false, true}, {true, true, true}}, // 6
  15.     {{true, true, true}, {false, false, true}, {false, false, true}, {false, false, true}, {false, false, true}}, // 7
  16.     {{true, true, true}, {true, false, true}, {true, true, true}, {true, false, true}, {true, true, true}}, // 8
  17.     {{true, true, true}, {true, false, true}, {true, true, true}, {false, false, true}, {true, true, true}}  // 9
  18. };

  19. int main(int argc, char* argv[]) {
  20.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  21.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  22.         return 1;
  23.     }

  24.     const int grid_cols = 2;  // 横向 2 个数字
  25.     const int grid_rows = 4;  // 竖向 4 个数字
  26.     const int num_digits = 8; // 显示 0~7

  27.     // 单个数字块的尺寸(含内部点阵间隙)
  28.     const int block_width  = 3 * DOT_SIZE + 2 * PADDING;
  29.     const int block_height = 5 * DOT_SIZE + 4 * PADDING;

  30.     // 整体窗口尺寸:每个块之间再加 PADDING 作为块间距
  31.     int win_width  = grid_cols * block_width  + (grid_cols - 1) * PADDING;
  32.     int win_height = grid_rows * block_height + (grid_rows - 1) * PADDING;

  33.     SDL_Window* window = SDL_CreateWindow("2x4 3x5 Digit Matrix",
  34.                                           SDL_WINDOWPOS_CENTERED,
  35.                                           SDL_WINDOWPOS_CENTERED,
  36.                                           win_width, win_height,
  37.                                           SDL_WINDOW_SHOWN);
  38.     if (!window) {
  39.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  40.         SDL_Quit();
  41.         return 1;
  42.     }

  43.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  44.     if (!renderer) {
  45.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  46.         SDL_DestroyWindow(window);
  47.         SDL_Quit();
  48.         return 1;
  49.     }

  50.     bool quit = false;
  51.     SDL_Event e;

  52.     while (!quit) {
  53.         while (SDL_PollEvent(&e)) {
  54.             if (e.type == SDL_QUIT) {
  55.                 quit = true;
  56.             }
  57.         }

  58.         // 白色背景
  59.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  60.         SDL_RenderClear(renderer);

  61.         // 绘制每个数字块
  62.         for (int idx = 0; idx < num_digits; ++idx) {
  63.             int row = idx / grid_cols;   // 当前数字在网格中的行
  64.             int col = idx % grid_cols;   // 当前数字在网格中的列

  65.             // 计算该数字块左上角坐标
  66.             int block_x = col * (block_width + PADDING);
  67.             int block_y = row * (block_height + PADDING);

  68.             // 绘制该数字的 3x5 点阵
  69.             for (int y = 0; y < 5; ++y) {
  70.                 for (int x = 0; x < 3; ++x) {
  71.                     if (digits[idx][y][x]) {
  72.                         int px = block_x + x * (DOT_SIZE + PADDING);
  73.                         int py = block_y + y * (DOT_SIZE + PADDING);
  74.                         SDL_Rect r = {px, py, DOT_SIZE, DOT_SIZE};
  75.                         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 黑色点亮
  76.                         SDL_RenderFillRect(renderer, &r);
  77.                     }
  78.                 }
  79.             }
  80.         }

  81.         SDL_RenderPresent(renderer);
  82.         SDL_Delay(16);
  83.     }

  84.     SDL_DestroyRenderer(renderer);
  85.     SDL_DestroyWindow(window);
  86.     SDL_Quit();
  87.     return 0;
  88. }
复制代码
 楼主| 发表于 2025-12-25 18:09:54 | 显示全部楼层

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h> // for usleep

  7. #define GRID_SIZE 16
  8. #define CELL_SIZE 20
  9. #define WINDOW_WIDTH  (GRID_SIZE * CELL_SIZE)
  10. #define WINDOW_HEIGHT (GRID_SIZE * CELL_SIZE)

  11. const char* filename = "16x16_1.txt";

  12. int grid[GRID_SIZE][GRID_SIZE] = {0};
  13. time_t last_mtime = 0;

  14. // 创建默认文件(全0)
  15. void create_default_file() {
  16.     FILE* fp = fopen(filename, "w");
  17.     if (!fp) {
  18.         fprintf(stderr, "Cannot create default file %s\n", filename);
  19.         return;
  20.     }
  21.     for (int y = 0; y < GRID_SIZE; y++) {
  22.         for (int x = 0; x < GRID_SIZE; x++) {
  23.             fputc('0', fp);
  24.         }
  25.         fputc('\n', fp);
  26.     }
  27.     fclose(fp);
  28.     printf("Created default %s (all zeros).\n", filename);
  29. }

  30. // 加载位图文件到 grid
  31. int load_bitmap() {
  32.     FILE* fp = fopen(filename, "r");
  33.     if (!fp) {
  34.         printf("File %s not found.\n", filename);
  35.         create_default_file();
  36.         fp = fopen(filename, "r");
  37.         if (!fp) return -1;
  38.     }

  39.     char line[32];
  40.     int y = 0;
  41.     while (fgets(line, sizeof(line), fp) && y < GRID_SIZE) {
  42.         for (int x = 0; x < GRID_SIZE && line[x]; x++) {
  43.             grid[y][x] = (line[x] == '1') ? 1 : 0;
  44.         }
  45.         y++;
  46.     }
  47.     fclose(fp);

  48.     // 补全不足16行的情况(安全处理)
  49.     for (; y < GRID_SIZE; y++) {
  50.         for (int x = 0; x < GRID_SIZE; x++) {
  51.             grid[y][x] = 0;
  52.         }
  53.     }

  54.     // 获取当前修改时间
  55.     struct stat st;
  56.     if (stat(filename, &st) == 0) {
  57.         last_mtime = st.st_mtime;
  58.     }
  59.     return 0;
  60. }

  61. // 渲染点阵
  62. void render(SDL_Renderer* renderer) {
  63.     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  64.     SDL_RenderClear(renderer);

  65.     for (int y = 0; y < GRID_SIZE; y++) {
  66.         for (int x = 0; x < GRID_SIZE; x++) {
  67.             SDL_Rect rect = { x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE };
  68.             SDL_SetRenderDrawColor(renderer,
  69.                 grid[y][x] ? 0 : 255,
  70.                 grid[y][x] ? 0 : 255,
  71.                 grid[y][x] ? 0 : 255,
  72.                 255
  73.             );
  74.             SDL_RenderFillRect(renderer, &rect);
  75.         }
  76.     }

  77.     // 可选:网格线
  78.     SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
  79.     for (int i = 0; i <= GRID_SIZE; i++) {
  80.         SDL_RenderDrawLine(renderer, i * CELL_SIZE, 0, i * CELL_SIZE, WINDOW_HEIGHT);
  81.         SDL_RenderDrawLine(renderer, 0, i * CELL_SIZE, WINDOW_WIDTH, i * CELL_SIZE);
  82.     }

  83.     SDL_RenderPresent(renderer);
  84. }

  85. // 检查文件是否被修改
  86. int file_modified() {
  87.     struct stat st;
  88.     if (stat(filename, &st) != 0) {
  89.         // 文件被删除?当作已修改(下次加载会重建)
  90.         return 1;
  91.     }
  92.     return (st.st_mtime != last_mtime);
  93. }

  94. int main(int argc, char* argv[]) {
  95.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  96.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  97.         return 1;
  98.     }

  99.     SDL_Window* window = SDL_CreateWindow(
  100.         "16x16 Dot Matrix Auto-Refresh Viewer",
  101.         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  102.         WINDOW_WIDTH, WINDOW_HEIGHT,
  103.         SDL_WINDOW_SHOWN
  104.     );
  105.     if (!window) {
  106.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  107.         SDL_Quit();
  108.         return 1;
  109.     }

  110.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  111.     if (!renderer) {
  112.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  113.         SDL_DestroyWindow(window);
  114.         SDL_Quit();
  115.         return 1;
  116.     }

  117.     // 初次加载
  118.     if (load_bitmap() != 0) {
  119.         fprintf(stderr, "Failed to load bitmap.\n");
  120.         SDL_DestroyRenderer(renderer);
  121.         SDL_DestroyWindow(window);
  122.         SDL_Quit();
  123.         return 1;
  124.     }
  125.     render(renderer);

  126.     int running = 1;
  127.     SDL_Event e;
  128.     const Uint32 CHECK_INTERVAL_MS = 500; // 每500毫秒检查一次
  129.     Uint32 last_check = SDL_GetTicks();

  130.     while (running) {
  131.         while (SDL_PollEvent(&e)) {
  132.             if (e.type == SDL_QUIT) {
  133.                 running = 0;
  134.             } else if (e.type == SDL_KEYDOWN) {
  135.                 if (e.key.keysym.sym == SDLK_r) {
  136.                     printf("Manual reload triggered.\n");
  137.                     if (load_bitmap() == 0) render(renderer);
  138.                 } else if (e.key.keysym.sym == SDLK_ESCAPE) {
  139.                     running = 0;
  140.                 }
  141.             }
  142.         }

  143.         // 自动检查文件是否被外部修改
  144.         Uint32 now = SDL_GetTicks();
  145.         if (now - last_check >= CHECK_INTERVAL_MS) {
  146.             last_check = now;
  147.             if (file_modified()) {
  148.                 printf("Detected change in %s, reloading...\n", filename);
  149.                 if (load_bitmap() == 0) {
  150.                     render(renderer);
  151.                 }
  152.             }
  153.         }

  154.         SDL_Delay(16); // ~60 FPS
  155.     }

  156.     SDL_DestroyRenderer(renderer);
  157.     SDL_DestroyWindow(window);
  158.     SDL_Quit();
  159.     return 0;
  160. }

  161. //gcc -o 16x16点阵刷新1 16x16点阵刷新1.c -lSDL2
复制代码
编译后生成执行文件,运行执行文件会生成16x16_1.txt文本。
用nano修改16x16_1.txt,保存修改后,会对应点阵显示出变化。达到显存效应的需求
 楼主| 发表于 2025-12-29 10:46:38 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-29 11:32 编辑

16x16点阵全组合的鼠标点击自定义点阵选择,输出数值信息。

  1. //gcc -o dotmatrix dotmatrix.c -lSDL2

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <SDL2/SDL.h>

  5. #define WIDTH 16
  6. #define HEIGHT 16
  7. #define DOT_SIZE 30
  8. #define MARGIN 20
  9. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  10. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  11. #define FRAME_DELAY 50

  12. // 自定义16进制字符映射(0~15)
  13. const char* hex_map[16] = {
  14.     "一", "二", "三", "四", "五", "六", "七", "八",
  15.     "九", "十", "壹", "贰", "叁", "肆", "伍", "陆"
  16. };

  17. // 将点阵写入 2.txt
  18. void save_dot_to_file(int dot[HEIGHT][WIDTH]) {
  19.     FILE* fp = fopen("2.txt", "w");
  20.     if (!fp) {
  21.         fprintf(stderr, "无法创建文件 2.txt\n");
  22.         return;
  23.     }

  24.     // 设置UTF-8编码(可选,Linux/macOS默认UTF-8)
  25.     // Windows可能需要额外处理,但fopen默认ANSI;若需UTF-8可加BOM或用_setmode,此处简化
  26.     // 我们直接写UTF-8字符串

  27.     // 遍历256位,生成64个hex字符(从左上到右下,高位在前)
  28.     for (int i = 0; i < 64; i++) {
  29.         // 每个hex字符由4个bit组成
  30.         int nibble = 0;
  31.         for (int b = 0; b < 4; b++) {
  32.             int bit_index = i * 4 + b; // 0 ~ 255
  33.             int y = bit_index / WIDTH;
  34.             int x = bit_index % WIDTH;
  35.             if (y < HEIGHT && x < WIDTH && dot[y][x]) {
  36.                 nibble |= (1 << (3 - b)); // 高位在前(bit0是最高位)
  37.             }
  38.         }
  39.         fputs(hex_map[nibble], fp);
  40.     }
  41.     fputc('\n', fp);
  42.     fclose(fp);
  43. }

  44. int main(int argc, char* argv[]) {
  45.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  46.         printf("无法初始化SDL:%s\n", SDL_GetError());
  47.         return -1;
  48.     }

  49.     SDL_Window* window = SDL_CreateWindow(
  50.         "16x16 点阵编辑器(状态已保存至 2.txt)",
  51.         SDL_WINDOWPOS_CENTERED,
  52.         SDL_WINDOWPOS_CENTERED,
  53.         WINDOW_WIDTH,
  54.         WINDOW_HEIGHT,
  55.         SDL_WINDOW_SHOWN
  56.     );
  57.     if (!window) {
  58.         printf("无法创建窗口:%s\n", SDL_GetError());
  59.         SDL_Quit();
  60.         return -1;
  61.     }

  62.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  63.     if (!renderer) {
  64.         printf("无法创建渲染器:%s\n", SDL_GetError());
  65.         SDL_DestroyWindow(window);
  66.         SDL_Quit();
  67.         return -1;
  68.     }

  69.     int dot[HEIGHT][WIDTH] = {0};
  70.     int running = 1;
  71.     SDL_Event event;

  72.     // 初始保存一次(全0)
  73.     save_dot_to_file(dot);

  74.     while (running) {
  75.         while (SDL_PollEvent(&event)) {
  76.             if (event.type == SDL_QUIT) {
  77.                 running = 0;
  78.             }
  79.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  80.                 int mouse_x = event.button.x;
  81.                 int mouse_y = event.button.y;

  82.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  83.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  84.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  85.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  86.                     // 状态改变,立即保存
  87.                     save_dot_to_file(dot);
  88.                 }
  89.             }
  90.         }

  91.         // 清屏
  92.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  93.         SDL_RenderClear(renderer);

  94.         // 绘制点阵
  95.         for (int y = 0; y < HEIGHT; y++) {
  96.             for (int x = 0; x < WIDTH; x++) {
  97.                 SDL_SetRenderDrawColor(renderer,
  98.                     dot[y][x] ? 0 : 220,
  99.                     dot[y][x] ? 0 : 220,
  100.                     dot[y][x] ? 0 : 220,
  101.                     255
  102.                 );
  103.                 SDL_Rect rect = {
  104.                     MARGIN + x * DOT_SIZE,
  105.                     MARGIN + y * DOT_SIZE,
  106.                     DOT_SIZE - 2,
  107.                     DOT_SIZE - 2
  108.                 };
  109.                 SDL_RenderFillRect(renderer, &rect);
  110.             }
  111.         }

  112.         SDL_RenderPresent(renderer);
  113.         SDL_Delay(FRAME_DELAY);
  114.     }

  115.     SDL_DestroyRenderer(renderer);
  116.     SDL_DestroyWindow(window);
  117.     SDL_Quit();
  118.     return 0;
  119. }
复制代码
可以鼠标点击图形输出,可以使用中文代表为对应16进制输出为2.txt,用cat 2.txt,可以查看。

  1. 0=一,1=二,2=三,3=四,4=五,5=六,6=七,7=八,8=九,9=十,a=壹,b=贰,c=叁,d=肆,e=伍,f=陆,
  2. 一一一一一一一一一一一一一一一一一一一一一三一一一三九一一伍九一一贰九一一壹一一一四九一一三九一一伍九一一一一一一一一一一一一一
复制代码
 楼主| 发表于 2025-12-29 16:42:39 | 显示全部楼层
两个程序,一个程序鼠标点击16x16点阵的自定义01字符16行,输出到2.txt,另一个程序读取2.txt,读取显示到16x16图形页面,是可以直接显示对接的。
鼠标点击的程序
16x16点阵点击输出二进制16行.c

  1. //编译命令 gcc -o 16x16点阵点击输出二进制16行 16x16点阵点击输出二进制16行.c -lSDL2
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <SDL2/SDL.h>

  5. #define WIDTH 16
  6. #define HEIGHT 16
  7. #define DOT_SIZE 30
  8. #define MARGIN 20
  9. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  10. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  11. #define FRAME_DELAY 50

  12. // 将点阵以分行二进制形式(每行16个0/1)写入 2.txt
  13. void save_dot_to_file(int dot[HEIGHT][WIDTH]) {
  14.     FILE* fp = fopen("2.txt", "w");
  15.     if (!fp) {
  16.         fprintf(stderr, "无法创建文件 2.txt\n");
  17.         return;
  18.     }

  19.     for (int y = 0; y < HEIGHT; y++) {
  20.         for (int x = 0; x < WIDTH; x++) {
  21.             fputc(dot[y][x] ? '1' : '0', fp);
  22.         }
  23.         fputc('\n', fp); // 每行结束后换行
  24.     }
  25.     fclose(fp);
  26. }

  27. int main(int argc, char* argv[]) {
  28.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  29.         printf("无法初始化SDL:%s\n", SDL_GetError());
  30.         return -1;
  31.     }

  32.     SDL_Window* window = SDL_CreateWindow(
  33.         "16x16 点阵编辑器(二进制已保存至 2.txt,每行16位)",
  34.         SDL_WINDOWPOS_CENTERED,
  35.         SDL_WINDOWPOS_CENTERED,
  36.         WINDOW_WIDTH,
  37.         WINDOW_HEIGHT,
  38.         SDL_WINDOW_SHOWN
  39.     );
  40.     if (!window) {
  41.         printf("无法创建窗口:%s\n", SDL_GetError());
  42.         SDL_Quit();
  43.         return -1;
  44.     }

  45.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  46.     if (!renderer) {
  47.         printf("无法创建渲染器:%s\n", SDL_GetError());
  48.         SDL_DestroyWindow(window);
  49.         SDL_Quit();
  50.         return -1;
  51.     }

  52.     int dot[HEIGHT][WIDTH] = {0}; // 初始化全灭
  53.     int running = 1;
  54.     SDL_Event event;

  55.     // 初始保存(全0)
  56.     save_dot_to_file(dot);

  57.     while (running) {
  58.         while (SDL_PollEvent(&event)) {
  59.             if (event.type == SDL_QUIT) {
  60.                 running = 0;
  61.             }
  62.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  63.                 int mouse_x = event.button.x;
  64.                 int mouse_y = event.button.y;

  65.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  66.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  67.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  68.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  69.                     save_dot_to_file(dot); // 状态改变,立即保存
  70.                 }
  71.             }
  72.         }

  73.         // 渲染画面
  74.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 白色背景
  75.         SDL_RenderClear(renderer);

  76.         for (int y = 0; y < HEIGHT; y++) {
  77.             for (int x = 0; x < WIDTH; x++) {
  78.                 // 亮:黑色;灭:浅灰色
  79.                 Uint8 color = dot[y][x] ? 0 : 220;
  80.                 SDL_SetRenderDrawColor(renderer, color, color, color, 255);
  81.                 SDL_Rect rect = {
  82.                     MARGIN + x * DOT_SIZE,
  83.                     MARGIN + y * DOT_SIZE,
  84.                     DOT_SIZE - 2,
  85.                     DOT_SIZE - 2
  86.                 };
  87.                 SDL_RenderFillRect(renderer, &rect);
  88.             }
  89.         }

  90.         SDL_RenderPresent(renderer);
  91.         SDL_Delay(FRAME_DELAY);
  92.     }

  93.     // 清理资源
  94.     SDL_DestroyRenderer(renderer);
  95.     SDL_DestroyWindow(window);
  96.     SDL_Quit();
  97.     return 0;
  98. }
复制代码
 楼主| 发表于 2025-12-29 16:45:08 | 显示全部楼层
第二个程序读取2.txt内容
16x16点阵点击输出二进制16行.c

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h> // for usleep

  7. #define GRID_SIZE 16
  8. #define CELL_SIZE 20
  9. #define WINDOW_WIDTH  (GRID_SIZE * CELL_SIZE)
  10. #define WINDOW_HEIGHT (GRID_SIZE * CELL_SIZE)

  11. const char* filename = "2.txt";

  12. int grid[GRID_SIZE][GRID_SIZE] = {0};
  13. time_t last_mtime = 0;

  14. // 创建默认文件(全0)
  15. void create_default_file() {
  16.     FILE* fp = fopen(filename, "w");
  17.     if (!fp) {
  18.         fprintf(stderr, "Cannot create default file %s\n", filename);
  19.         return;
  20.     }
  21.     for (int y = 0; y < GRID_SIZE; y++) {
  22.         for (int x = 0; x < GRID_SIZE; x++) {
  23.             fputc('0', fp);
  24.         }
  25.         fputc('\n', fp);
  26.     }
  27.     fclose(fp);
  28.     printf("Created default %s (all zeros).\n", filename);
  29. }

  30. // 加载位图文件到 grid
  31. int load_bitmap() {
  32.     FILE* fp = fopen(filename, "r");
  33.     if (!fp) {
  34.         printf("File %s not found.\n", filename);
  35.         create_default_file();
  36.         fp = fopen(filename, "r");
  37.         if (!fp) return -1;
  38.     }

  39.     char line[32];
  40.     int y = 0;
  41.     while (fgets(line, sizeof(line), fp) && y < GRID_SIZE) {
  42.         for (int x = 0; x < GRID_SIZE && line[x]; x++) {
  43.             grid[y][x] = (line[x] == '1') ? 1 : 0;
  44.         }
  45.         y++;
  46.     }
  47.     fclose(fp);

  48.     // 补全不足16行的情况(安全处理)
  49.     for (; y < GRID_SIZE; y++) {
  50.         for (int x = 0; x < GRID_SIZE; x++) {
  51.             grid[y][x] = 0;
  52.         }
  53.     }

  54.     // 获取当前修改时间
  55.     struct stat st;
  56.     if (stat(filename, &st) == 0) {
  57.         last_mtime = st.st_mtime;
  58.     }
  59.     return 0;
  60. }

  61. // 渲染点阵
  62. void render(SDL_Renderer* renderer) {
  63.     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  64.     SDL_RenderClear(renderer);

  65.     for (int y = 0; y < GRID_SIZE; y++) {
  66.         for (int x = 0; x < GRID_SIZE; x++) {
  67.             SDL_Rect rect = { x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE };
  68.             SDL_SetRenderDrawColor(renderer,
  69.                 grid[y][x] ? 0 : 255,
  70.                 grid[y][x] ? 0 : 255,
  71.                 grid[y][x] ? 0 : 255,
  72.                 255
  73.             );
  74.             SDL_RenderFillRect(renderer, &rect);
  75.         }
  76.     }

  77.     // 可选:网格线
  78.     SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
  79.     for (int i = 0; i <= GRID_SIZE; i++) {
  80.         SDL_RenderDrawLine(renderer, i * CELL_SIZE, 0, i * CELL_SIZE, WINDOW_HEIGHT);
  81.         SDL_RenderDrawLine(renderer, 0, i * CELL_SIZE, WINDOW_WIDTH, i * CELL_SIZE);
  82.     }

  83.     SDL_RenderPresent(renderer);
  84. }

  85. // 检查文件是否被修改
  86. int file_modified() {
  87.     struct stat st;
  88.     if (stat(filename, &st) != 0) {
  89.         // 文件被删除?当作已修改(下次加载会重建)
  90.         return 1;
  91.     }
  92.     return (st.st_mtime != last_mtime);
  93. }

  94. int main(int argc, char* argv[]) {
  95.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  96.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  97.         return 1;
  98.     }

  99.     SDL_Window* window = SDL_CreateWindow(
  100.         "16x16 Dot Matrix Auto-Refresh Viewer",
  101.         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  102.         WINDOW_WIDTH, WINDOW_HEIGHT,
  103.         SDL_WINDOW_SHOWN
  104.     );
  105.     if (!window) {
  106.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  107.         SDL_Quit();
  108.         return 1;
  109.     }

  110.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  111.     if (!renderer) {
  112.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  113.         SDL_DestroyWindow(window);
  114.         SDL_Quit();
  115.         return 1;
  116.     }

  117.     // 初次加载
  118.     if (load_bitmap() != 0) {
  119.         fprintf(stderr, "Failed to load bitmap.\n");
  120.         SDL_DestroyRenderer(renderer);
  121.         SDL_DestroyWindow(window);
  122.         SDL_Quit();
  123.         return 1;
  124.     }
  125.     render(renderer);

  126.     int running = 1;
  127.     SDL_Event e;
  128.     const Uint32 CHECK_INTERVAL_MS = 500; // 每500毫秒检查一次
  129.     Uint32 last_check = SDL_GetTicks();

  130.     while (running) {
  131.         while (SDL_PollEvent(&e)) {
  132.             if (e.type == SDL_QUIT) {
  133.                 running = 0;
  134.             } else if (e.type == SDL_KEYDOWN) {
  135.                 if (e.key.keysym.sym == SDLK_r) {
  136.                     printf("Manual reload triggered.\n");
  137.                     if (load_bitmap() == 0) render(renderer);
  138.                 } else if (e.key.keysym.sym == SDLK_ESCAPE) {
  139.                     running = 0;
  140.                 }
  141.             }
  142.         }

  143.         // 自动检查文件是否被外部修改
  144.         Uint32 now = SDL_GetTicks();
  145.         if (now - last_check >= CHECK_INTERVAL_MS) {
  146.             last_check = now;
  147.             if (file_modified()) {
  148.                 printf("Detected change in %s, reloading...\n", filename);
  149.                 if (load_bitmap() == 0) {
  150.                     render(renderer);
  151.                 }
  152.             }
  153.         }

  154.         SDL_Delay(16); // ~60 FPS
  155.     }

  156.     SDL_DestroyRenderer(renderer);
  157.     SDL_DestroyWindow(window);
  158.     SDL_Quit();
  159.     return 0;
  160. }

  161. //gcc -o 16x16点阵刷新1 16x16点阵刷新1.c -lSDL2
复制代码
运行编译后的执行程序,就可以对应电器开关一样,这边点击,那边对应显示。(好像没有什么意义!)
 楼主| 发表于 2026-1-6 09:35:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-6 09:37 编辑

linux mint22.2下,nasm汇编+SDL2的C语言图形库,做点阵位图的数字集,八进制无文字颜色代表集=八卦排序全组合,满编全十进制,阿拉伯数字,汉字数字,麻将,苏州数字,天干地支十二进制挪用等多十进制,百进制,千字文的千进制,阿拉伯数字组成的万进制和亿进制可能。
 楼主| 发表于 2026-1-24 11:26:20 | 显示全部楼层
寒夜孤星的6个bat批处理,通过AI自动信息通义千问,转为perl版。
6
第六种
han6.pl

  1. #!/usr/bin/perl
  2. use strict;      # 启用严格模式,强制声明变量
  3. use warnings;    # 启用警告,帮助发现潜在错误

  4. # 定义要排列的四个汉字
  5. my @chars = ('寒', '夜', '孤', '星');

  6. # 用于存储所有排列结果的数组
  7. my @results;

  8. # 递归函数:生成全排列
  9. # 参数:
  10. #    $ prefix     —— 当前已拼接的字符串(前缀)
  11. #    $ remaining  —— 剩余可选字符的数组引用
  12. sub permute {
  13.     my ( $prefix, $remaining) = @_;

  14.     # 如果剩余字符为空,说明已形成一个完整排列
  15.     if (@$remaining == 0) {
  16.         push @results, $prefix;   # 将结果保存到数组
  17.         print " $prefix\n";        # 输出该排列(注意:原脚本前面有空格,这里已去除)
  18.         return;
  19.     }

  20.     # 遍历剩余字符中的每一个位置
  21.     for my $i (0 ..  $#{ $remaining}) {
  22.         my @new_remaining = @$remaining;           # 复制剩余字符列表
  23.         my $char = splice(@new_remaining, $i, 1);  # 取出第 i 个字符
  24.         permute( $prefix . $char, \@new_remaining); # 递归:前缀加上该字符,剩余列表更新
  25.     }
  26. }

  27. # 从空前缀和完整字符列表开始递归
  28. permute("", \@chars);

  29. # 输出总共有多少种排列方式(4! = 24)
  30. print scalar(@results) . "种组合方式\n";

  31. # 暂停程序,等待用户按回车(类似 Windows 的 pause)
  32. <>;
复制代码
第六种输出结果

  1. 寒夜孤星
  2. 寒夜星孤
  3. 寒孤夜星
  4. 寒孤星夜
  5. 寒星夜孤
  6. 寒星孤夜
  7. 夜寒孤星
  8. 夜寒星孤
  9. 夜孤寒星
  10. 夜孤星寒
  11. 夜星寒孤
  12. 夜星孤寒
  13. 孤寒夜星
  14. 孤寒星夜
  15. 孤夜寒星
  16. 孤夜星寒
  17. 孤星寒夜
  18. 孤星夜寒
  19. 星寒夜孤
  20. 星寒孤夜
  21. 星夜寒孤
  22. 星夜孤寒
  23. 星孤寒夜
  24. 星孤夜寒
  25. 24种组合方式
复制代码
 楼主| 发表于 2026-4-3 15:58:04 | 显示全部楼层

DOS到LINUX使用的点阵PSF字体

本帖最后由 zzz19760225 于 2026-4-3 18:03 编辑

linux下自制字符,

制作永久生效的自制终端字体,核心是 修改点阵字模,而不是简单地更换字体文件。这需要用到专门的编辑器 fontopia。

2. 修改终端字体,自制字形(永久生效)

Linux 终端通常用 PCF/PSF 字体,可以修改。

    提取字体:cp /usr/share/consolefonts/Lat2-Terminus16.psf.gz . ; gunzip Lat2-Terminus16.psf.gz

    转换格式:psf2raw Lat2-Terminus16.psf raw.bin (需 psfutils)

    修改位图:用 16 进制编辑器修改 raw.bin(每个字符是 16 字节,每字节代表一行 8 像素)。需对照原字体映射表。

    回转换:raw2psf raw.bin myfont.psf ; sudo cp myfont.psf /usr/share/consolefonts/

    加载:setfont myfont.psf(立即生效,重启恢复)。永久修改需配置 /etc/vconsole.conf。

⚠️ 注意:现代图形终端(gnome-terminal, konsole)通常忽略控制台字体,需要使用 framebuffer 控制台(Ctrl+Alt+F2)才能看到效果。



你可以放心修改终端字体,它完全不影响你使用 Ctrl + Alt + F7 切换回图形界面。
原因很简单:

    修改对象不同:你修改的 setfont 和 /etc/vconsole.conf 只作用于虚拟终端(也就是 tty1 到 tty6,通常按 Ctrl + Alt + F2 到 F6 进入)。而你日常使用的图形界面(GNOME、KDE、Deepin等)通常运行在 tty7 或 tty1(取决于发行版),Ctrl + Alt + F7 正是切换到它的快捷键。

    互不干扰:虚拟终端和图形界面使用完全独立的字体系统和显示驱动。你在 tty2 里把字母 'A' 改成一只小乌龟,图形界面里的 Firefox、终端模拟器、文本编辑器丝毫不会受影响。同样,切换回图形界面的快捷键功能也完好无损。

总结:

    在 tty2-tty6:看到的是你自制的字体。

    按 Ctrl + Alt + F7 回到图形界面:一切如常,字体没变,快捷键正常工作。

    再按 Ctrl + Alt + F2 回去:自制字体依然在。

所以放心大胆去修改吧,这就像你给自己书房换了个台灯,完全不影响客厅的照明和开关。


PSF 字体全称 PC Screen Font(PC 屏幕字体),是一种古老的等宽位图字体格式。

它最早在 1989 年左右为 DOS 系统设计,后被 Linux 内核采纳为控制台默认字体

手动绘制或微调单个字形,像用画图软件一样        gbdfed (图形化)

方案一:gbdfed —— 图形化界面,直观易用

如果你习惯使用鼠标,喜欢所见即所得的编辑方式,gbdfed 是最佳选择



    核心优势:它是一个基于 GTK 的图形界面软件,可以像在画图软件里一样,用鼠标点像素来设计字形。它的最大亮点是原生支持导入和导出 PSF 格式,可以完美融入你的工作流。

    工作流程:gbdfed 的逻辑是先将 PSF 字体导入,在内部转换成 BDF 格式进行编辑,然后再导出回 PSF2 格式

。这个过程对用户是透明的,你不必关心格式转换的细节。

编辑能力:可以自由绘制每个字符的点阵图,复制粘贴字形,修改字体属性(如大小、间距等),并且支持 Unicode 字符映射



安装方法:在 Linux Mint 的终端中运行以下命令即可安装:
bash

sudo apt update
sudo apt install gbdfed

用gbdfed,建立1234567890a,;:.字符,从10进制开始的数字集。
 楼主| 发表于 2026-4-12 14:53:30 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-4-12 15:34 编辑

Linux 6.14.5 版本
内核源码极为庞大,但目录结构非常清晰。理解每个顶级目录的职责,是深入源码的第一步:
  1. arch/------硬件架构相关代码-------------x86/, arm64/, loongarch/ 等
  2. block/-----块设备层(管理硬盘、SSD等)--blk-cgroup.c, bdev.c
  3. crypto/----加密API的实现----------------crypto_null.c, ecdsa-p1363.c
  4. Documentation/--内核文档(非常重要!)--admin-guide/, bpf/, trace/
  5. drivers/---硬件驱动(占源码大半)-------gpu/, net/, usb/, ata/
  6. fs/--------文件系统实现-----------------ext4/, btrfs/, overlayfs/
  7. include/---内核头文件-------------------linux/, asm-generic/
  8. init/------内核启动初始化---------------main.c (start_kernel 入口)
  9. ipc/-------进程间通信-------------------msg.c, sem.c, shm.c
  10. kernel/----核心子系统(调度、中断等)---sched/, irq/, printk/
  11. lib/-------内核通用库函数---------------radix-tree.c, sort.c
  12. mm/--------内存管理---------------------page_alloc.c, vmscan.c
  13. net/-------网络协议栈-------------------ipv4/, ipv6/, socket.c
  14. scripts/---构建和配置脚本---------------kconfig/, patch-kernel
  15. security/--安全框架(如SELinux)--------apparmor/, keys/
  16. sound/-----音频子系统-------------------pci/, usb/, core/
  17. tools/-----与内核交互的用户态工具-------perf/, objtool/
  18. usr/-------initramfs 生成相关-----------gen_init_cpio.c
  19. 顶级目录---核心功能---------------------关键子模块/文件举例

复制代码

按照字符数量排序18个集合
  1.                  2
  2. fs/--------文件系统实现-----------------ext4/, btrfs/, overlayfs/
  3. mm/--------内存管理---------------------page_alloc.c, vmscan.c
  4.                  3
  5. usr/-------initramfs 生成相关-----------gen_init_cpio.c
  6. lib/-------内核通用库函数---------------radix-tree.c, sort.c
  7. ipc/-------进程间通信-------------------msg.c, sem.c, shm.c
  8. net/-------网络协议栈-------------------ipv4/, ipv6/, socket.c
  9.                  4
  10. arch/------硬件架构相关代码-------------x86/, arm64/, loongarch/ 等
  11. init/------内核启动初始化---------------main.c (start_kernel 入口)
  12.                  5
  13. block/-----块设备层(管理硬盘、SSD等)--blk-cgroup.c, bdev.c
  14. sound/-----音频子系统-------------------pci/, usb/, core/
  15. tools/-----与内核交互的用户态工具-------perf/, objtool/
  16.                  6
  17. kernel/----核心子系统(调度、中断等)---sched/, irq/, printk/
  18. crypto/----加密API的实现----------------crypto_null.c, ecdsa-p1363.c
  19.                  7
  20. include/---内核头文件-------------------linux/, asm-generic/
  21. scripts/---构建和配置脚本---------------kconfig/, patch-kernel
  22. drivers/---硬件驱动(占源码大半)-------gpu/, net/, usb/, ata/
  23.                  8
  24. security/--安全框架(如SELinux)--------apparmor/, keys/

  25. Documentation/--内核文档(非常重要!)--admin-guide/, bpf/, trace/
复制代码
 楼主| 发表于 2026-4-13 16:12:24 | 显示全部楼层

面汉字笔画种类单元组合=对应字母线的点

本帖最后由 zzz19760225 于 2026-4-15 13:19 编辑

汉字笔画种类
4,横竖劈捺
5,横竖撇点折
6,横竖撇捺点提
8,横竖撇捺点提钩折,横竖撇捺点提钩弯,

31
32

36
37

50

a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z

A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z

  1. Bin(二进制)--Oct(八进制)--Dec(十进制)--Hex(十六进制)--缩写/字符解释
  2. 0000 0000----00-----------0------------0x00-----------NUL(null)空字符
  3. 0000 0001----01-----------1------------0x01-----------SOH(start of headline)标题开始
  4. 0000 0010----02-----------2------------0x02-----------STX (start of text)正文开始
  5. 0000 0011----03-----------3------------0x03-----------ETX (end of text)正文结束
  6. 0000 0100----04-----------4------------0x04-----------EOT (end of transmission)传输结束
  7. 0000 0101----05-----------5------------0x05-----------ENQ (enquiry)请求
  8. 0000 0110----06-----------6------------0x06-----------ACK (acknowledge)收到通知
  9. 0000 0111----07-----------7------------0x07-----------BEL (bell)响铃
  10. 0000 1000----010----------8------------0x08-----------BS (backspace)退格
  11. 0000 1001----011----------9------------0x09-----------HT (horizontal tab)水平制表符
  12. 0000 1010----012----------10-----------0x0A-----------LF (NL line feed, new line)换行键
  13. 0000 1011----013----------11-----------0x0B-----------VT (vertical tab)垂直制表符
  14. 0000 1100----014----------12-----------0x0C-----------FF (NP form feed, new page)换页键
  15. 0000 1101----015----------13-----------0x0D-----------CR (carriage return)回车键
  16. 0000 1110----016----------14-----------0x0E-----------SO (shift out)不用切换
  17. 0000 1111----017----------15-----------0x0F-----------SI (shift in)启用切换
  18. 0000 1110016140x0ESO (shift out)不用切换
  19. 0000 1111017150x0FSI (shift in)启用切换
  20. 0001 0000020160x10DLE (data link escape)数据链路转义
  21. 0001 0001021170x11DC1 (device control 1)设备控制1
  22. 0001 0010022180x12DC2 (device control 2)设备控制2
  23. 0001 0011023190x13DC3 (device control 3)设备控制3
  24. 0001 0100024200x14DC4 (device control 4)设备控制4
  25. 0001 0101025210x15NAK (negative acknowledge)拒绝接收
  26. 0001 0110026220x16SYN (synchronous idle)同步空闲
  27. 0001 0111027230x17ETB (end of trans. block)结束传输块
  28. 0001 1000030240x18CAN (cancel)取消
  29. 0001 1001031250x19EM (end of medium)媒介结束
  30. 0001 1010032260x1ASUB (substitute)代替
  31. 0001 1011033270x1BESC (escape)换码(溢出)
  32. 0001 1100034280x1CFS (file separator)文件分隔符
  33. 0001 1101035290x1DGS (group separator)分组符
  34. 0001 1110036300x1ERS (record separator)记录分隔符
  35. 0001 1111037310x1FUS (unit separator)单元分隔符
  36. 0010 0000040320x20(space)空格
  37. 0010 0001041330x21!叹号
  38. 0010 0010042340x22"双引号
  39. 0010 0011043350x23#井号
  40. 0010 0100044360x24$美元符
  41. 0010 0101045370x25%百分号
  42. 0010 0110046380x26&和号
  43. 0010 0111047390x27'单引号
  44. 0010 1000050400x28(开括号
  45. 0010 1001051410x29)闭括号
  46. 0010 1010052420x2A*星号
  47. 0010 1011
  48.        
  49. 053
  50.        
  51. 43
  52.        
  53. 0x2B
  54.        
  55. +
  56.        
  57. 加号
  58. 0010 1100
  59.        
  60. 054
  61.        
  62. 44
  63.        
  64. 0x2C
  65.        
  66. ,
  67.        
  68. 逗号
  69. 0010 1101
  70.        
  71. 055
  72.        
  73. 45
  74.        
  75. 0x2D
  76.        
  77. -
  78.        
  79. 减号/破折号
  80. 0010 1110
  81.        
  82. 056
  83.        
  84. 46
  85.        
  86. 0x2E
  87.        
  88. .
  89.        
  90. 句号
  91. 0010 1111
  92.        
  93. 057
  94.        
  95. 47
  96.        
  97. 0x2F
  98.        
  99. /
  100.        
  101. 斜杠
  102. 0011 0000
  103.        
  104. 060
  105.        
  106. 48
  107.        
  108. 0x30
  109.        
  110. 0
  111.        
  112. 字符0
  113. 0011 0001
  114.        
  115. 061
  116.        
  117. 49
  118.        
  119. 0x31
  120.        
  121. 1
  122.        
  123. 字符1
  124. 0011 0010
  125.        
  126. 062
  127.        
  128. 50
  129.        
  130. 0x32
  131.        
  132. 2
  133.        
  134. 字符2
  135. 0011 0011
  136.        
  137. 063
  138.        
  139. 51
  140.        
  141. 0x33
  142.        
  143. 3
  144.        
  145. 字符3
  146. 0011 0100
  147.        
  148. 064
  149.        
  150. 52
  151.        
  152. 0x34
  153.        
  154. 4
  155.        
  156. 字符4
  157. 0011 0101
  158.        
  159. 065
  160.        
  161. 53
  162.        
  163. 0x35
  164.        
  165. 5
  166.        
  167. 字符5
  168. 0011 0110
  169.        
  170. 066
  171.        
  172. 54
  173.        
  174. 0x36
  175.        
  176. 6
  177.        
  178. 字符6
  179. 0011 0111
  180.        
  181. 067
  182.        
  183. 55
  184.        
  185. 0x37
  186.        
  187. 7
  188.        
  189. 字符7
  190. 0011 1000
  191.        
  192. 070
  193.        
  194. 56
  195.        
  196. 0x38
  197.        
  198. 8
  199.        
  200. 字符8
  201. 0011 1001
  202.        
  203. 071
  204.        
  205. 57
  206.        
  207. 0x39
  208.        
  209. 9
  210.        
  211. 字符9
  212. 0011 1010
  213.        
  214. 072
  215.        
  216. 58
  217.        
  218. 0x3A
  219.        
  220. :
  221.        
  222. 冒号
  223. 0011 1011
  224.        
  225. 073
  226.        
  227. 59
  228.        
  229. 0x3B
  230.        
  231. ;
  232.        
  233. 分号
  234. 0011 1100
  235.        
  236. 074
  237.        
  238. 60
  239.        
  240. 0x3C
  241.        
  242. <
  243.        
  244. 小于
  245. 0011 1101
  246.        
  247. 075
  248.        
  249. 61
  250.        
  251. 0x3D
  252.        
  253. =
  254.        
  255. 等号
  256. 0011 1110
  257.        
  258. 076
  259.        
  260. 62
  261.        
  262. 0x3E
  263.        
  264. >
  265.        
  266. 大于
  267. 0011 1111
  268.        
  269. 077
  270.        
  271. 63
  272.        
  273. 0x3F
  274.        
  275. ?
  276.        
  277. 问号
  278. 0100 0000
  279.        
  280. 0100
  281.        
  282. 64
  283.        
  284. 0x40
  285.        
  286. @
  287.        
  288. 电子邮件符号
  289. 0100 0001
  290.        
  291. 0101
  292.        
  293. 65
  294.        
  295. 0x41
  296.        
  297. A
  298.        
  299. 大写字母A
  300. 0100 0010
  301.        
  302. 0102
  303.        
  304. 66
  305.        
  306. 0x42
  307.        
  308. B
  309.        
  310. 大写字母B
  311. 0100 0011
  312.        
  313. 0103
  314.        
  315. 67
  316.        
  317. 0x43
  318.        
  319. C
  320.        
  321. 大写字母C
  322. 0100 0100
  323.        
  324. 0104
  325.        
  326. 68
  327.        
  328. 0x44
  329.        
  330. D
  331.        
  332. 大写字母D
  333. 0100 0101
  334.        
  335. 0105
  336.        
  337. 69
  338.        
  339. 0x45
  340.        
  341. E
  342.        
  343. 大写字母E
  344. 0100 0110
  345.        
  346. 0106
  347.        
  348. 70
  349.        
  350. 0x46
  351.        
  352. F
  353.        
  354. 大写字母F
  355. 0100 0111
  356.        
  357. 0107
  358.        
  359. 71
  360.        
  361. 0x47
  362.        
  363. G
  364.        
  365. 大写字母G
  366. 0100 1000
  367.        
  368. 0110
  369.        
  370. 72
  371.        
  372. 0x48
  373.        
  374. H
  375.        
  376. 大写字母H
  377. 0100 1001
  378.        
  379. 0111
  380.        
  381. 73
  382.        
  383. 0x49
  384.        
  385. I
  386.        
  387. 大写字母I
  388. 01001010
  389.        
  390. 0112
  391.        
  392. 74
  393.        
  394. 0x4A
  395.        
  396. J
  397.        
  398. 大写字母J
  399. 0100 1011
  400.        
  401. 0113
  402.        
  403. 75
  404.        
  405. 0x4B
  406.        
  407. K
  408.        
  409. 大写字母K
  410. 0100 1100
  411.        
  412. 0114
  413.        
  414. 76
  415.        
  416. 0x4C
  417.        
  418. L
  419.        
  420. 大写字母L
  421. 0100 1101
  422.        
  423. 0115
  424.        
  425. 77
  426.        
  427. 0x4D
  428.        
  429. M
  430.        
  431. 大写字母M
  432. 0100 1110
  433.        
  434. 0116
  435.        
  436. 78
  437.        
  438. 0x4E
  439.        
  440. N
  441.        
  442. 大写字母N
  443. 0100 1111
  444.        
  445. 0117
  446.        
  447. 79
  448.        
  449. 0x4F
  450.        
  451. O
  452.        
  453. 大写字母O
  454. 0101 0000
  455.        
  456. 0120
  457.        
  458. 80
  459.        
  460. 0x50
  461.        
  462. P
  463.        
  464. 大写字母P
  465. 0101 0001
  466.        
  467. 0121
  468.        
  469. 81
  470.        
  471. 0x51
  472.        
  473. Q
  474.        
  475. 大写字母Q
  476. 0101 0010
  477.        
  478. 0122
  479.        
  480. 82
  481.        
  482. 0x52
  483.        
  484. R
  485.        
  486. 大写字母R
  487. 0101 0011
  488.        
  489. 0123
  490.        
  491. 83
  492.        
  493. 0x53
  494.        
  495. S
  496.        
  497. 大写字母S
  498. 0101 0100
  499.        
  500. 0124
  501.        
  502. 84
  503.        
  504. 0x54
  505.        
  506. T
  507.        
  508. 大写字母T
  509. 0101 0101
  510.        
  511. 0125
  512.        
  513. 85
  514.        
  515. 0x55
  516.        
  517. U
  518.        
  519. 大写字母U
  520. 0101 0110
  521.        
  522. 0126
  523.        
  524. 86
  525.        
  526. 0x56
  527.        
  528. V
  529.        
  530. 大写字母V
  531. 0101 0111
  532.        
  533. 0127
  534.        
  535. 87
  536.        
  537. 0x57
  538.        
  539. W
  540.        
  541. 大写字母W
  542. 0101 1000
  543.        
  544. 0130
  545.        
  546. 88
  547.        
  548. 0x58
  549.        
  550. X
  551.        
  552. 大写字母X
  553. 0101 1001
  554.        
  555. 0131
  556.        
  557. 89
  558.        
  559. 0x59
  560.        
  561. Y
  562.        
  563. 大写字母Y
  564. 0101 1010
  565.        
  566. 0132
  567.        
  568. 90
  569.        
  570. 0x5A
  571.        
  572. Z
  573.        
  574. 大写字母Z
  575. 0101 10110133910x5B[开方括号
  576. 0101 11000134920x5C\反斜杠
  577. 0101 11010135930x5D]闭方括号
  578. 0101 11100136940x5E^脱字符
  579. 0101 11110137950x5F_下划线
  580. 0110 00000140960x60`开单引号
  581. 0110 00010141970x61a小写字母a
  582. 0110 00100142980x62b小写字母b
  583. 0110 00110143990x63c小写字母c
  584. 0110 010001441000x64d小写字母d
  585. 0110 010101451010x65e小写字母e
  586. 0110 011001461020x66f小写字母f
  587. 0110 011101471030x67g小写字母g
  588. 0110 100001501040x68h小写字母h
  589. 0110 100101511050x69i小写字母i
  590. 0110 101001521060x6Aj小写字母j
  591. 0110 101101531070x6Bk小写字母k
  592. 0110 110001541080x6Cl小写字母l
  593. 0110 110101551090x6Dm小写字母m
  594. 0110 111001561100x6En小写字母n
  595. 0110 111101571110x6Fo小写字母o
  596. 0111 000001601120x70p小写字母p
  597. 0111 000101611130x71q小写字母q
  598. 0111 001001621140x72r小写字母r
  599. 0111 001101631150x73s小写字母s
  600. 0111 010001641160x74t小写字母t
  601. 0111 010101651170x75u小写字母u
  602. 0111 011001661180x76v小写字母v
  603. 0111 011101671190x77w小写字母w
  604. 0111 100001701200x78x小写字母x
  605. 0111 100101711210x79y小写字母y
  606. 0111 101001721220x7Az小写字母z
  607. 0111 101101731230x7B{开花括号
  608. 0111 110001741240x7C|垂线
  609. 0111 110101751250x7D}闭花括号
  610. 0111 111001761260x7E波浪号
  611. 0111 1111 -- 0177 -- 127 -- 0x7F -- DEL (delete) -- 删除
复制代码

 楼主| 发表于 2026-4-14 20:53:57 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-4-19 18:38 编辑

simulide仿真
甲:需求本体有关的单元认识理解熟悉熟练,乙:环境测试实验内容集合,丙:实验历史记录和未来全排列的自动度(电器硬件概念层面的自动化自动信息)。
1电源,输入电流,亮一个电源灯,输出接地。[ 完成 ] 但是,需要闭环电源电流,当电池输入流入,接地为流出时,无法点亮。那么应该还不算完成。
用单向引出线的电源=Fixed Voltage-6,就可以接地点亮灯了。这个问题马马虎虎算过了吧。
2键盘逻辑单元阵列输入,输出逻辑单元阵列屏幕800x600。
模拟104键盘
模拟800x600屏幕
单开关到单屏幕点阵
单开关到多屏幕点阵
多开关到单屏幕点阵
多开关到多屏幕点阵
任意开关到任意屏幕点阵的规律和抽象概念

1环境测试电源电流电压,2电路板平台电路架构,3集成块74组织机器,4无限抽象逻辑符号组织机器。5电流公式和具体数量数字清单,组织机器图片的记录排序(基本原理的概念汉字DOS,应该在这个信息排序的选择中)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-4-26 14:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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