程序有参考Samsung S3C2440库文件。
程序组成:测试程序
/* ******************************************************
* File Name: main.c
* Function: AVR UART I/O 功能模块
* Description: 实现UART输入/回显/格式化输出功能, 方便程序调试
* Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新
* ******************************************************/
#include
#include
#include
#include
#include
#include "uart.h"
#include "step_motor.h"
#include "hardware.h"
/* 测试程序 */
void main(void)
{
u16 n;
u8 s[20];
uart_init(9600);
_SEI();
while (1) {
uart_putstring("Please input a number: ");
n = uart_getnum();
uart_putstring("Please input a string: ");
uart_getstring(s);
uart_printf("number: %d, string: \"%s\"\n", n, s);
_WDR();
}
}
/* ******************************************************
* File Name: uart.h
* Function: AVR UART I/O 功能模块
* Description: 实现UART输入/回显/格式化输出功能, 方便程序调试
* Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新
* ******************************************************/
#ifndef _UART_H
#define _UART_H
#include "hardware.h"
/* UART初始化 */
void uart_init(u32 baud);
/* 读1字节, 无数据则忙等 */
u8 uart_getchar(void);
/* 尝试读1字节, 无数据返回0, 可用于检测按键 */
u8 uart_getkey(void);
/* 接收字符串, 并回显, 需在参数中给定字符串存放位置 */
void uart_getstring(u8 *str);
/* 接收整型数, 支持8进制/10进制/16进制输入 */
u16 uart_getnum(void);
/* 写1字节, 发送缓冲器满则忙等 */
void uart_putchar(u8 data);
/* 字符串输出 */
void uart_putstring(u8 *str);
/* 格式化输出, 不支持浮点数 */
void uart_printf(const u8 *fmt, ...);
#endif
/* ****************************************************** * File Name: uart.c * Function: AVR UART I/O 功能模块 * Description: 实现UART输入/回显/格式化输出功能, 方便程序调试 * Authon & Date: Joshua Chan, 2012/04/01, 2012/04/14更新 * ******************************************************/ #include#include #include #include #include #include #include #include "uart.h" /* UART初始化 */ void uart_init(u32 baud) { u16 ubrr; /* 设置baudrate */ ubrr = (u16)((FOSC / (8 * baud)) - 1); UBRR0H = (u8)(ubrr >> 8); UBRR0L = (u8)ubrr; /* 倍速发送 */ UCSR0A |= 1 << U2X0; /* 设置帧格式: 8个数据位, 1个停止位 */ UCSR0C = 3 << UCSZ00; /* 使能: 接收结束中断, 接收, 发送 */ UCSR0B = (1< 0) { uart_putstring("\b \b"); str--; } } else { *str = c; str++; uart_putchar(c); } } *str = '\0'; uart_putchar('\n'); } /* 接收整型数, 支持8进制/10进制/16进制输入 */ u16 uart_getnum(void) { u8 str[10]; uart_getstring(str); return (u16)strtol((char *)str, NULL, 0); } /* 写1字节, 发送缓冲器满则忙等 */ void uart_putchar(u8 data) { while (!(UCSR0A & (1 << UDRE0))) ; UDR0 = data; if (data == '\n') uart_putchar('\r'); } /* 字符串输出 */ void uart_putstring(u8 *str) { #ifdef DEBUG while (*str) uart_putchar(*str++); #endif } /* 格式化输出, 不支持浮点数 */ void uart_printf(const u8 *fmt, ...) { #ifdef DEBUG u8 str[128]; /* 数组空间尽可能大一些, 以免越界 */ va_list args; va_start(args, fmt); vsprintf((char *)str, (char *)fmt, args); uart_putstring(str); va_end(args); #endif }
上一篇:编程点滴:AVR timer0 配置模块
下一篇:编程点滴:16位AVR定时器比较匹配中断测试程序
推荐阅读最新更新时间:2024-03-16 15:16