繁体   English   中英

AVR C:串行通信清除屏幕

[英]AVR C : Serial Communication Clear Screen

我正在将AVR C与Atmega微控制器配合使用。 我正在使用串行通信,我想将一个字符“ A”传输到屏幕,然后擦除它并显示“ B”。 我在清理屏幕时遇到麻烦。

我读到ESC ASCII可以工作,所以我尝试了。

#define F_CPU 16000000UL


void initUART(unsigned int baud);
void transmitByte(unsigned char data);
unsigned char receiveByte(void);

int getNumOfDigits(int num);
void printDec(int num);

int main(void) {


    DDRB = 0b00000011; 
    PORTB = 0b00011000;

    initUART(9600);


    while(1) {

        //s1 pressed
        if ((PINB & 0b00001000) == 0) {

            transmitByte('A');
            transmitByte((char) 27);
            transmitByte('B');
            _delay_ms(1000);
        }  

    }

    return 0;
}

void initUART(unsigned int baud) {

    /*
        Initialize settings for uart functions.
        Must be done once at the beginning of the program.
    */

    //Normal mode UBRR formula
    unsigned int ubrr = F_CPU/16/baud-1;

    //shift MSB and store in UBRR0H
    UBRR0H = (unsigned char) (ubrr >> 8);

    //store LSB in UBRR0L
    UBRR0L = (unsigned char) ubrr;

    //Enable transmitter/receiver
    UCSR0B = (1 << RXEN0) | (1 << TXEN0);

    //8-Bit Characters, 0 Stop bits, No parity
    UCSR0C = (1 << UCSZ00) | (1 << UCSZ01); 

}

void transmitByte(unsigned char data) {

    /*
        Write byte to UART
    */

    //Wait for empty transmit buffer
    while(!(UCSR0A & (1 << UDRE0)));

    //Start transmission by writing to UDR0
    UDR0 = data;

}

unsigned char receiveByte(void){

    /*
        Read byte from UART
    */

    //Wait for incoming byte
    while(!(UCSR0A & (1 << RXC0)));

    //Return the byte
    return UDR0;
}

但是它不起作用,我对微控制器还很陌生,它只是打印

AAAA..

如何清除屏幕,然后在串行通讯屏幕上打印新字符,我正在使用腻子。

更新

transmitByte('A');



transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

transmitByte('^');
transmitByte('[');
transmitByte('H');  

transmitByte('B');

产量

在此处输入图片说明

如何使光标回到其原始位置?

最终工作

transmitByte('A');

transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

transmitByte(27); 
transmitByte('[');
transmitByte('H');  

transmitByte('B');

上面的代码可以工作,擦除并向后移动光标。

我不太确定要传送“ A”然后清除屏幕,但是...如果要清除屏幕,则必须发送终端仿真器可以理解的转义序列 通常, ESC[2J可以做到这一点,许多终端仿真器都可以理解。 所以你可以这样写:

transmitByte(27);   // this is the escape
transmitByte('[');
transmitByte('2');
transmitByte('J');  // uppercase J

看一下腻子的“终端仿真”特性(它有一些选择),通常来说是“转义序列”。 还请考虑^[[2J (^ [表示Escape)清除屏幕,但不应将光标发送到原位。 为此,您需要^[[H

一些基本信息链接: http : //www.isthe.com/chongo/tech/comp/ansi_escapes.html

还: http : //ascii-table.com/ansi-escape-sequences.php

也就是说,打印退格键以返回行上的一个位置(十进制字符8),或者回车以返回到当前行的开头(十进制字符13),最后打印一些内容也可能很有趣。 ,然后使用ESC[K清除该行的其余部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM