[英]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.