KDocs 研发资料库
  • 音频技术应用文档入口汇总
  • 杰理WINDOWS环境安装及其他事项
  • LINUX安装和编译
  • Linux环境编译SDK教程(ubuntu18.04)
  • 音频类补丁汇总表
  • 认证资料获取汇总(最新资料后台会更新)
  • 《Hi-Res申请指南v1.0》
  • FreeRTOS 开源协议版本
  • uCOS 开源协议版本信息
  • 各个模块关键资料汇总
  • 软件调试方法
  • Makefile编译
  • 提bug的规范
  • 常规设备使用指导
  • 对外特别发布开发注意点信息汇总
  • AD697X软件问题整理
  • AC700N软件问题整理
  • AC701X耳机软件问题整理
  • 951&961软件问题整理
  • AC104X软件问题整理
  • AC128N问题整理文档
  • 可视化工具调试问题整理
  • 耳机资料汇总
  • AC704N、 AC705N相关应用
  • AC695N&AC696N&AC608N音箱问题整理
  • JL701N音箱问题整理
  • AC692X软件问题整理
  • AC706N音箱问题整理
  • JL701N音箱问题整理(可视化工具SDK)
  • JL703N音箱问题整理
  • JL709N(JL689N)音箱问题整理
  • JL7094系列-入门到进阶开发指导
  • AC210N音箱问题整理
  • 无线麦系列版本支持指南
  • AW32N无线麦问题整理
  • lAD697X&JL701X 无线麦软件共性问题整理
  • AC706N无线麦问题整理
  • AW36N无线麦问题整理
  • AC710X无线麦问题整理
  • 唤醒源获取及唤醒IO设置
  • 电源
  • LVD
  • 长按复位配置方法
  • 低功耗应用
  • TIMER
  • UART
  • SPI
  • 内部FLASH空间添加用户自定义区域
  • IIC
  • GPIO
  • MCPWM
  • SD&U盘
  • 时钟&晶振
  • GPCNT
  • IO口crossbar映射功能
  • 文件系统使用总结
  • 复用应用
  • LINEIN_AUX相关应用
  • IIS音频接口应用
  • SPDIF模式相关(HDMI_ARC、光纤、同轴)
  • PDM LINK
  • 外设相关应用
  • 蓝牙相关
  • 杰理蓝牙距离调试文档
  • TWS耳机配对方式使用及生产把控指南
  • GFP谷歌快连及其认证流程指引
  • 蓝牙发射器(bt_emitter)相关
  • BLE应用
  • 关于提升BLE传输速率说明
  • BLE测试数据
  • MUSIC 模式相关应用
  • MIDI音乐实现
  • PC相关应用
  • FM相关应用
  • AC695N_AC696N FM天线ESD静电防护措施说明V2.0_20250107
  • fm应用详细设计说明书
  • 杰理FM硬件指南-20230315
  • ADC模块
  • AUDIO相关应用
  • 新Tools的音效调试使用
  • 混响应用使用说明
  • 音效调式
  • 音箱耳机低音小音量增强实现方法
  • DAC输出功率调试
  • DAC性能测试指南
  • 针对各类底噪、电流声分析流程
  • 录音相关应用
  • OPUS编解码相关
  • RTC相关应用
  • 升级相关
  • UI相关应用
  • 通话调试流程指南
  • 通话相关应用
  • 省电容mic使用手册
  • 如何测试验证手表通话系统的语音失真 V1.0
  • AC695X_AC696X_AD697X 常见通话问题处理参考资料
  • 通话调试问题确定步骤
  • 内置触摸调试指南
  • 低功耗内置触摸介绍V2.2
  • 触摸相关文档
  • AC697X、AC698X内置触摸调试及整改方法V1.0
  • 产测相关应用
  • AC63X BLE DUT测试介绍
  • 兆华序列使用简易说明
  • JL_1T2蓝牙测试盒音频文件更换说明
  • ENC相关应用入口汇总
  • ANC相关应用入口汇总
  • JL DMS通话调试手册-V3.9.4
  • ANC-ENC结构设计要点-20240407
  • 半入耳式ANC耳机器件选型与结构设计指南V1.0
  • JL 耳道自适应调试指南
  • ANC相关问题处理
  • ANC调试文档
  • 评估蓝牙耳机通话上行降噪性能的方法 V1.0 (2)
  • FCC 或者 BQB 认证相关应用
  • BQB profile 测试中常遇到的问题点汇总
  • 蓝牙参数整理20210811
  • 杰理科技认证问题参考
  • 无线音频产品开发指南
  • 无线麦系列从入门到进阶开发指导
  • 量产烧录相关说明
  • 一拖八烧录器远程过程调用说明
  • 量产相关建议
  • EffectTool(eq)调试工具说明文档
  • AC897AD697系列的EQ调试方法-V3
  • 杰理调音指南-20220622
  • 音效模块总结
  • 简要调音步骤指引(可视化)
  • 耳机充电与通信调试指南
  • 充电仓硬件调试指南
  • 充电仓软件问题整理
  • AC951常用说明
  • AC951_AC961_开发板使用说明V1.0
  • 彩屏仓AC982 入门指导及FAQ
  • 蓝牙音频APP相关应用
  • 手机APP的简介和开发流程
  • 蓝牙音频系列-硬件设计指南
  • 静电测试及整改方法-20220706
  • TWS耳机底噪整改指南V1.2
  • 杰理蓝牙距离调试文档
  • 蓝牙RF硬件设计与调试V1.1-20250219
  • AC695N_AC696N FM天线ESD静电防护措施说明V2.0_20241228
  • 音效调试指南
  • 无线话筒K歌音箱标准开发流程
  • 杰理科技 700N TWS耳机产品标准-202303
  • 杰理科技 701N 广播产品标准-202303
  • JL-HAT ANC高效产测自适应
  • 无线话筒测试板使用介绍
  • 一拖八频偏校准使用说明
  • 领夹麦产测工具使用介绍
  • Dongle量产测试说明
  • Dongle+Tws或头戴式 SDK通过工具绑定配对功能说明文档
  • 双麦ENC产测宏配置验证方法 V1.0
  • JL耳机方案麦克风声学测试指令_V1.0
  • JL耳机方案麦克风声学测试指令_V2.0
  • JL_ENC自动测试命令_V0.0.1
  • JL蓝牙测试盒用例说明
  • LDAC自测环境搭建_ubuntu
  • 延迟小板使用手册
  • 杰理库文件的制作及添加实现过程
  • 关于 AC635N&AC636N系列免晶振兼容性补丁 说明
  • 关于 AC63系列VM兼容性修复补丁_20250224 说明
  • 关于 AC632N &AE632N_ 蓝牙& 低功耗兼容性修复补丁 说明
  • AD698N和AC638N电压优化补丁V3说明
  • 关于 AC635N&AC636N漏电和E&G版兼容联合补丁 说明
  • AD698N和AC638N电压优化补丁V2说明
  • 702相关应用
  • 2024-4-30 发布歌词显示SDK开发注意事项
  • BQB RF & FCC 认证测试固件问题汇总及源码
  • BQB profile 测试中常遇到的问题点汇总
  • 进dut测试模式方法及固件
  • 704-频偏修改bin文件合集
  • 701手表BQB PROFILE认证注意事项
  • 认证的干扰规避整改
  • 海外CRA认证报告生成说明
  • JL700N可视化工具问题处理文档
  • JL701X可视化工具问题处理文档
  • JL701N_earphone_release_v1.6.0_ANC 低功耗问题补丁
  • JL708X可视化工具问题处理文档
  • JL709N可视化工具问题处理文档
  • JLstudio可视化工具使用说明
  • 一拖二-串口_蓝牙_app在线EQ、通话参数及调试方式和内置触摸调试
  • 可视化JL701M_DONGLE_SDK添加MIC为发射源
  • 可视化JL701M_DONGLE_SDK添加按键切换usb audio与MIC发射源
  • JL701M_DONGLE_SDK_1.0.0_dongle输入linein输出dac
  • 701可视化_a2dp_to_le_demo说明
  • 耳机系列demo汇总
  • JL7018F&JL7006F_7003F AUX IIS
  • 一键连接应用
  • 普通SDK动态开关一拖二功能
  • 蓝牙分析仪(EllisysBluetoothAnalyzer)抓包例程
  • TWS配对常见应用
  • APP自定义按键的demo
  • AC700N 播歌双EQ DEMO示例及说明
  • AC698V164 MIC与蓝牙音乐共同输出DAC demo
  • 添加第三方算法以及多算法授权流程
  • 空间音频配置方法
  • 普通高低电平TWS耳机控制通讯
  • 入耳检测状态更新demo解析
  • 资源优化(非可视化的SDK)
  • 资源优化(可视化SDK)
  • 翻译耳机、语音识别应用demo
  • 耳机抗干扰问题排查和优化
  • AC698D2 抗干扰优化
  • AC696X软件问题整理
  • AC695X软件问题整理
  • AC695X软件问题整理_1722249702
  • AC608X软件问题整理
  • JL701N_2T1_DUPLEX 应用软件问题汇总
  • le_audio_1.0.0_patch05 以及之前的版本IRkey 功能异常修改
  • AC706N-le_audio-200SDK有线_无线麦录音demo
  • jl701n_le_audio_v200patch02 IO串口升级修改串口单次发送字节长度的修改办法
  • 703创建IIS 输入dac输出音频流demo
  • 703将媒体流音频同时上传PC_mic录音demo实现
  • 703四路IIS输入输出demo
  • 底噪调试
  • AW328A烧录说明
  • 文档合集
  • AC706N_wireless_mic_release_PATCH_20240712 补丁 说明
  • AC706N_wireless_mic_release_PATCH_20240726 补丁 说明
  • AC706N_wireless_mic_release_V1.0.0、1.0.1、1.0.2 补丁 说明
  • AC706N_wireless_mic_release_V1.1.2 中的2T1应用 RX端不绑定配对,TX端实现绑定配对的修改方法
  • 各系列省晶振实现方法
  • iis tx rx说明文档
  • spdif信号
  • 蓝牙电话本
  • 安卓手机同步时间补丁
  • CDC配置
  • PC模式下增加Teams唤起功能
  • 杰理HDMIARC开发实现过程
  • AC701N patch06之前的版本用第三方算法节点实现新版本的pcm delay节点功能
  • (K歌音箱)各SDK音效配置相关说明
  • 长文件录音
  • 点阵屏歌词字库相关(蓝牙歌词,普通歌词)
  • 字模提取工具说明
  • 音箱可视化彩屏-入门到进阶开发指导
  • 彩屏LVGL UI设计及工具使用
  • 使用内部UI框架进行UI调试的系列步骤
  • AD101C使用强制升级工具spi 烧录不了问题处理(测试版本)
  • AD161扩展灯板说明文档
  • 歌词显示器开发注意项
  • 使用硬件数字增益控制通话下行音量(可视化)
  • 杰理小牛产测资料
  • ENC配置说明
  • 通话调试流程指引
  • ANC相关功能demo
  • 无线麦硬件资料汇总
  • 无线麦相关应用
  • 无线麦复杂功能补丁包汇总
  • 无线话筒形态SDK程序&开发经验&问题点分享
  • 双模式结合应用问题汇总
  • 无线麦距离优化案例
  • 无线麦系列中的双工形态(duplex)演变开发对讲机方案开发资料
  • 音箱入门到进阶指导文档(编写中)
  • 蓝牙耳机品控和生产技巧
  • 982过_欠压标志获取异常
  • 如何获取最新涂鸦SDK及库文件
  • 无线话筒K歌音响-调音标准流程
  • 无线话筒产测流程

