?? uart.c
字號:
#include "uart.h"
#include "iom16c62p.h"
#include <stdarg.h>
#define condition *format!='f'&&*format!='d'&&*format!='c'&&*format!='s'&&*format!='l'&&*format!='u'&&*format!='\0'&&*format!=' '&&*format!='i'&&*format!='x'&&*format!='X'&&*format!='o'&&*format!='%'&&*format!='p'&&*format!='\n'
int from_puts = 0;
int left_val, right_val;
long temp_arr[]={100000,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
/*************** Print Character *****************/
void _putchar(int c) {
while (U1C1.BIT.TI == 0); /* wait if the transmit buffer is full */
U1TB.BYTE.U1TBL = (char)c; /* load character c into transmit buffer */
}
/*************** Copy String *****************/
char* _strcpy(char *s2, char *s1){
int i;
for(i = 0; s1[i] != '\0'; ++i)
s2[i] = s1[i];
s2[i] = s1[i];
return s2;
}
/*************** Print String *****************/
void _puts(char *s) {
while(*s != '\0'){
_putchar(*s);
s++;
}
}
/*************** Get String Length *****************/
uart_uint16 _strlen(char *s) {
uart_uint16 count=0;
while(*s != '\0'){
count++;
s++;
}
return count;
}
/*************** Echo Character *****************/
void _echo() {
_putchar(_getchar());
}
/*************** Get Character *****************/
uart_uchar _getchar(void) {
if (U1C1.BIT.RI != 1)
return -1;
uart_uchar c = U1RB.BYTE.U1RBL; /* get data if any from receive buffer */
return c; /* return receive buffer data */
}
/*************** Reverse String *****************/
void _strrev(char *tempstr) {
char *temp,temp_char;
int len=_strlen(tempstr) ;
temp = tempstr + len -1;
while(tempstr < temp ){
temp_char = *tempstr;
*tempstr = *temp;
*temp = temp_char;
tempstr++;
temp--;
}
}
/*************** Hexadecimal, Octal Support *****************/
void print_hex_oct( long int temp_var,int div,int corr_factor,int ret_val,int sign,int *cntr_val) {
unsigned long int i=1,i1,temp=temp_var;
int cntr=0,neg_flag=0;
char s1[40];
if(sign==1&&temp_var<0){
temp=-temp_var;
neg_flag=1;
}
if(temp==0)
s1[cntr++]='0';
while(temp>0){
i1=temp%div;
temp=temp/div;
if(i1<=9)
s1[cntr]=i1+'0';
else
s1[cntr]=i1+corr_factor-9;
cntr++;
}
while((left_val-(right_val>cntr?right_val:cntr+neg_flag))>0){
_putchar(' ');
left_val--;
(*cntr_val)++;
}
while(right_val-cntr>0){
s1[cntr++]='0';
}
if(neg_flag==1)
s1[cntr++]='-';
s1[cntr]='\0';
_strrev(s1);
_puts(s1);
(*cntr_val)+=_strlen(s1);
}
/*************** Floating Point Support *****************/
void float_print(long double f1,long double f2,int multi,int *cntr_val) {
int i=1,temp,cntr=0,i1,neg_flag=0;
char s1[10];
if(f1<0){
f1=f1*-1;
neg_flag=1;
f2=f1;
}
temp=(int)f1;
f1=f1-temp;
f1=f1*multi;
temp=f1;
if(temp==0)
s1[cntr++]='0';
while(temp>0){
i1=temp%10;
temp=temp/10;
s1[cntr]=i1+0x30;
cntr++;
}
while(right_val<9&&(right_val -cntr)>0)
s1[cntr++]='0';
s1[cntr]='.';
cntr++;
temp=(int)f2;
if(temp==0)
s1[cntr++]='0';
while(temp>0){
i1=temp%10;
temp=temp/10;
s1[cntr]=i1+0x30;
cntr++;
}
while(left_val-- -cntr>0){
_putchar(' ');
(*cntr_val)++;
}
if(neg_flag==1)
s1[cntr++]='-';
s1[cntr]='\0';
cntr--;
_strrev(s1);
_puts(s1);
(*cntr_val)+=_strlen(s1);
neg_flag=0;
}
/*************** Format Values *****************/
int format_val(char *temp,long float_flag,int *cntr_val,int flag) {
left_val=0;
right_val=0;
if(*temp=='\0'&&flag==1) {
right_val=3;
return 0;
}
while(*temp!='.'&&*temp!='\0') {
if(*temp<'0'||*temp>'9')
{
while(*temp)
{
_putchar(*temp++);
(*cntr_val)++;
}
return -1;
}
else
left_val=left_val*10+*temp-'0';
temp++;
}
if(*temp)
temp++;
else
return left_val;
while(*temp) {
if(*temp<'0'||*temp>'9')
{
while(*temp)
{
_putchar(*temp++);
(*cntr_val)++;
}
return -1;
}
else
right_val=right_val*10+*temp-'0';
temp++;
}
return 0;
}
/*************** Printf(arguments) *****************/
int _printf(const char * format, ...) {
int format_cntr=0;
char temp_str[20];
int return_flag=0,cntr_val;
long double f1,f2;
char *str_temp;
int *cntr=&cntr_val;
va_list ap;
va_start(ap, format);
*cntr=0;
while(*format) {
if(*format=='\n') {
_putchar('\r');
}
temp_str[format_cntr]='\0';
if(*format=='%') {
*format++;
while(*format==' ') {
format++;
_putchar(' ');
}
while(condition){
temp_str[format_cntr++]=*format++;
}
temp_str[format_cntr]='\0';
if(*format=='%') {
_putchar('%');
(*cntr)++;
format_cntr=0;
format++;
continue;
}
/************** Printf Unsigned ****************/
else if(*format=='u'){
return_flag=format_val(temp_str,0,cntr,0);
if(return_flag!=-1)
print_hex_oct(va_arg(ap,unsigned int),10,0,return_flag,0,cntr);
else {
_putchar(*format);
(*cntr)++;
}
format++;
format_cntr=0;
continue;
}
/*********** Printf Integer **************/
else if(*format=='d'||*format=='i') {
return_flag=format_val(temp_str,0,cntr,0);
if(return_flag!=-1){
print_hex_oct(va_arg(ap,int),10,0,return_flag,1,cntr);
}
else {
_putchar(*format);
(*cntr)++;
}
format++;
format_cntr=0;
continue;
}
/*********** Printf Hexadecimal, Octal ******************/
else if(*format=='x'||*format=='X'||*format=='o'||*format=='p') {
return_flag=format_val(temp_str,0,cntr,0);
if(return_flag!=-1) {
if(*format=='x'||*format=='p')
print_hex_oct(va_arg(ap,unsigned int),16,0x60,return_flag,0,cntr);
else if(*format=='X')
print_hex_oct(va_arg(ap,unsigned int),16,0x40,return_flag,0,cntr);
else
print_hex_oct(va_arg(ap,unsigned int),8,0,return_flag,0,cntr);
}
else {
_putchar(*format);
(*cntr)++;
}
format++;
format_cntr=0;
continue;
}
/************ Printf Character *******************/
else if(*format=='c') {
return_flag=format_val(temp_str,0,cntr,0);
if(return_flag!=-1) {
while(return_flag-->1) {
_putchar(' ');
(*cntr)++;
}
_putchar(va_arg(ap,int));
(*cntr)+=2;
}
else {
_putchar(*format);
(*cntr)++;
}
format++;
format_cntr=0;
continue;
}
/*************** Printf String *****************/
else if(*format=='s') {
return_flag=format_val(temp_str,0,cntr,0);
if(return_flag!=-1) {
str_temp=va_arg(ap,char*);
while((return_flag-- -(int) _strlen(str_temp))>0) {
_putchar(' ');
(*cntr)++;
}
_puts(str_temp);
(*cntr)+=_strlen(str_temp);
}
else {
_putchar(*format);
(*cntr)++;
}
format++;
format_cntr=0;
continue;
}
/*************** Printf Floating Point Number *****************/
else if(*format=='f'||(*format=='l'&&*(format+1)=='f')) {
return_flag=format_val(temp_str,1,cntr,1);
if(return_flag!=-1) {
if(*format=='l') {
f1=va_arg(ap,long double);
format+=2;
}
else {
f1=va_arg(ap,double);
format++;
}
f2=f1;
right_val++;
float_print(f1,f2,temp_arr[right_val%10],cntr);
}
else {
_putchar(*format++);
(*cntr)++;
}
format_cntr=0;
continue;
}
else if(*format=='l'&&((*(format+1)=='d')||(*(format+1)=='u'))) {
return_flag=format_val(temp_str,0,cntr,0);
if((return_flag=-1)&&(*(format+1)=='d')) {
print_hex_oct(va_arg(ap,long int),10,0x00,return_flag,1,cntr);
}
else if((return_flag=-1)&&(*(format+1)=='u')) {
print_hex_oct(va_arg(ap,unsigned long int),10,0x00,return_flag,0,cntr);
}
else {
_putchar(*format);
_putchar(*(format+1));
(*cntr)+=2;
}
format+=2;
format_cntr=0;
continue;
}
else {
_puts(temp_str);
format_cntr=0;
continue;
}
}
_putchar(*format++);
(*cntr)++;
}
va_end(ap);
return cntr_val;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -