//=========================================
// NAME: main.c
// DESC: TQ2440串口UART测试程序
//=========================================
/* 头文件包含 */
#include "def.h"
#include "option.h"
#include "2440addr.h"

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

//======================================================
static volatile int uart_port = 0;
void uart_init(int pclk,int buad,int ch)
{
 //UART初始化:端口使能、功能设定、波特率、设置数据格式
 rGPHCON = (rGPHCON & ~(0xfff<<4)) | (0xaaa<<4);//端口RX[0:2]、TX[0:2]功能
 rGPHUP = rGPHUP | (0x7<<1);  //端口GPH[1:3]禁止上拉
 
 rUFCON0 = 0x0; //禁止FIFO
 rUFCON1 = 0x0; //禁止FIFO
 rUFCON2 = 0x0; //禁止FIFO
 rUMCON0 = 0x0; //禁止AFC
 rUMCON1 = 0x0; //禁止AFC
 //Normal:No parity:One stop:8-bits 中断响应 UART clock: PCLK
 rULCON0  = (rULCON0 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON0   = (rUCON0 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV0 = ((int)(pclk/16./buad+0.5)-1);
 
 rULCON1  = (rULCON1 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON1   = (rUCON1 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV1 = ((int)(pclk/16./buad+0.5)-1);
 
 rULCON2  = (rULCON2 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));
 rUCON2   = (rUCON2 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));
 rUBRDIV2 = ((int)(pclk/16./buad+0.5)-1);
 
 uart_port = ch; //设置串口端口号
}

//******************************************************
//       串口发送函数
//******************************************************

//======================================================
void uart_send_byte(int data)
{
 if(0 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT0 & 0x2));
   rUTXH0 = '\n';
  }
  while(!(rUTRSTAT0 & 0x2));
  rUTXH0 = data;
 }
 else if(1 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT1 & 0x2));
   rUTXH1 = '\n';
  }
  while(!(rUTRSTAT1 & 0x2));
  rUTXH1 = data;
 }
 else if(2 == uart_port)
 {
  if(data == '\n')
  {
   while(!(rUTRSTAT2 & 0x2));
   rUTXH2 = '\n';
  }
  while(!(rUTRSTAT2 & 0x2));
  rUTXH2 = data;
 }
}

//======================================================
void uart_send_string(char *string)
{
 while(*string)
 {
  uart_send_byte(*string++);
 }
}

//======================================================
void uart_printf(char *fmt,...)
{
 va_list ap;
 char string[256];
 
 va_start(ap,fmt);
 vsprintf(string,fmt,ap);
 uart_send_string(string);
 va_end(ap);
}

//******************************************************
//    串口接收函数
//******************************************************

//======================================================
void uart_tx_empty(void)
{
 if(0 == uart_port)
 {
  while(!(rUTRSTAT0 & 0x4));//等待Tx为空
 }
 if(1 == uart_port)
 {
  while(!(rUTRSTAT1 & 0x4));//等待Tx为空
 }
 if(2 == uart_port)
 {
  while(!(rUTRSTAT2 & 0x4));//等待Tx为空
 }
}

//======================================================
char uart_get_ch(void)
{
 if(0 == uart_port)
 {
  while(!(rUTRSTAT0 & 0x1));//等待Rx被读
  return rURXH0;     //读缓存寄存器
 }
 else if(1 == uart_port)
 {
  while(!(rUTRSTAT1 & 0x1));//等待Rx被读
  return rURXH1;     //读缓存寄存器
 }
 else if(2 == uart_port)
 {
  while(!(rUTRSTAT2 & 0x1));//等待Rx被读
  return rURXH2;     //读缓存寄存器
 }
 return 0;
}