AD161扩展灯板说明文档

📎 原始文档:https://www.kdocs.cn/l/cp7abZRrK2u7 AD161扩展灯板说明文档
工程链接:
demo仓库地址:
module / LED_IO屏 / demo · GitLab (zh-jieli.com)
子模块的更新参考:
module / LED扩展 / demo · GitLab (zh-jieli.com)

硬件资料:AD161A推12X72.zip

  • 软件调试指南 开打印以及打印配置: uart.h app_config.h TCFG_UART_TX_PORT
    灯板基础配置修改: info.h
    字库生成:LvglFontTool.exe
  1. 如何更换字库,并查看字模大小 AD161依赖于LVGL字库工具做转换和取模: fw-AD16N\led_io_drive\font\字库工具\LvglFontTool_V0.4\LvglFontTool\LvglFontTool.exe
    编码信息获取网址:https://www.haomeili.net/Code/DaQuan
    更换外国字库方式:通过上述网址获取需要的字符,输入到LvglFontTool工具生成
    image 清除重复字体后,点击生成内部字体:
    image 宋体 12号字对应 1616字模
    宋体 9号字对应 12
    12字模
    字模高度会在生成的文件中体现出来,直接用生成的myFont.c替换工程路径中的myFont.c即可替换字库。
    如果有多个语言种类要显示,只要UTF8编码范围没有冲突,就可以只用生成一个字库文件,在输入框加入不同语种字符即可,工具会自动去搜索字符并生成对应字库。
  2. 字库查询原理 歌词UTF8数据->转换UNICODE编码->根据UNICODE数据获取到字模dsc数据(长宽,字模位置等)->根据字模DSC数据获取字模的位图数据->填充在显示buf上
  • UTF8转UNICODE数据

