打印

关于超级终端的那些事

[复制链接]
4002|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2013-8-28 23:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到周立功GD32的作品,深受启发。所以就搜集了一些超级终端的东西。
沙发
gaochy1126|  楼主 | 2013-8-28 23:17 | 只看该作者
单片机在超级终端上显示彩色字符画汇编程序例子

使用特权

评论回复
板凳
gaochy1126|  楼主 | 2013-8-28 23:18 | 只看该作者


;在电脑附件里面的超级终端界面上以彩色显示一幅字符画,并且有一个旋转光标动态显示
;注意程序后面的超级终端转义字符的定义说明
;11.0592M晶振,串口比特率57600


ORG 0000H
SJMP MAIN


ORG 0030H
MAIN:
MOV SP,#40H
MOV TMOD,#20h   ;T1为常数自动重装入的8位定时计数器,既波特率发生器,T0为16位的定时计数器
MOV PCON,#80h   ;SMOD=1
MOV TH1,#0FFH   ;初始化波特率,11.0592下,且SMOD=1加倍情况下,0FFH=57600,0FDH=19200 ,0FAH=9600
MOV SCON,#50h   ;Standard UART settings
SETB TR1 ;T1开始工作
SETB EA  ;开全部中断


ACALL SEND


LOOP:
ACALL XZGB
SJMP LOOP




XZGB:;旋转光标显示
ACALL TG  ;发送退格
MOV A,#5CH  ;把"\"送入A
ACALL SENDA  ;把A发送出去
ACALL YS  ;延时


ACALL TG
MOV A,#7CH  ;把"|"送入A
ACALL SENDA
ACALL YS


ACALL TG
MOV A,#2FH  ;把"/"送入A
ACALL SENDA
ACALL YS


ACALL TG
MOV A,#2DH   ;把"-"送入A
ACALL SENDA
ACALL YS


RET


TG:      ;发送退格命令
MOV A,#08H
ACALL SENDA
RET


SENDA:     ;把A发送到串口出去
MOV SBUF,A
JNB TI,$
CLR TI
RET



YS: ;通用延时子程序
MOV 02H,#35   ;较合适的旋转速度
YS1:  PUSH    02H
YS2:  PUSH    02H
YS3:  PUSH    02H
DJNZ    R2,$
POP     02H
DJNZ    R2,YS3
POP     02H
DJNZ    R2,YS2
POP     02H
DJNZ    R2,YS1
RET



SEND:;发送字符画
MOV A,#0CH    ;发送清屏命令
MOV SBUF,A
JNB TI,$
CLR TI
   
MOV DPTR,#ST2 ;暂存字符画结束位置
MOV R0,DPL
MOV R1,DPH
MOV DPTR,#ST1 ;字符画开始位置
SEND1:
CLR A
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
INC DPL
MOV A,DPL
CJNE A,#00H,SEND2
INC DPH
SEND2:
MOV A,DPH
CJNE A,01H,SEND1   ;判断是否到了字符画末尾了
MOV A,DPL
CJNE A,00H,SEND1


RET


ST1:
DB 1BH,"[1;33;46m"   ;这句就是转义字符定义,1BH代表“ESC”转义字符开始,1代表高亮显示,33代表黄色前景,46代表青蓝色背景
;    前景            背景              颜色
;    ---------------------------------------
;    30                40              黑色
;    31                41              紅色
;    32                42              綠色
;    33                43              黃色
;    34                44              藍色
;    35                45              紫紅色
;    36                46              青藍色
;    37                47              白色
;    代码              意义
;    -------------------------
;    0                终端默认设置(一般的默认为黑底白字)
;    1                高亮显示
;    4                使用下划线
;    5                闪烁
;    7                反白显示
;    8                不可见


;字符画,注意每句末尾要加两个控制字符
DB "   ***      ***      *****     ******    ****  ",0AH,0DH   
DB "  *   *    *   *    *     *    *        *   *  ",0AH,0DH      
DB " *     *  *     *  *       *   *       *     * ",0AH,0DH      
DB " *     *  *     *  *          *              * ",0AH,0DH      
DB "  *   *   *     *   *         *****          * ",0AH,0DH      
DB "   ***    *     *    ***      *    *        *  ",0AH,0DH      
DB "  *   *    *   **       ***         *       *  ",0AH,0DH      
DB " *     *    *** *          *        *      *   ",0AH,0DH      
DB " *     *        *          *        *     *    ",0AH,0DH      
DB " *     *  *     *  *       *  *     *    *     ",0AH,0DH      
DB "  *   *    *   *    *     *    *   *    *      ",0AH,0DH      
DB "   ***      ***      *****      ***    ******* ",0AH,0DH      
ST2:;字符画末尾
END