//======================================================
char uart_get_key(void)
{
  if(0 == uart_port)
 {
  if(rUTRSTAT0 & 0x1)      //Rx被读
  {
   return rURXH0;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 if(1 == uart_port)
 {
  if(rUTRSTAT1 & 0x1)       //Rx被读
  {
   return rURXH1;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 if(2 == uart_port)
 {
  if(rUTRSTAT2 & 0x1)    //Rx被读
  {
   return rURXH2;    //读缓存寄存器
  }
  else
  {
   return 0;    
  }
 }
 return 0; 
}

//======================================================
void uart_get_string(char *string)
{
 char *string1 = string;
 char c = 0;
 while((c = uart_get_ch())!='\r')
 {
  if(c == '\b')
  {
   if((int)string1 < (int)string)
   {
    uart_printf("\b\b");
    string--;
   }
  }
  else
  {
   *string++ = c;
   uart_send_byte(c);
  }
 }
 *string = '\0';
 uart_send_byte('\n');
}

//======================================================
int uart_get_intnum(void)
{
 char str[30];
 char *string = str;
 int base = 10;
 int minus = 0;
 int result = 0;
 int last_index;
 int i;
 
 uart_get_string(string);
 
 if(string[0] == '-')
 {
  minus = 1;
  string++;
 }
 
 if(string[0] == '0' && (string[1] == 'x' || string[1] == 'X'))
 {
  base = 16;
  string = string + 2;
 }
 
 last_index = strlen(string)-1;
 
 if(last_index < 0)
 {
  return -1;
 }
 
 if(string[last_index] == 'h' || string[last_index] == 'H')
 {
  base = 16;
  string[last_index] = 0;
  last_index--;
 }
 
 if(base == 10)
 {
//atoi将字符串转换为整型值
  result = atoi(string);
  result = minus ? (-1*result) : result;
 }
 else
 {
  for(i=0;i<=last_index;i++)
  {
//判断字符是否为英文字母,当为英文字母a-z或A-Z时,返回非零值,否则返回零。
   if(isalpha(string[i]))
   {
//isupper 判断字符是否为大写英文字母,当c为大写英文字母,返回非零值,否则返回零。   
    if(isupper(string[i]))
    {
     result = (result<<4) + string[i]-'A'+10; 
    } 
    else
    {
     result = (result<<4) + string[i]-'a'+10;
    }
   }
   else
   {
    result = (result<<4) + string[i]-'0'+10;
   }
  }
  result = minus ? (-1*result) : result;
 }
 return result;
}

//======================================================
int uart_get_intnum_gj(void)
{
 char string[16];
 char *p_string = string;
 char c;
 int i = 0;
 int data = 0;
 
 while((c = uart_get_ch()) != '\r')
 {
  if(c == '\b')
  {
   p_string--;
  }
  else
  {
   *p_string++ = c;
   
  }
  //uart_send_byte(c);
 }
 
 *p_string = '\0';
 
 i=0;
 while(string[i] != '\0')
 {
  data = data*10;
  if(string[i]<'0' || string[i]>'9')
  {
   return -1;
  }
  data = data +(string[i]-'0');
  i++;
 }
 
 return data;
}

//******************************************************

void Main(void)
{
 uart_init(50000000,115200,0);
 while(1)
 {
  if('-' == uart_get_ch())
  {
   uart_printf("+\n");
  }
  if('+' == uart_get_key())
  {
   uart_printf("-\n");
  }
 }
}

TQ2440裸奔程序串口UART的PC机按键测试程序相关推荐

  1. s3c2440第一个裸奔程序——跑马灯(转)

    经过前段时间的准备,现在终于开始正式写ARM程序了.本着先易后难的原则,先写无操作系统的ARM裸奔程序,以便熟悉s3c2440的内部结构,此后再编写有操作系统的程序. 第一个程序就从最最简单的点亮开发 ...

  2. arm开发tq2440上的c++裸奔程序

    AVR实验做到LCD的时候,就发现proteus上没有现成合适的显示模块,网上找的模块不是按一般方法封装的,想来自己还有一块arm9开发板,大概大三.大四时候买的,已经搁置三年了.毕业这两年已经从51 ...

  3. ARM上裸奔的跑马灯程序

    今天用优龙ST2410测试了一下在不进系统的情况下裸奔跑马灯程序.首先总结下在ARM板上裸奔程序的几种方法:既然要在ARM上裸奔,首先地让ARM板不进系统,方法是上电复位后选BIOS的最后一项:7 : ...

  4. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  5. STM32开发,串口和PC机通信(串口中断、FIFO机制),安富莱+正点原子程序合并

    STM32开发,串口和PC机通信(串口中断.FIFO机制),安富莱+正点原子程序合并 1 概述 1.1 资源概述 1.2 实现功能 2 软件实现 2.1实现步骤 2.2 main()函数代码 2.3 ...

  6. 裸奔真的会中木马病毒 挖矿病毒 wup.exe 程序文件占用电脑资源

    4日晚上,打开任务管理器的时候发现CPU使用一直在80%,是 wup.exe 占用的,同时还占用了2G内存,低优先级运行,用户名 SYSTEM,很不正常,于是开始排查. 发现这玩意是上午十点左右中的, ...

  7. 高驰涛——裸奔到北京的程序猿

    关键词:毕业即失业的迷茫时代:裸奔到北京,没有窗户没有暖气的打拼:医院里写出了SeasLog:加入云智慧 高驰涛Neeke,云智慧目前的系统架构师,同时也是SeasLog的作者. 这位已经在北京结婚生 ...

  8. micropython stm32f030_STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单

    1.从 GPIO 到 UART 前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断.接下来我们介绍的也是最常用的一个模块,串口(UART). 串口可以说是最古老,而且生命力最强的 ...

  9. PC 机 UART(NS8250)详解

    PC 机 UART(NS8250)详解 异步串行通信原理 两台计算机/设备进行数据交换,即通信,必须像人们对话一样使用同一种语言.在计算机通信术语中,我们把计算机/设备与计算机/设备之间的" ...

最新文章

  1. C02-程序设计基础提高班(C++)第9周上机任务-类和对象
  2. PHPExcel 出现open_basedir restriction in effect的解决办法
  3. CSS浏览器兼容性问题详解总结
  4. lt、le、eq、ne、ge、gt的含义
  5. ​分布式数据库技术基础:数据分布介绍
  6. Module 让 Terraform 使用更简单
  7. java 字符串查找程序_java-如何在JAR文件中搜索字符串
  8. Python数据结构与算法笔记(一):时间复杂度与空间复杂度
  9. 啊,久违的 win7 开机画面!
  10. 【备忘】Java菜鸟到大牛学习路线之实战篇
  11. 【Python】Python第三方库概览
  12. python函数长度单位换算,(最新整理)长度单位换算
  13. numpy手写NLP模型(四)———— RNN
  14. Linux下分卷压缩与解压
  15. 大数据精选面试题160道
  16. gazebo实现小车巡线
  17. 苹果屏幕上的小圆点_今天才发现,苹果手机点一下屏幕就能截图,还支持长截图学到了...
  18. MFC应用程序“生死因果”内幕
  19. Driller源码阅读笔记(一)
  20. Ruby+Watir搭建自动化测试框架

热门文章

  1. 蚂蚁森林能量自动化收集
  2. 汉诺塔问题——递归算法
  3. windows 高级
  4. JAVA中的匿名类、内部类和匿名内部类
  5. IBM研究院院长:量子计算“大爆发”将在十年内到来
  6. xp sp3 远程桌面连接到控制台
  7. EditPlus 3.12 序列号/注册码
  8. RabbitMQ高可用--Quorum Queue(仲裁队列)的用法
  9. STM32----STM32的中断优先级理解
  10. BootLoader这个玩意