// UTF-8转Unicode函数
int utf8ToUnicode(const ONE_DIM *String,ONE_DIM *unicode) {
    char *utf8String = String->data;
    u8 buf_len = String->len;
    int unicodeIndex = 0;
    u8 byte_cnt = 0;
    // while (*utf8String != '\0') {
    while (buf_len>byte_cnt){
        uint16_t unicodeValue = 0;
        int byteCount = 0;

        // 根据UTF-8编码规则计算Unicode码点
        if ((*utf8String & 0x80) == 0x00) {
            unicodeValue = *utf8String & 0x7F;
            byteCount = 1;
        } else if ((*utf8String & 0xE0) == 0xC0) {
            unicodeValue = *utf8String & 0x1F;
            byteCount = 2;
        } else if ((*utf8String & 0xF0) == 0xE0) {
            unicodeValue = *utf8String & 0x0F;
            byteCount = 3;
        }else
        {
            break;
        }
        
        // } else if ((*utf8String & 0xF8) == 0xF0) {
        //     unicodeValue = *utf8String & 0x07;
        //     byteCount = 4;
        // }

        // 处理多字节序列   还没有处理四字节
        for (int i = 1; i < byteCount; ++i) {
            unicodeValue = (unicodeValue << 6) | (*(utf8String + i) & 0x3F);
        }

        // 存储Unicode码点到数组中
        if (unicode->data != NULL && unicodeIndex<unicode->len) {
            ((uint16_t *)(unicode->data))[unicodeIndex] = unicodeValue;
        }

        // 移动到下一个字符
        utf8String += byteCount;
        byte_cnt += byteCount;
        unicodeIndex++;
    }

    // 在数组末尾添加NULL结尾字符
    if (unicode->data != NULL && unicodeIndex<unicode->len) {
        ((uint16_t *)(unicode->data))[unicodeIndex] = 0;
    }
    return unicodeIndex;
}
  • 获取字库DSC数据 DSC数据是存储了字符位图的大小,偏移,像素深度数据
    /* 一 /
    0xff,0xe0, //@@@@@@@@@@@.
    {​.bitmap_index = 978, .adv_w = 12, .box_h = 1, .box_w = 16, .ofs_x = 0, .ofs_y = 5​},/
    (一)/
    以字符“一"为例,其位图位置在存储数组偏移978字节开始,占用空间为box_w
    box_h/8=2byte,字模大小为:adv_w,位图在实际压缩后的纵向偏移为5.
    注意这里的5为从底部开始计算,可以根据程序对应看具体实现过程。
    image
  • 获取字库位图数据 将字符unicode码传入后,会使用二分法寻找对应的字符DSC数据,根据数据里面的bitmap_index找到对应字库位图数据,并将位图指针传输出去
    image
  • 填充在显示buf中 根据上述获取到的数据信息,将位图数据根据DSC数据的位置和压缩情况填入暂存buf之中。
    image
  1. 歌词显示串口通信协议 AD161这边只支持UTF8格式歌词显示,所以主机传输过来的歌词的需要转换成UTF8格式。
    文本格式查看工具:使用ascii.exe程序选择不同的编码对比数据内容。
    u8 data[]= "深圳市杰理微电子科技有限公司"; 这样的编码就是UTF8格式,可以直接使用%s打印字符串看是否传输正确。
    串口协议以及波特率可以自己定义,保证歌词编码传输正确即可
    image 蓝牙和LRC文件输出UTF8格式歌词参考:AC695_310文件歌词读取输出.7z( 不跑内置UI系统)
    上述示例工程中含有GB2312转UTF8格式对应表,可以移植在任意SDK中。
  2. 灯板显示原理 灯板组成是由矩阵灯板进行裁剪拼接后组成,N个IO口组成的灯数量为 NN-N(LED两端IO相同无法被点亮)
    12
    72灯板:1272 = 864 3030-30 = 870
    参考文档:12X72真值表.xlsx
    参考真值表中的按照步骤一二三四顺序获取即可得到最终排列效果
/***
 * SCAN_IO_NUME*SCAN_IO_NUME 矩阵
 * 扫描row
*/
___interrupt
AT_LED_RAM_CODE
void led_drive_time_isr(void){
    #if(LED_DRVIE_TIME_NUM==0)
    _TIMER_SFR(0)->CON |= BIT(14);
    #elif(LED_DRVIE_TIME_NUM==1)
    _TIMER_SFR(1)->CON |= BIT(14);
    #elif(LED_DRVIE_TIME_NUM==2)  
    _TIMER_SFR(2)->CON |= BIT(14);
    #endif
    // wdt_clear();
    // JL_PORTB->OUT ^= BIT(3);
    ugpio_gp_pro_set(&drvie_info.gpio[drvie_info.scan_row],USER_GPIO_HI,0);  //50
    drvie_info.scan_row=(drvie_info.scan_row+1)%SCAN_IO_NUME;

    for(int list=0,offset=0;list<SCAN_LIST_BUFF_SIZE;){   
        for(int bit=0;bit<8&&offset<SCAN_IO_NUME;bit++){
            if(drvie_info.scan_row!=offset){              
                ugpio_gp_pro_set(&drvie_info.gpio[offset],
                (drvie_info.scanbuff[drvie_info.scan_cur][drvie_info.scan_row][list]&BIT(bit))?USER_GPIO_HD01_OUT_H:USER_GPIO_HI,0);
            }
            offset++;
        }
        list++;
    }
    ugpio_gp_pro_set(&drvie_info.gpio[drvie_info.scan_row],USER_GPIO_HD01_OUT_L,0);
}