使用特权

评论回复
地板
gaochy1126|  楼主 | 2013-8-28 23:19 | 只看该作者
转]超级终端设置字体和背景颜色

使用特权

评论回复
5
gaochy1126|  楼主 | 2013-8-28 23:19 | 只看该作者
在 ANSI 兼容终端(例如 xterm、rxvt、konsole 等)里, 可以用彩色显示文本而不仅仅是黑白。

下面的语句就输出高亮的黑色背景的绿色字。
printf("\033[1;40;32m%s\033[0m", Hello,world!\n);
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。后面的 1 定义了高亮显示字符。然后是背景颜色,这里面是40,表示黑色背景。接着是前景颜色,这里面是32,表示绿色。我们用 \033[0m 关闭转义序列, \033[0m 是终端默认颜色。
通过上面的介绍,就知道了如何输出彩色字符了。

下面是对于彩色字符颜色的一些定义:
前景          背景              颜色
---------------------------------------
30             40              黑色
31             41              紅色
32             42              綠色
33             43              黃色
34             44              藍色
35             45              紫紅色
36             46              青藍色
37             47              白色

    代码              意义
-------------------------
0             终端默认设置
1             高亮显示
4             使用下划线
5             闪烁
7             反白显示
8             不可见
通过串口收发或显示字符时,我们使用的通常是字符的ASCII码。对于非控制字符,也即键入命令时我们可能使用到的命令字符,在控制台中我们使用了ASCII码值从0x20~0x7e之间的字符。对于控制字符,在常用字符ASCII码对照表中我们可以找到Enter键、Backspace(退格)键以及ESC键的ASCII码,但是却没有上下左右方向键以及Home、End键对应的ASCII码,通过对键盘输入字符的串口收发测试发现,如果在测试时按下了方向键则串口在每次按键后会连续发送出3字节数据,前两字节所有方向键的数据相同,分别是0x1b,0x5b,第3字节对应不同的按键,上下右左方向键分别对应的值为:0x41、0x42、0x43、0x44,Home和End键对应的值为0x48和0x4b。故要检测键盘是否键入了方向键,需要向串口连续读取三字节的数据,同理,要控制光标向左、向右移动或Home、End也需要连续一次向串口发送3字节数据。

使用特权

评论回复
6
gaochy1126|  楼主 | 2013-8-28 23:19 | 只看该作者
send_char_com(0x1B);    单字节发
send_string_com("[34m");  
在 ANSI 兼容终端(例如 xterm、rxvt、konsole 等)里, 可以用彩色显示文本而不仅仅是黑白。但是我们自己编写的程序能否输出彩色的字符呢?当然答案是肯定的。下面的语句就输出高亮的黑色背景的绿色字。
printf("\033[1;40;32m%s\033[0m",” Hello,NSFocus\n”);
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。后面的 1 定义了高亮显示字符。然后是背景颜色,这里面是40,表示黑色背景。接着是前景颜色,这里面是32,表示绿色。我们用 \033[0m 关闭转义序列, \033[0m 是终端默认颜色。
    通过上面的介绍,就知道了如何输出彩色字符了。因此,我就不再多说了。下面是对于彩色字符颜色的一些定义:
    前景            背景              颜色
    ---------------------------------------
    30                40              黑色
    31                41              紅色
    32                42              綠色
    33                43              黃色
    34                44              藍色
    35                45              紫紅色
    36                46              青藍色
    37                47              白色

    代码              意义
    -------------------------
    0                终端默认设置
    1                高亮显示
    4                使用下划线
    5                闪烁
    7                反白显示
    8                不可见

下面给出了一个C语言的示例:

///////////////////////////////////////////////////////////////////////////////
//filename:tracelog.c
#include <stdio.h>

int main(int argc,char **argv)
{
    unsigned char attr[]={0,1,4,5,7,8};
    unsigned char fore[]={30,31,32,33,34,35,36,37};
    unsigned char back[]={40,41,42,43,44,45,46,47};
    int adx,fdx,bdx;

    for(bdx=0;bdx<sizeof(back);bdx++)
    {
        for(fdx=0;fdx<sizeof(fore);fdx++)
        {
            for(adx=0;adx<sizeof(attr);adx++)
            {
                printf("\033[%d;%d;%dmhello,NSFocus!!!\033[0m",
                    attr[adx],fore[fdx],back[bdx]);
                printf("<==attr=%d,fore=%d,back=%d\n",
                    attr[adx],fore[fdx],back[bdx]);
            }
        }
        printf("\n");
    }
}

使用特权

评论回复
7
gaochy1126|  楼主 | 2013-8-28 23:20 | 只看该作者
黑色  红色  绿色 棕色 蓝色 紫色
       浅蓝色 灰色
       请在回复的时候把上面的颜色字代码复制到写字板上!
     第一篇:如何让自己的昵称动起来,字变大?
     进入[资料配置],在[修改昵称]中,在你的昵称前加上  
     <marquee><h1>, <marquee>是让昵称动起来,<h1>、<h2>、  
     <h3>、<h4>、<h5>、<h6>是让字大起来。   
     第二篇:如何做彩色签名?
     它是采用几个字符串来作为颜色控制符的,只要在你想要改变颜  
     色的字符前加上一串颜色控制符,你就可以得到一段彩色文  
     字了。网易共提供了9个颜色控制字符串,你最多可以在网  
     易签名档里设置8种颜色,它们分别是:
     [30m 黑色 [31m 红色 [32m 绿色 [33m 棕色   
     [34m 蓝色 [35m 紫色 [36m 浅蓝色 [37m 灰色   
     [38m 灰色      
     如果你想让“我是一名新手,请各位大侠多多指教”这名话  
     变成红色的话,你只要在这句话的前面加上“■[31m”这个  
     字符串就行了,也就是说,只要你在网易签名档中加入  
     “■[31m我是一名新手,请各位大侠多多指教”这段话,   
     在发贴子时指定用这个签名档,别人就可在你的贴子下面看  
     到一句红色的“我是一名新手,请各位大侠多多指教” 的  
     签名了。就这么简单!不过你不要高兴得太早了,你一定  
     看到那个黑色的方块块了,那是个什么字符,又是怎么得   
     来的呢?请看下文。   
     这个字符其实就是ESC键的ASCII码,在一般情况下显示  
     为空格,而不是上面的黑色方块块,但千万要注意不是按空  
     格键得来的空格!它在一般的文字处理工具中是无法通过键  
     盘输入得到的!呵呵!你没被吓着吧?得到它是有点困难,  
     不过不要急,还是有办法的。既然它无法在一般文字处理工  
     具中通过键盘输入得到,那么我们只有动用DEBUG或PCTOOL  
     工具了。你可以先用记事本(NotePad)建立一个含有一个  
     空格(16进制代码为0x20)的文本文件(如“ [34m”),  
     再用上面提到的两个工具把这个文件中的空格字符改为  
     ESC键字符(即"0x20"改为“0x1B”),再保存文件,这样  
     你的这个文本文件中那个普通空格就变为ESC键这个特殊空  
     格了。打开你的签名,将此文本文件中的“  [34m”复制,  
     粘贴在你想变色的文字前即可,在你的签名中不同位置粘  
     贴不同的内容(如:“ [33m"),你将会得到五颜六色的  
     签名。  
         为什么要用这个特殊的字符来控制颜色呢?这是因为  
     早期的终端仿真程序就是用0x1B(ESC字符)这个字符作为  
     “换码序列”,ESC字符后面的数字通常用于控制终端光  
     标的位置或者字符的颜色。  

使用特权

评论回复
8
gaochy1126|  楼主 | 2013-8-28 23:20 | 只看该作者
9
gaochy1126|  楼主 | 2013-8-28 23:21 | 只看该作者
下面的语句就输出高亮的黑色背景的绿色字。
printf("\033[1;40;32m%s\033[0m",” Hello,world!\n”);
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。后面的 1 定义了高亮显示字符。然后是背景颜色,这里面是40,表示黑色背景。接着是前景颜色,这里面是32,表示绿色。我们用 \033[0m 关闭转义序列, \033[0m 是终端默认颜色。
    通过上面的介绍,就知道了如何输出彩色字符了。

下面是对于彩色字符颜色的一些定义:
    前景            背景              颜色
    ---------------------------------------
    30                40              黑色
    31                41              紅色
    32                42              綠色
    33                43              黃色
    34                44              藍色
    35                45              紫紅色
    36                46              青藍色
    37                47              白色

    代码              意义
    -------------------------
    0                终端默认设置
    1                高亮显示
    4                使用下划线
    5                闪烁
    7                反白显示
    8                不可见

使用特权

评论回复
10
gaochy1126|  楼主 | 2013-8-28 23:22 | 只看该作者
ASC II码表和转义字符
================================
    我们输入的显示字符都是ASC II的标准,了解这个有必要。对于一些特殊的指令,ASC II则用转义字
符更为方便。
------------
Decimal   Octal   Hex    Binary     Value
          10       08     16      02   
        -------    -----      *---       ------            -----
         000      000    000   00000000      NUL    (Null char.)
         001      001    001   00000001      SOH    (Start of Header)发送文件首
         002      002    002   00000010      STX    (Start of Text)文本开始
         003      003    003   00000011      ETX    (End of Text)文本尾
         004      004    004   00000100      EOT    (End of Transmission)发送结束
         005      005    005   00000101      ENQ    (Enquiry)
         006      006    006   00000110      ACK    (Acknowledgment)确认
         007      007    007   00000111      BEL    (Bell)蜂鸣
         008      010    008   00001000       BS    (Backspace)退格
         009      011    009   00001001       HT    (Horizontal Tab)
         010      012    00A   00001010       LF    (Line Feed)换行
         011      013    00B   00001011       VT    (Vertical Tab)
         012      014    00C   00001100       FF    (Form Feed)换页/清屏
         013      015    00D   00001101       CR    (Carriage Return)回车
         014      016    00E   00001110       SO    (Shift Out)SHIFT 松开
         015      017    00F   00001111       SI    (Shift In)按下
         016      020    010   00010000      DLE    (Data Link Escape)清除
         017      021    011   00010001      DC1 (XON) (Device Control 1)
         018      022    012   00010010      DC2       (Device Control 2)
         019      023    013   00010011      DC3 (XOFF)(Device Control 3)
         020      024    014   00010100      DC4       (Device Control 4)
         021      025    015   00010101      NAK    (Negative Acknowledgement)
         022      026    016   00010110      SYN    (Synchronous Idle)
         023      027    017   00010111      ETB    (End of Trans. Block)
         024      030    018   00011000      CAN    (Cancel)
         025      031    019   00011001       EM    (End of Medium)
         026      032    01A   00011010      SUB    (Substitute)
         027      033    01B   00011011      ESC    (Escape)退出
         028      034    01C   00011100       FS    (File Separator)
         029      035    01D   00011101       GS    (Group Separator)
         030      036    01E   00011110       RS    (Request to Send/Record Separator)
         031      037    01F   00011111       US    (Unit Separator)
         032      040    020   00100000       SP    (Space)空格
         033      041    021   00100001        !    (exclamation mark)
         034      042    022   00100010        "    (double quote)
         035      043    023   00100011        #    (number sign)
         036      044    024   00100100        $    (dollar sign)
         037      045    025   00100101        %    (percent)
         038      046    026   00100110        &    (ampersand)
         039      047    027   00100111        '    (single quote)
         040      050    028   00101000        (    (left/opening parenthesis)
         041      051    029   00101001        )    (right/closing parenthesis)
         042      052    02A   00101010        *    (asterisk)
         043      053    02B   00101011        +    (plus)
         044      054    02C   00101100        ,    (comma)
         045      055    02D   00101101        -    (minus or dash)
         046      056    02E   00101110        .    (dot)
         047      057    02F   00101111        /    (forward slash)
         048      060    030   00110000        0
         049      061    031   00110001        1
         050      062    032   00110010        2
         051      063    033   00110011        3
         052      064    034   00110100        4
         053      065    035   00110101        5
         054      066    036   00110110        6
         055      067    037   00110111        7
         056      070    038   00111000        8
         057      071    039   00111001        9
         058      072    03A   00111010        :    (colon)
         059      073    03B   00111011        ;    (semi-colon)
         060      074    03C   00111100        <    (less than)
         061      075    03D   00111101        =    (equal sign)
         062      076    03E   00111110        >    (greater than)
         063      077    03F   00111111        ?    (question mark)
         064      100    040   01000000        @    (AT symbol)
         065      101    041   01000001        A
         066      102    042   01000010        B
         067      103    043   01000011        C
         068      104    044   01000100        D
         069      105    045   01000101        E
         070      106    046   01000110        F
         071      107    047   01000111        G
         072      110    048   01001000        H
         073      111    049   01001001        I
         074      112    04A   01001010        J
         075      113    04B   01001011        K
         076      114    04C   01001100        L
         077      115    04D   01001101        M
         078      116    04E   01001110        N
         079      117    04F   01001111        O
         080      120    050   01010000        P
         081      121    051   01010001        Q
         082      122    052   01010010        R
         083      123    053   01010011        S
         084      124    054   01010100        T
         085      125    055   01010101        U
         086      126    056   01010110        V
         087      127    057   01010111        W
         088      130    058   01011000        X
         089      131    059   01011001        Y
         090      132    05A   01011010        Z
         091      133    05B   01011011        [    (left/opening bracket)
         092      134    05C   01011100        \    (back slash)
         093      135    05D   01011101        ]    (right/closing bracket)
         094      136    05E   01011110        ^    (caret/cirumflex)
         095      137    05F   01011111        _    (underscore)
         096      140    060   01100000        `
         097      141    061   01100001        a
         098      142    062   01100010        b
         099      143    063   01100011        c
         100      144    064   01100100        d
         101      145    065   01100101        e
         102      146    066   01100110        f
         103      147    067   01100111        g
         104      150    068   01101000        h
         105      151    069   01101001        i
         106      152    06A   01101010        j
         107      153    06B   01101011        k
         108      154    06C   01101100        l
         109      155    06D   01101101        m
         110      156    06E   01101110        n
         111      157    06F   01101111        o
         112      160    070   01110000        p
         113      161    071   01110001        q
         114      162    072   01110010        r
         115      163    073   01110011        s
         116      164    074   01110100        t
         117      165    075   01110101        u
         118      166    076   01110110        v
         119      167    077   01110111        w
         120      170    078   01111000        x
         121      171    079   01111001        y
         122      172    07A   01111010        z
         123      173    07B   01111011        {    (left/opening brace)
         124      174    07C   01111100        |    (vertical bar)
         125      175    07D   01111101        }    (right/closing brace)
         126      176    07E   01111110        ~    (tilde)
         127      177    07F   01111111      DEL    (delete)
前32个控制字符的详细解释:
NUL (null)
SOH (start of heading)
STX (start of text)
ETX (end of text)
EOT (end of transmission) - Not the same as
ETBENQ (enquiry)ACK (acknowledge)
BEL (bell) - Caused teletype machines to ring a bell.
Causes a beep in many common terminals and terminal emulation programs.
BS (backspace) - Moves the cursor (or print head) move backwards (left)                  
one space.
TAB (horizontal tab) - Moves the cursor (or print head) right to the next tab stop.
The spacing of tab stops is dependent on the output device, but is often either 8 or 10.
LF (NL line feed, new line) - Moves the cursor (or print head) to a new line. On Unix
systems, moves to a new line AND all the way to the left.
VT (vertical tab)
FF (form feed) - Advances paper to the top of the next page (if the output device is a
printer).
CR (carriage return) - Moves the cursor all the way to the left, but does not advance to
the next line.
SO (shift out) - Switches output device to alternate character set.
SI (shift in) - Switches output device back to default character set.DLE (data link
escape)
DC1 (device control 1)
DC2 (device control 2)
DC3 (device control 3)
DC4 (device control 4)
NAK (negative acknowledge)
SYN (synchronous idle)
ETB (end of transmission block) - Not the same as
EOTCAN (cancel)EM (end of medium)
SUB (substitute)ESC (escape)
FS (file separator)
GS (group separator)
RS (record separator)
US (unit separator)         
--------
常用的转义字符
在windows自带的超级终端中,如何清屏?
--通过发送0x0C(12)即可实现清屏。
--在“输入字符串”内容中输入 /x0c
\0 :字符串结束标志;
--- 在上面的程序里找到 while(*str != '\0') ,您就会知道 \0 的功能了。它可以表示字符串的结束
,您可以不用担心指针会溢出。
\n :换行(asc II码为10);
--- 一般和 \r 配合使用以代表回车。因为 \n 只是表示换行而并不让光标回到行首, \r 是实现了回行
首的功能。
           
\t :横向跳格;                              
\b :退格;
\r :回车(ascⅱ码为13);
--- 说过了。
\f :走纸换页;
\\ :字符\(ascⅱ码为92);
--- \ 是转义字符的表示符,当只想打一个 \ 时就可以打两个。
           
\' :单引号;
--- ' 在C里有特殊用法,所以这个表示只打印这个符号。
                                   
'\"':双引号;
---同上
\d05:用8进制表示字符;
\x1c:用16进制表示字符
--- 有一些功能没有转义字符,我们就可以用这个指令直接表示指令。\x1c 相当于发送 0x1c 对应的ASC
码功能。

6. 关于颜色
================================
在 ANSI 兼容终端里,可以用彩色显示文本而不仅仅是黑白。但是我们自己编写的程序能否输出彩色的字
符呢?当然答案是肯定的。下面的语句就输出高亮的黑色背景的绿色字。
printf("\033[1;40;32m good!!! \033[0m Hello,NSFocus \n");
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。后面的 1 定义了高亮显示字符。然后是背景颜
色,这里面是40,表示黑色背景。接着是前景颜色,这里面是32,表示绿色。我们用 \033[0m 关闭转义
序列, \033[0m 是终端默认颜色。
    通过上面的介绍,就知道了如何输出彩色字符了。因此,我就不再多说了。下面是对于彩色字符颜色
的一些定义:
    前景            背景              颜色
    ---------------------------------------
    30                40              黑色
    31                41              紅色
    32                42              綠色
    33                43              黃色
    34                44              藍色
    35                45              紫紅色
    36                46              青藍色
    37                47              白色
    代码              意义
    -------------------------
    0                终端默认设置(一般的默认为黑底白字)
    1                高亮显示
    4                使用下划线
    5                闪烁
    7                反白显示
    8                不可见

使用特权

评论回复
11
gaochy1126|  楼主 | 2013-8-28 23:23 | 只看该作者
超级终端中字符颜色设置

使用特权

评论回复
12
gaochy1126|  楼主 | 2013-8-28 23:26 | 只看该作者
在 ANSI 兼容终端(例如 xterm、rxvt、konsole 等)里, 可以用彩色显示文本而不仅仅是黑白。

下面的语句就输出高亮的黑色背景的绿色字。
printf("\033[1;40;32m%s\033[0m", Hello,world!\n);
\033 声明了转义序列的开始,然后是 [ 开始定义颜色。后面的 1 定义了高亮显示字符。然后是背景颜色,这里面是40,表示黑色背景。接着是前景颜色,这里面是32,表示绿色。我们用 \033[0m 关闭转义序列, \033[0m 是终端默认颜色。
通过上面的介绍,就知道了如何输出彩色字符了。

下面是对于彩色字符颜色的一些定义:
前景          背景              颜色
---------------------------------------
30             40              黑色
31             41              紅色
32             42              綠色
33             43              黃色
34             44              藍色
35             45              紫紅色
36             46              青藍色
37             47              白色

    代码              意义
-------------------------
0             终端默认设置
1             高亮显示
4             使用下划线
5             闪烁
7             反白显示
8             不可见


        通过串口收发或显示字符时,我们使用的通常是字符的ASCII码。对于非控制字符,也即键入命令时我们可能使用到的命令字符,在控制台中我们使用了ASCII码值从0x20~0x7e之间的字符。对于控制字符,在常用字符ASCII码对照表中我们可以找到Enter键、Backspace(退格)键以及ESC键的ASCII码,但是却没有上下左右方向键以及Home、End键对应的ASCII码,通过对键盘输入字符的串口收发测试发现,如果在测试时按下了方向键则串口在每次按键后会连续发送出3字节数据,前两字节所有方向键的数据相同,分别是0x1b,0x5b,第3字节对应不同的按键,上下右左方向键分别对应的值为:0x41、0x42、0x43、0x44,Home和End键对应的值为0x48和0x4b。故要检测键盘是否键入了方向键,需要向串口连续读取三字节的数据,同理,要控制光标向左、向右移动或Home、End也需要连续一次向串口发送3字节数据。

///////////////////////////////////////////////////////////////////////////////
//filename:tracelog.c
#include <stdio.h>

int main(int argc,char **argv)
{
    unsigned char attr[]={0,1,4,5,7,8};
    unsigned char fore[]={30,31,32,33,34,35,36,37};
    unsigned char back[]={40,41,42,43,44,45,46,47};
    int adx,fdx,bdx;

    for(bdx=0;bdx<sizeof(back);bdx++)
    {
        for(fdx=0;fdx<sizeof(fore);fdx++)
        {
            for(adx=0;adx<sizeof(attr);adx++)
            {
                printf("\033[%d;%d;%dmhello,NSFocus!!!\033[0m",
                    attr[adx],fore[fdx],back[bdx]);
                printf("<==attr=%d,fore=%d,back=%d\n",
                    attr[adx],fore[fdx],back[bdx]);
            }
        }
        printf("\n");
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1050

主题

11299

帖子

26

粉丝