打印
[Atmel]

arduino开发板自己配置寄存器、但功能有些问题

[复制链接]
881|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丶tiantian|  楼主 | 2016-3-25 13:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
配置好寄存器,收发子函数,能用串口助手发送数据显示,但是无法执行按键扫描,无法把键值发送给串口助手显示,求解!!!!!!问题在哪里???
// 包含头文件
#include <LiquidCrystal.h>
// 初始化引脚
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const int numRows = 4;//定义4行
const int numCols = 4;//定义4列
const int debounceTime = 20;// 去抖动时间长度
const int trig = 14; // 触发信号
const int echo = 15; // 反馈信号
const char keymap[numRows][numCols]=
{//键值,可以按需要更改
{ '1','2','3','A' },
{'4','5','6','B' },
{'7','8','9','C' },
{'*','0','#','D' }
};
const int rowPins[numRows] = {6,5,4,3}; //设置硬件对应的引脚
const int colPins[numCols] = {16,17,18,19};
/*******************************************/
/*Atmel AVR Atmega328控制器/
/USART_init:初始化 USART 系统/
/波特率9600bps/
/16MHz
/******************************************/
/*串口初始化函数*/
void USART_init(void)
{
UCSR0B=0x00; /*初始化控制寄存器*/
UCSR0A=0x00;
UCSR0C|=(1<<UMSEL01)|(1<<UCSZ01)|(1<<UCSZ00); /*设置异步通信,无奇偶校验,1个终止位,8位数据*/
/*UMSEL01设置为1*/
UBRR0L=0x67; /*设置波特率寄存器*/

UBRR0H=0x00; /*UBRR=((系统时钟生成器)/(16*波特率))-1)*/
UCSR0B|=(1<<TXEN0)|(1<<RXEN0); /*发送接收使能*/
}
/***********发送数据函数************/
void USART_transmit(unsigned char Trandata)
{
while(!(UCSR0A&(1<<UDRE0))); /*只有数据寄存器为空时才能发送数据*/
{
;
}
UDR0=Trandata; /*加载发送数据到UDR0*/
}
/***********接收数据函数***********/
unsigned char USART_receive(void)
{
unsigned char Recedata;
while(!(UCSR0A&(1<<RXC0))); /*等待RXC0标志位*/
{
;
}
Recedata=UDR0; /*从UDR0获取数据*/
return Recedata;
}
/**************************************************/
/*******************发送字符串函数*********************/
void USART_Putstring(unsigned char *s)
{
while(*s)
{
USART_transmit(*s++);
}
USART_transmit(0x0D);
USART_transmit(0x0A); //结尾发送回车换行
}
//初始化功能
void setup()
{
// 设置行列值
lcd.begin(16, 2);
USART_init(); //串口初始化,波特率设置为9600bps
lcd.write("Input string ");//提示从PC串口软件发送信息
lcd.setCursor(0, 1);
lcd.write("Please wait ");//提示从PC串口软件发送信息
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
//触发端口设置为输出,反馈端口设置为输入
for(int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT);
digitalWrite(rowPins[row],HIGH);
}
for(int column = 0;column < numCols; column++)
{
pinMode(colPins[column],OUTPUT);
digitalWrite(colPins[column],HIGH);
}
}
//主循环
void loop()
{
unsigned char data;


delay(100);
// 清屏

data=USART_receive();

USART_transmit(data);
USART_transmit(0x0D);
USART_transmit(0x0A);

// 显示到液晶屏幕
lcd.write(data);
delay(500);

char key = getkey();
if(key!=0&&key!='A'&&key!='B'&&key!='*') //A键启动超声波测距程序
//B键启动自动发送123数据传输上位机程序
//*键清屏功能和结束A键B键功能
{
Serial.print("Got key vale ");//串口打印键值
key=USART_receive();
USART_transmit(key);
USART_transmit(0x0D);
USART_transmit(0x0A);

lcd.write(key);

lcd.leftToRight(); //字符从左往右排列
}

if(key=='B')
{
do
{
unsigned char test=123;
delay(500);
test=USART_receive();

USART_transmit(test);
USART_transmit(0x0D);
USART_transmit(0x0A);

lcd.leftToRight(); //字符从左往右排列
delay(500);
key=getkey();
}while(key!='*');
}
//超声波测距程序
if(key=='A')
{
long IntervalTime=0; //定义一个时间变量
do
{
digitalWrite(trig, 1);//置高电平

delayMicroseconds(15);//延时15us

digitalWrite(trig, 0);//设为低电平
IntervalTime=pulseIn(echo, HIGH);//用自带的函数采样反馈的高电平的宽度,单位us
float S=IntervalTime/58.00; //使用浮点计算出距离,单位cm
S=USART_receive();
USART_transmit(S);


S=0;
IntervalTime=0;//对应的数值清零。
delay(1000);//延时间隔决定采样的频率,根据实际需要变换参数
key=getkey();
} while(key!='*');
}

if(key=='*')
{
// 清屏
lcd.clear();
}
}
//读取键值程序
char getkey()
{
char key = 0;
for(int column = 0;column < numCols; column++)
{
digitalWrite(colPins[column],LOW);
for(int row = 0 ;row < numRows; row++)
{
if(digitalRead(rowPins[row]) == LOW)
{ //是否有按键按下
delay(debounceTime);
if(digitalRead(rowPins[row]) == LOW)
{ //是否有按键按下
delay(debounceTime);
while(digitalRead(rowPins[row]) == LOW) //等待按键释放
;
key = keymap[row][column];
}
}
}
digitalWrite(colPins[column],HIGH); //恢复高电平
}
return key;
}
求大神!

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

364

帖子

2

粉丝