TQ2440裸奔程序串口UART的PC机按键测试程序
//=========================================
// 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机按键测试程序相关推荐
- s3c2440第一个裸奔程序——跑马灯(转)
经过前段时间的准备,现在终于开始正式写ARM程序了.本着先易后难的原则,先写无操作系统的ARM裸奔程序,以便熟悉s3c2440的内部结构,此后再编写有操作系统的程序. 第一个程序就从最最简单的点亮开发 ...
- arm开发tq2440上的c++裸奔程序
AVR实验做到LCD的时候,就发现proteus上没有现成合适的显示模块,网上找的模块不是按一般方法封装的,想来自己还有一块arm9开发板,大概大三.大四时候买的,已经搁置三年了.毕业这两年已经从51 ...
- ARM上裸奔的跑马灯程序
今天用优龙ST2410测试了一下在不进系统的情况下裸奔跑马灯程序.首先总结下在ARM板上裸奔程序的几种方法:既然要在ARM上裸奔,首先地让ARM板不进系统,方法是上电复位后选BIOS的最后一项:7 : ...
- [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...
星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...
- STM32开发,串口和PC机通信(串口中断、FIFO机制),安富莱+正点原子程序合并
STM32开发,串口和PC机通信(串口中断.FIFO机制),安富莱+正点原子程序合并 1 概述 1.1 资源概述 1.2 实现功能 2 软件实现 2.1实现步骤 2.2 main()函数代码 2.3 ...
- 裸奔真的会中木马病毒 挖矿病毒 wup.exe 程序文件占用电脑资源
4日晚上,打开任务管理器的时候发现CPU使用一直在80%,是 wup.exe 占用的,同时还占用了2G内存,低优先级运行,用户名 SYSTEM,很不正常,于是开始排查. 发现这玩意是上午十点左右中的, ...
- 高驰涛——裸奔到北京的程序猿
关键词:毕业即失业的迷茫时代:裸奔到北京,没有窗户没有暖气的打拼:医院里写出了SeasLog:加入云智慧 高驰涛Neeke,云智慧目前的系统架构师,同时也是SeasLog的作者. 这位已经在北京结婚生 ...
- micropython stm32f030_STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
1.从 GPIO 到 UART 前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断.接下来我们介绍的也是最常用的一个模块,串口(UART). 串口可以说是最古老,而且生命力最强的 ...
- PC 机 UART(NS8250)详解
PC 机 UART(NS8250)详解 异步串行通信原理 两台计算机/设备进行数据交换,即通信,必须像人们对话一样使用同一种语言.在计算机通信术语中,我们把计算机/设备与计算机/设备之间的" ...
最新文章
- C02-程序设计基础提高班(C++)第9周上机任务-类和对象
- PHPExcel 出现open_basedir restriction in effect的解决办法
- CSS浏览器兼容性问题详解总结
- lt、le、eq、ne、ge、gt的含义
- ​分布式数据库技术基础:数据分布介绍
- Module 让 Terraform 使用更简单
- java 字符串查找程序_java-如何在JAR文件中搜索字符串
- Python数据结构与算法笔记(一):时间复杂度与空间复杂度
- 啊,久违的 win7 开机画面!
- 【备忘】Java菜鸟到大牛学习路线之实战篇
- 【Python】Python第三方库概览
- python函数长度单位换算,(最新整理)长度单位换算
- numpy手写NLP模型(四)———— RNN
- Linux下分卷压缩与解压
- 大数据精选面试题160道
- gazebo实现小车巡线
- 苹果屏幕上的小圆点_今天才发现,苹果手机点一下屏幕就能截图,还支持长截图学到了...
- MFC应用程序“生死因果”内幕
- Driller源码阅读笔记(一)
- Ruby+Watir搭建自动化测试框架