在定时器中断中会对转换后的数据进行共阴逐行扫描。

void bmp_to_gpio_data_dim(u8 indata[SINGLE_HEIGHT][DISPLAY_FRAME_LIST_SIZE]){

    // printf(">>>scan_next:%d,scan_cur:%d \n",drvie_info.scan_next,drvie_info.scan_cur);
    if(((drvie_info.scan_next+1)%SCAN_FRAME_NUMBER)==drvie_info.scan_cur)return;

    memset(drvie_info.scanbuff[drvie_info.scan_next],0,sizeof(drvie_info.scanbuff[0]));
    //map_table 范围与 indata的范围 小的为准
    int width=DISPLAY_FRAME_LIST_SIZE;
    int height=SINGLE_HEIGHT;
    int map_table_0_size=SINGLE_HEIGHT*SINGLE_WIDTH;
    if((width*8)>SINGLE_WIDTH){
        width=((SINGLE_WIDTH+4)/8);
    }
    if(height>SINGLE_HEIGHT){
        height=SINGLE_HEIGHT;
    }
    
    // printf("  tog gpio data   dim [%d][%d][%d]\r\n",width,height,map_table_0_size);
    int map_h,map_w,map_bit,offset=0;
    for(int h=0;h<SINGLE_HEIGHT;h++){
        for(int w=0;w<width;w++){
            for(int bit=0;bit<8 && offset<map_table_0_size;bit++){
                if(indata[h][w]&BIT(7-bit)){
                    map_h=map_table[h][w*8+bit][0];
                    map_w=map_table[h][w*8+bit][1]/8;
                    map_bit=map_table[h][w*8+bit][1]%8;
                    drvie_info.scanbuff[drvie_info.scan_next][map_h][map_w]|=BIT(map_bit);
                    // printf("*");
                }else{
                    // printf(" ");
                }
                offset++;   
            }
        }
        // printf("---lllll \r\n");
    }
    drvie_info.scan_cur = drvie_info.scan_next;
}

在这个函数中会将整个要显示的1272像素点大小的数据根据map_tab[]转换为要显示的3030数据。

操作示例:

  • 给定程序是1212的字库和取模填充,应当如何更改为1616的字体?

    • 更换字库,根据上述第一点选择字体大小即可,生成出来之后要看具体字模高度为多少。
    • 在程序中已经做了12和16号字体的适配,只需要更改屏驱和字体大小的定义即可。 image
  • 示例程序的字库只有中英文,还有一些中文字没有的情况,如果要解决多国语言一起的问题和某些字没有的情况,应当怎么操作? 字库并不是全字库,如果遇到没有的字在myFont.c中搜索一下,没找到就是没有添加这个字,在lvglFonttool中添加即可。
    imageimage 如果需要加外国字库,如日韩,阿拉伯等参考第一点的网址,下载对应的字库编码表txt文件,导入工具之后,清除重复即可,注意有的表中有很多图标和无用的字符,需要手动删除,不然会影响整个文件生成的大小。

本文档包含以下子页面

Prev
AD101C使用强制升级工具spi 烧录不了问题处理(测试版本)
Next
歌词显示器开发注意项