直接写显存显示字符串

                                                            直接写显存显示字符串

    80*25彩色字模式的显示显存在内存中的地址为B8000h~BFFFH,工32k.向这个地址写入的内容立即显示在屏幕上边.在80*25彩色字模式下共可以显示35行,每行80字符,每个字符有256种属性.每个字符在显存中占两个字节,第一个字节是字符的ASCII码.第二字节是字符的属性.显存分为8页,第一页的地址为B8000H~B8F9FH.每页4000字节,依次类推是其它的页面,通常情况显示第一页的内容.也可以显示其它页的内容.第一页的第一行偏移为000~09f(80字符占160个字节)一次类推是其它行.在一行中00~01对应显示器第一列.依次是其它列.属性字节的格式是:

                                    7                  6                    5                   4                3                        2                    1                        0

含义:                         BL                 R                   G                   B                I                         R                     G                      B

                              闪烁                                  背景颜色                           高亮                                         前景颜色

 

下边是直接写显存的汇编代码:

data segment
        db 'Welcome to masm!',0
data ends
 
code segment
        assume cs:code,ds:data
start:
        mov dh,1              ;dh装行号(范围:1--25)
        mov dl,1              ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
        mov cl,0cah           ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
        mov ax,data
        mov ds,ax
        mov si,0
 
        call show_str
       
        mov ax,4c00h
        int 21h
       
show_str:   ;显示字符串的子程序[定义开始]
        push cx
        push si
        mov al,0A0h
        dec dh          ;行号在显存中下标从0开始,所以减1
        mul dh
        mov bx,ax
        mov al,2
        mul dl
        sub ax,2       ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
        add bx,ax      ;此时bx中存放的是行与列号的偏移地址
        mov ax,0B800h
        mov es,ax      ;es中存放的是显存的第0页(共0--7页)的起始的段地址
        mov di,0
        mov al,cl
        mov ch,0
s:      mov cl,ds:[si]
        jcxz ok
        mov es:[bx+di],cl       ;地址存放字符
        mov es:[bx+di+1],al     ;奇地址存放字符的颜色属性
        inc si
        add di,2
        jmp short s
ok:     pop si
        pop cx
        ret    ;显示字符串的子程序[定义结束]
 
code ends
end start
 
### STM32 IIC 驱动 0.96 寸 OLED 显示显示中文字符串 为了实现 STM32 使用 IIC 协议驱动 0.96 寸 OLED 屏幕并显示中文字符,可以按照以下方法编代码。此过程涉及初始化 OLED 和设置必要的配置参数。 #### 初始化和基本配置 首先,在 `main.c` 文件中引入所需的头文件,并完成初始化工作: ```c #include "stm32f1xx_hal.h" #include "oled.h" int main(void) { HAL_Init(); SystemClock_Config(); // 系统时钟配置 oledInit(); // OLED 初始化 } ``` #### 定义字体表和支持的汉字编码 由于标准 ASCII 字符集不支持中文字符,因此需要定义一个包含常用汉字及其对应点阵图形的数据结构。通常情况下会使用 GBK 或者 UTF-8 编码来处理汉字。这里假设已经有一个预编译好的汉字库可供调用。 对于每个想要显示的具体汉字,可以通过其内部索引来访问对应的字模数据。例如,如果存在名为 `chinese_font[]` 的数组存储了所有可能要用到的汉字,则可通过下标获取特定汉字的信息。 #### 实现显示函数 接下来创建一个新的函数用于在指定坐标处绘制单个汉字: ```c void oledShowChinese(int x, int y, const uint8_t *fontData) { for (uint8_t row = 0; row < 16; ++row) { for (uint8_t col = 0; col < 8; ++col) { if ((fontData[row] >> (7 - col)) & 0x01) { oledDrawPixel(x + col, y + row / 2, BLACK); } else { oledDrawPixel(x + col, y + row / 2, WHITE); } } // 跳过偶数行以适应16x16大小的汉字 if (!(row % 2)) { y += 1; } } oledUpdate(); // 更新显存,刷新实际显示 } ``` 上述代码片段展示了如何基于给定的汉字点阵图 (`fontData`) 来逐像素填充目标区域[^1]。 #### 主程序逻辑调整 修改主循环部分以便能够连续展示不同的汉字序列: ```c const char chineseText[][4] = {"你好", "世界"}; // 假设每组最多三个字节表示一个完整的UTF-8编码汉字 for(uint8_t index = 0; index < sizeof(chineseText)/sizeof(*chineseText);++index){ uint8_t utf8Bytes[4]; memcpy(utf8Bytes,chineseText[index],strlen((char*)chineseText[index])); // 将utf8转换成gbk或其他适合的形式再查找相应的字形数据... // 这里简化处理直接传入模拟得到的字型指针 static const uint8_t simulatedFontDataForHelloWorld[]={ /* ...省略具体字型数据... */ }; oledShowChinese(index*16, 0, simulatedFontDataForHelloWorld); HAL_Delay(500); } ``` 这段伪代码说明了如何遍历待显示的文字列表并将它们逐一呈现出来。注意这里的 `simulatedFontDataForHelloWorld` 是示意性的占位符,实际上应该替换为真实的汉字字形数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值