本文最后更新于171 天前,如有错误请发送邮件到2176284372@qq.com
#include "iocc2530.h"
#define LED1 P1_0
#define KEY1 P0_1
#define KEY2 P0_2
// 初始化LED
void intled()
{
P1SEL &= ~0x01; // P1_0作为GPIO
P1DIR |= 0x01; // P1_0输出方向
LED1 = 0; // 初始关闭LED
}
// 初始化按键1
void intkey1()
{
P0SEL &= ~0x02; // P0_1作为GPIO
P0DIR &= ~0x02; // P0_1输入方向
}
// 初始化按键2
void intkey2()
{
P0SEL &= ~0x04; // P0_2作为GPIO
P0DIR &= ~0x04; // P0_2输入方向
}
// 延时函数
void delay(unsigned int ms)
{
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 535; j++);
}
// 初始化系统时钟 - 使用内部16MHz RC振荡器
void initClock()
{
SLEEPCMD &= ~0x04; // 开启晶振
while(!(SLEEPSTA & 0x40)); // 等待晶振稳定
CLKCONCMD = 0x80; // 32MHz XOSC
while(CLKCONSTA & 0x40); // 等待时钟切换完成
}
// 初始化UART - 使用更可靠的配置
void initUART()
{
// 配置UART0使用备用位置1 (P0_2->RX, P0_3->TX)
PERCFG = 0x00; // UART0在位置0 (P0_2和P0_3)
P0SEL |= 0x0C; // P0_2和P0_3用作外设功能
// 配置UART参数 - 使用9600波特率,更稳定
U0CSR |= 0x80; // UART模式
// 9600波特率计算: 32MHz系统时钟
// 公式: BAUD_M = 255 - (F/(2^(BAUD_E-1)*8*BAUD_RATE))
// 这里使用预计算值
U0GCR = 10; // BAUD_E = 10
U0BAUD = 131; // BAUD_M = 131, 9600波特率
// 115200波特率配置(如果9600不行,可以尝试这个)
// U0GCR = 11; // BAUD_E = 11
// U0BAUD = 216; // BAUD_M = 216, 115200波特率
UTX0IF = 0; // 清除发送中断标志
}
// 发送单个字符
void uartSendChar(char c)
{
U0DBUF = c; // 写入发送缓冲区
while(!UTX0IF); // 等待发送完成
UTX0IF = 0; // 清除发送完成标志
delay(1); // 短暂延时确保字符发送完成
}
// 发送字符串
void uartSendString(char *str)
{
while(*str)
{
uartSendChar(*str);
str++;
}
}
int main(void)
{
// 初始化各模块
intled();
intkey1();
intkey2();
initClock();
initUART();
// 发送简单的测试字符
uartSendChar('S');
uartSendChar('T');
uartSendChar('A');
uartSendChar('R');
uartSendChar('T');
uartSendChar('\r');
uartSendChar('\n');
while(1)
{
delay(10); // 基本延时
// 检测按键1
if(KEY1 == 0)
{
delay(20); // 去抖
if(KEY1 == 0)
{
uartSendChar('1'); // 发送字符'1'
LED1 = !LED1; // 切换LED
while(KEY1 == 0); // 等待释放
delay(100);
}
}
// 检测按键2
if(KEY2 == 0)
{
delay(20); // 去抖
if(KEY2 == 0)
{
uartSendChar('2'); // 发送字符'2'
LED1 = !LED1; // 切换LED
while(KEY2 == 0); // 等待释放
delay(100);
}
}
}
return 0;
}
