精华内容
下载资源
问答
  • 今天小编就为大家分享一篇python 在屏幕上逐字显示一行的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 用汇编语言在屏幕上显示字体,主要向特定内存地址写入内容,就可以在屏幕上显示。 代码 assume cs:codesg,ss:data data segment db 'welcome to masm!' ; 需要显示的字符数据 db 2H,24H,71H ; 显示的颜色属性值...

    原理

    用汇编语言在屏幕上显示字体,主要向特定内存地址写入内容,就可以在屏幕上显示。

    代码

    assume cs:codesg,ss:data
    
    data segment
      db 'welcome to masm!'
      ; 需要显示的字符数据
      db 2H,24H,71H
      ; 显示的颜色属性值:绿色,绿底红色,白底蓝色
    data ends
    codesg segment                                                                                                                                               
    start: mov ax,data
           mov ss,ax      ; 把数据段的段地址赋给ss寄存器
           mov bp,0       ; 得到date数据段地址
    ; b8000h-b8f9fh 是第0页,一共4000个字符,80*25,
    ;一个字符占用两个字节,第一个字节是ascii码, 第二个字节是属性
           mov ax,0B800H ;这个0b800 就是在dos情况下显存首地址
           mov ds,ax
           mov bx,6E0H    ; 得到显存居中的内存地址,从第12开始
    
           mov di,0
           mov cx,3
       s0: mov ah,ss:[10H+di]   ; 得到数据段中颜色属性值
           mov dx,cx
           
           mov si,0    
           mov cx,16     ;循环16次是因为字符串有16个字符
    	   s1: mov al,[bp]
    	       mov [bx+si+40H],al   ; 设置数据段中显示字符,从第32个字符开始
    	       mov [bx+si+41H],ah   ; 设置显示颜色属性
    	       add si,2
    	       inc bp
    	       loop s1
           add bx,0A0H          ; 跳转到显存中的下一行
           inc di               ; 改变di,定位到date段中下一个颜色位置
           mov bp,0
           mov cx,dx
    	   loop s0
    
           mov ax,4C00H
           int 21H 
    codesg ends
    end start
    

    代码理解难点

    这个代码中用到了循环嵌套,也就是s1循环是在s0循环之中,s1循环循环长度是16,s0循环循环长度是3,也就是把‘welcome to masm!’这个字符串要在第0页并排三行显示,并且使用不同的颜色。

    展开全文
  • 屏幕显示的原理其实很简单,其实就是和点阵一样,只不过屏幕集成度高,本质控制输出高或者低,跟点灯一样。    拿0.96寸的oled来举个例子。0.96oled分辨率128*64,也就是说横向128个led,竖向64个led,你想点亮...

      最近在搞屏幕,顺便弄了一个字库芯片,刚刚测试完毕。个人认为项目中人机交互是少不了的,而显示是人机交互中的重要一环,所以准备写一篇教程记录一下。

    显示原理

      首先要知道屏幕显示的原理。屏幕显示的原理其实很简单,其实就是和点阵一样,只不过屏幕集成度高,本质控制输出高或者低,跟点灯一样。   

      拿0.96寸的oled来举个例子。0.96oled分辨率128*64,也就是说横向128个led,竖向64个led,你想点亮某个led(假设1为亮,0为灭),那么只需要将那个led对应的位置1即可。那如何显示汉字呢。其实原理也是一样的。如下图所示,只需要将对应的点点亮,而这些对应的点可以拼成一个汉字的模样。 

    在这里插入图片描述

      再具体一点就是,单片机将想要显示的点的数据通过spi或者iic传给屏幕驱动芯片,屏幕驱动得到命令后就会将对应的点点亮,具体怎么点后面介绍。 

    字体模型

      看到这里可能会有疑问,我不可能每个汉字都去照着样子去点亮led吧?那多费劲!
      确实费劲,不过有简单的方法。1.取模 2.用字库(本质还是取模)

    1.取模

      什么是取模?就上上图看到的一样,将汉字对应的点转换成单片机能识别的二进制数去点亮led,从而显示到屏幕上。只不过这一步可以用软件自动生成,不需要你自己比对这汉字去一个一个点点儿了。下面是三个字取模之后得到的数组,我们只需要将汉字输入到软件中,点击生成字模就行了,是不是很简单。
    (0) (1) (2)
    
    {0x01,0x80,0x31,0x8C,0x31,0x8C,0x3F,0xFC,0x00,0x30,0x33,0x30,0x33,0x3F,0xFF,0xE3},
    {0x33,0xDE,0x33,0x18,0x3F,0x18,0x33,0x18,0x33,0x3C,0x3F,0x3C,0x33,0x66,0x00,0xC3},/*"嵌",0*/
    
    {0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0},
    {0x06,0x60,0x06,0x60,0x0C,0x30,0x0C,0x30,0x18,0x18,0x30,0x18,0x60,0x0C,0xC0,0x07},/*"入",1*/
    
    {0x00,0x6C,0x00,0x66,0x00,0x66,0x00,0x60,0xFF,0xFF,0x00,0x60,0x00,0x60,0x3F,0x60},
    {0x0C,0x60,0x0C,0x60,0x0C,0x30,0x0C,0x33,0x0F,0x9B,0x7C,0x0F,0x30,0x07,0x00,0x03},/*"式",2*/
    

    2.字库

      字库其实是个芯片,比如GT21L16S2Y、GT30L32S4W等,它是将取好的字模按照一定标准存放在内存当中,本质还是取模。这个标准遵循GB2312,是个国标。还有别的标准,比如UTF-8、GBK等等。
    code  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
    B3A0     场 尝 常 长 偿 肠 厂 敞 畅 唱 倡 超 抄 钞 朝
    B3B0  嘲 潮 巢 吵 炒 车 扯 撤 掣 彻 澈 郴 臣 辰 尘 晨
    B3C0  忱 沉 陈 趁 衬 撑 称 城 橙 成 呈 乘 程 惩 澄 诚
    B3D0  承 逞 骋 秤 吃 痴 持 匙 池 迟 弛 驰 耻 齿 侈 尺
    B3E0  赤 翅 斥 炽 充 冲 虫 崇 宠 抽 酬 畴 踌 稠 愁 筹
    B3F0  仇 绸 瞅 丑 臭 初 出 橱 厨 躇 锄 雏 滁 除 楚 
    

    比如上面这个表,这是一个遵循GB2312国标的字符排列表。举个栗子,B3A1是16进制数,这个就代表“场”字、什么意思呢?看看下面的代码。

    //主函数打印一个“场”字
    LcdPutString(30,30,"场",FontType24,NORMAL);
    
    //LcdPutString函数中解析输入的汉字“场”,汉字是占用两个字节
    tempint = (((unsigned int)*str)<<8) + (unsigned int)*(str+1);
    

    我在主函数显示一个汉字“场”, LcdPutString 函数中的*str是个形参,指向“场”在单片机中的位置。将指针分解成十进制,并赋值给tempint。也就是说,tempint 的值就是“场”在单片机中仿真的值、下面试仿真结果。

    在这里插入图片描述

    45985转换成十六进制就是B3A1

    在这里插入图片描述

      通过这个实验,我们可以知道,汉字在计算机中是怎么存储的。本质还是0和1,因为计算机只能识别0和1。另外一点就是每个字符在计算机中都有唯一一个二进制与其对应。

    显示函数的实现

    取完模之后怎么显示呢?以我最近用的一个例子进行讲解。
      
    硬件基础:S08DZ60驱动1.27寸屏幕(驱动SSD1351),汉字模用的字库(GT30L32S4W),基础SPI通信不在讲解,只说下应用函数。代码中有详细注释。

    1.首先实现点亮一个点

    void Draw_Point(unsigned char x, unsigned char y, int Colour_RGB)
    {
      Write_Command(0x15);  // 设置列地址
      Write_Data(x);    
    
      Write_Command(0x75);  // 设置行地址
      Write_Data(y);    
    
      Set_Write_RAM();  //使能MCU写RAM
    
      Write_Data(Colour_RGB >> 8); //写入填充颜色高字节
      Write_Data(Colour_RGB);  //写入填充颜色低字节
    }
    

    2.以汉字12 * 12,字符6 * 12为例写的驱动函数

    void PutDotBytes12(unsigned char x,unsigned char y,unsigned char *DataPtr,unsigned char mode) 
    {
      unsigned char i, j; //定义变量
        unsigned char Var_Temp, x_Temp; //定义变量
    
        x_Temp = x; //获取x起始坐标
        if(IsAsciiType) //字符
        {
            for(i = 0; i < 9; i++) //6*12 = 9*8;一次只能写入一字节,也就是8位,所以采用8*32的画法
            {            
                Var_Temp = DataPtr[i]; //获取汉字在数组的偏移量
                for(j = 0; j < 8; j++)
                {
                    if(Var_Temp & 0x80)   //先画最高位的点,为1则画对应的颜色
                    Draw_Point(x, y, 0x55);
                    //else
                    //Draw_Point(x, y, 0x0000); //为0则黑色(都不亮),可作为背景色
                    Var_Temp <<= 1; //移位,准备画下一个点
                    x++;  //x坐标加1
    
                    if((x - x_Temp) == 6)  //画完一列
                    {
                        x = x_Temp; //x坐标回到起始位置
                        y++;  //y坐标加1
                        break;  //退出当前循环
                    }
                }
            }
        }
        else
        {
            for(i = 0; i < 24; i++) //12*12 = 32*8;一次只能写入一字节,也就是8位,所以采用8*32的画法
            {            
                Var_Temp = DataPtr[i]; //获取汉字在数组的偏移量
                for(j = 0; j < 8; j++)
                {
                    if(Var_Temp & 0x80)   //先画最高位的点,为1则画对应的颜色
                    Draw_Point(x, y, 0x55);
                    //else
                    //Draw_Point(x, y, 0x0000); //为0则黑色(都不亮),可作为背景色
                    Var_Temp <<= 1; //移位,准备画下一个点
                    x++;  //x坐标加1
    
                    if((x - x_Temp) == 12)  //画完一列
                    {
                        x = x_Temp; //x坐标回到起始位置
                        y++;  //y坐标加1
                        break;  //退出当前循环
                    }
                }
            }
        }
        
    }
    
    

    3.显示函数(集成到一个函数中)

    void LcdPutString(unsigned char x,unsigned char y,const char *str,unsigned char type,unsigned char mode)
    {
        unsigned char *dotptr;
        unsigned int  tempint;
    
        while (*str != 0) //判断字符是否为0,不为0,则进入循环中
        {
            if ((unsigned char)*str < 0x80)     //根据输入数据的大小判断是字符还是汉字,
            {
                IsAsciiType = 1;    //字符
                tempint = (unsigned int)*str;
            }
            else
            {
                IsAsciiType = 0;    //汉字
                tempint = (((unsigned int)*str)<<8) + (unsigned int)*(str+1);
            }
            dotptr = (unsigned char *)GetDotAddr(tempint, type); //查找当前字符的点阵字模位置
            //PutDotBytes(x+LCD_X_SHR, y, dotptr, mode);    //将字模输出至显示设备 //OLED - CT2412864右移2点阵
             switch(type)
            {
              case   FontType08:
                 PutDotBytes08(x+LCD_X_SHR, y, dotptr, mode);    //将字模输出至显示设备 //OLED - CT2412864右移2点阵
                 break;
              case   FontType12:
                 PutDotBytes12(x+LCD_X_SHR, y, dotptr, mode);
                 break;    //将字模输出至显示设备 //OLED - CT2412864右移2点阵 
              case   FontType16:
                 PutDotBytes16(x+LCD_X_SHR, y, dotptr, mode);    //将字模输出至显示设备 //OLED - CT2412864右移2点阵
                 break;
              case   FontType24:
                 PutDotBytes24(x+LCD_X_SHR, y, dotptr, mode);    //将字模输出至显示设备 //OLED - CT2412864右移2点阵
                 break;
            }
            
            if (1 == IsAsciiType)               //调整指针至下一个将要显示的字符
            {
                str += 1;
            }
            else
            {
                str += 2;
            }
    
            x += (Xsize+8);                         //调整显示横坐标
    
            if ((unsigned char)*str < 0x80)
            {
                Xsize = Xsize/2;
            }
            if ((x + Xsize) > Max_Column)
            {
                x = 0;
                if ((y + Ysize) > Max_Row)
                {
                    break;
                }
                else
                {
                    y += Ysize;                 //调整显示纵坐标
                }
            }
            
        }//End of while
    }
    
    

    如果用取模软件取模,直接修改for循环中的数组 DataPtr[i] 为取模定义的数组即可。

    总结

      这节主要讲了屏幕的驱动函数怎么写的,还有一篇讲解的IIC协议的,以及还有一节51822驱动0.96寸屏幕的,把这三章结合起来理解就能吃透屏幕啦,其他屏幕基本上都是一样的套路。

      因为最近一直在搞屏幕驱动,以前都是调用库函数,或者别人写好的驱动函数,这次开发一款新产品,索性直接把底层也搞了一下,并总结下来,希望能帮到你。

    展开全文
  • 汇编语言--在屏幕上显示名字

    千次阅读 2019-09-20 18:58:19
    屏幕上显示名字 stack segment a db 10 dup(?) stack ends data segment string db 'lihaifeng',0dh,0ah, '$' dw 'ab' db 'ab' data ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data ...

    在屏幕上显示名字

    方法一

    stack segment
    a db 10 dup(?)
    stack ends
    
    data segment
    string db 'lihaifeng',0dh,0ah, '$'
    dw 'ab'
    db 'ab'
    data ends
    
    code segment
    assume cs:code,ds:data,ss:stack 
    start:
    mov ax,data
    mov ds,ax
    mov dx,offset string 
    mov ah,9
    int 21h
    mov ax,4c00h
    int 21h
    
    code ends
    end start
    

    结果
    在这里插入图片描述

    方法二

    stack segment
    db 10 dup(?)
    stack ends
    
    data segment
    data ends
    
    code segment
    assume cs:code,ds:data,ss:stack
    start:
    mov dl,6ch
    mov ah,02h
    int 21h
    
    mov dl,69h
    mov ah,02h
    int 21h
    
    mov dl,68h
    mov ah,02h
    int 21h
    
    mov dl,61h
    mov ah,02h
    int 21h
    mov dl,69h
    mov ah,02h
    int 21h
    
    
    
    mov dl,66h
    mov ah,02h
    int 21h
    
    mov dl,65h
    mov ah,02h
    int 21h
    
    mov dl,6eh
    mov ah,02h
    int 21h
    
    mov dl,67h
    mov ah,02h
    int 21h
    mov ax,4c00h
    int 21h
    code ends
    end start
    

    效果
    在这里插入图片描述

    更多

    获取更多资料、代码,微信公众号:海轰Pro
    回复 海轰 即可

    展开全文
  • 屏幕上显示文字 程序vc编程 开发技术C++ 代码
  • 显示键盘按键到屏幕上的小工具,可以设置很多颜色,字体大小,多屏支持
  • import os import time def main(): str = '大哥大哥欢迎你,欢迎你来我这里 ' while True: print(str) time.sleep(0.2) str = str[1:] + str[0:1] # for Windows use os.system('...
    import os
    import time
    
    
    def main():
        str = '大哥大哥欢迎你,欢迎你来我这里      '
        while True:
            print(str)
            time.sleep(0.2)
            str = str[1:] + str[0:1]
            # for Windows use os.system('cls') instead
            os.system('clear')
    
    
    if __name__ == '__main__':
        main()

    效果图

    展开全文
  • echo屏幕显示一段文字

    千次阅读 2019-03-24 17:05:59
    3.10 echo屏幕显示一段文字 3.10.1语法 echo [-neE] [arg …] 可以使用echo查看某个系统变量的值: 例如: 【echo ${PATH}】 查看当前shell 【echo ${SHELL}】 3.10.2 常用参数 【-n】表示不换行输出(echo默认...
  • UE4 屏幕上显示文字

    千次阅读 2018-11-02 14:57:40
    // Fill out your copyright notice in the Description page of ... #pragma once #include "CoreMinimal.h" #include "GameFramework/HUD.h" #include "MyHUD.generated.h"...UCLASS(...
  • 屏幕上显示字符的原理

    千次阅读 2018-10-11 14:52:00
    屏幕上显示字符的原理 只描述在IA-32e模式下的字符显示 首先要有一个字符库(包含这每一个字符的像素信息, 空白的地方时0x00, 一个字符一个8x16的矩阵) 每一个像素点就是一个int类型4bytes大小的...
  • STM32驱动OLED屏幕显示汉字

    千次阅读 多人点赞 2019-08-10 19:06:09
    4.在OLED屏幕上显示文字 1.GPIO模拟I2C(用C语言描述时序图) 首先认识一下I2C通信协议组成,主要由下面几部分组成。 1)开始与停止 总线在空闲状态时,SCL和SDA都保持着高电平。 启动信号:当SCL为高电...
  • led点阵屏幕移动显示程序,是c语言编程的,只要修改一下编码就可以显示不同的汉字
  • Linux如何在屏幕上显示ASCII/中文字符

    千次阅读 多人点赞 2019-05-18 05:28:03
    如何在屏幕上显示一个字符? 很简单,调用 printf , 执行 echo … 然而,我们知道 任何显示的操作,最终都是在显示器描像素 来完成的。换句话说,任何图案,包括GUI,文字字符等,全部是 画出来的! 把图案画出来...
  • python 在屏幕上逐字显示 一行

    千次阅读 2018-02-27 23:52:57
    #-*- coding: utf-8 -*-#code:myhaspl@qq.com#12-1.pyimport sysreload(sys)sys.setdefaultencoding("gbk")import sys,timedef print_one_by_one(text): sys.stdout.write("\r "...
  • Arduino利用温湿度传感器在OELD屏幕上显示 DHT11温湿度传感器 安装第三方库SimpleDHT,一般DHT库都提供了dht11,dht21等库函数。安装完成后我们通过串口来测试一下温湿度传感器。下面是示例代码: #include <...
  • 以上两句是打印到屏幕上的特定用法 loop t;判断的一句就是cx-1如果不为零就执行跳转指令如果为零就不执行跳转指令 mov ah ,4ch int 21h;以上两句是返回dos界面的特定写法 code ends end start ...
  • 例5.1 试编制一个程序把BX寄存器中的二进制数用十六进制数的形式在屏幕上显示出来。 思路 想要将BX中的值一位一位的显示,我们首先想到利用循环移位,然后取出每一位的数并转化为字符串进行显示。 要如何移位呢?...
  • 桌面悬浮置顶文字显示,可以自定义显示位置和颜色字体大小等,就像屏幕上贴了一层膜,置顶显示,可以穿透鼠标,不影响鼠标点击。含源码
  • 屏幕显示技术

    千次阅读 2019-11-27 14:01:58
    LCD LCD(Liquid Crystal Display...指液晶显示器的每一液晶象素点都是由集成在其后的薄膜晶体管来驱动,从而可以做到高速度高亮度高对比度显示屏幕信息。 优点:亮度好、对比度高、层次感强、颜色鲜艳 缺点:比...
  • 利用DOS系统功能调用编写汇编程序,在屏幕上显示自己学号的后4个数字符号。例如,你的学号如果是20191234,则在屏幕上显示出‘1234’。具体要求如下: (1)编写出完整的汇编语言程序; (2)利用宏汇编程序MASM...
  • C# winfrom 投屏显示窗体,可以显示在指定的屏幕,有多个屏幕都可以显示 核心代码: public void FormStartScreen(int screen, Form form) { if (Screen.AllScreens.Length < screen) { ...
  • 屏幕上显示字符我之前就在做好了,之前只是可以显示。这两天把显示部分做了些修改。 修改如下 1.加了换行 2.字体大小大小的适应,如果以后换了字体简单修改后就可以用了 3.显示内容过多时自动换行 4.字距 行距的...
  • 上机代码:   code segment  assume cs:code start:  mov bx,1234H  sub ax,ax  mov ch,4 rotate:  mov cl,4  rol bx,cl  mov al,bl  and al,0fH  add al...
  • 显示上显示的数字的方法

    千次阅读 2016-11-30 23:00:16
    在现实屏上显示的数字的时候经常需要对数据进行分解,得到数据 的每一位再依次显示,方法有很多种,下面介绍经常用到的3种方法 第一种方法:不断的利用取整运算与取余运算得到每一位void displaynum1(int Num) { ...
  • 一、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间 (1)输入年,输出该年的日历。 (2)输入年月,输出该月的日历。 (3)输入年月日,输出距今天还有多少天,星期几,是否是...
  • 代码: code segment assume cs:code start: mov bx,1234H sub ax,ax mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fH add al,30H cmp al,3aH jl print add al,7H ... mov a
  • 在其他应用全屏的情况下,仍然显示。比如玩游戏的时候显示的帧数,等等。怎么才能让不被其他应用盖住。
  • 在键盘输入两个一位数,在屏幕上显示它们的积。stack segment db 200 dup(0)stack endscode segment assume cs:code,ss:stackbegin: mov ah,1 int 21h ;从键盘输入第一个数字al mov bl,al mov ...
  • 80x86 汇编代码,在屏幕上显示汉字

    千次阅读 2016-01-25 12:08:35
    汇编中如何使用字模点阵数据在屏幕上打出汉字显示“潘嘉铖”3个就行!!!!!好的再+100题目链接:...
  • 屏幕显示

    千次阅读 2020-02-11 16:43:52
    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display,OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 419,528
精华内容 167,811
关键字:

屏幕上的字是怎么显示出来的