代码
本文最后更新于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;
}
文章 代码 由 Axeuh 撰写
上一篇
下一篇