分解12/29/2009 输出:29th Dec 2009

本文介绍了一个简单的Java程序,该程序能够将一系列短日期格式(月/日/年)的数据转换为更易读的形式,包括全称月份、特定日期序数(如1st、2nd等)及完整年份。

class date{
 public static void main(String[] args){
  int i=0;
  int j=0;
  String daya = "";//存储天
  String month ="";//存储月
  String year ="";//存储年
  String[] dates = {"07/01/07","09/09/09","07/27/99","12/30/89"};
  
  for(i=0;i<dates.length;i++){

   System.out.println("<----第"+(i+1)+"组---->");
   System.out.println("dates["+i+"]"+dates[i]);
  String[] day = dates[i].split("[/]");
  for (j=0;j<day.length;j++){
  System.out.println("day["+j+"]"+day[j]);
  
  }
  
  //day[0]为月份,将其转换为对应的月份
  if (Integer.parseInt(day[0])<=12 && Integer.parseInt(day[0])>0){//Integer.parseInt(string s)将s强制转换为数字
         String[] months={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
         month = months[Integer.parseInt(day[0])-1];
         System.out.print(month+"  ");
   }
  
  //day[1]为天,将其转换为对应的天,其中一号二号三号为1st,2nd,3rd,其余加st
  if (Integer.parseInt(day[1])<31 && Integer.parseInt(day[1])>=3){
   
   daya = day[1]+"th";
   
  }else{
   if(Integer.parseInt(day[1])==1){daya="1st";}else{
    if(Integer.parseInt(day[1])==2){daya="2nd";}else{
     if(Integer.parseInt(day[1])==3){daya="3rd";}
    }
   
    }
   }
  System.out.print(daya+"  ");
  
  //day[2]为年,将其转换为2009,1999,如果day[2]<10,则输出200day[2],若day[2]>90,则输出19day[2]
  if(Integer.parseInt(day[2])>80 && Integer.parseInt(day[2])<100){
   year = "19"+day[2];
  }else{
   if(Integer.parseInt(day[2])<10 && Integer.parseInt(day[2])>=0){
    year = "20"+day[2];
   }
  }
  
  System.out.println(year+"  ");
  System.out.println(daya+" "+month+" "+year);
  
  }  
 }
}

 

运行结果:

<----第1组---->
dates[0]07/01/07
day[0]07
day[1]01
day[2]07
Jul  1st  2007 
1st Jul 2007
<----第2组---->
dates[1]09/09/09
day[0]09
day[1]09
day[2]09
Sep  09th  2009 
09th Sep 2009
<----第3组---->
dates[2]07/27/99
day[0]07
day[1]27
day[2]99
Jul  27th  1999 
27th Jul 1999
<----第4组---->
dates[3]12/30/89
day[0]12
day[1]30
day[2]89
Dec  30th  1989 
30th Dec 1989

#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int // 定义数码管段码表(共阳极数码管) code uchar seg_table[] = { 0xC0, 0xF9, 0xA4, 0xB0, // 0-3 0x99, 0x92, 0x82, 0xF8, // 4-7 0x80, 0x90, 0x88, 0x83, // 8-9,A-B 0xC6, 0xA1, 0x86, 0x8E // C-D-E-F }; // 定义按键端口 sbit KEY_MODE = P3^2; // 模式切换键 sbit KEY_INC = P3^3; // 增加键 sbit KEY_DEC = P3^4; // 减少键 sbit KEY_CTRL = P3^5; // 控制键(暂停/启动/清零) // 定义全局变量 uchar hour = 23; // 小时 uchar minute = 59; // 分钟 uchar second = 50; // 秒 uchar mode = 0; // 模式:0-正常显示,1-调时,2-调分,3-调秒 uchar flash_flag = 0; // 闪烁标志 uchar run_flag = 1; // 运行标志:1-运行,0-暂停 uint count = 0; // 定时器计数 // 函数声明 void Delay_ms(uint ms); void Display_Time(void); void Key_Scan(void); void Timer0_Init(void); // 延时函数 void Delay_ms(uint ms) { uint i, j; for(i = 0; i < ms; i++) for(j = 0; j < 123; j++); } // 数码管显示函数 void Display_Time(void) { uchar hour_h, hour_l, min_h, min_l, sec_h, sec_l; // 分解时间数据 hour_h = hour / 10; hour_l = hour % 10; min_h = minute / 10; min_l = minute % 10; sec_h = second / 10; sec_l = second % 10; // 显示小时十位 P2 = 0x01; // 位选(共阳极数码管位选为低电平有效) if(mode != 1 || flash_flag) P0 = seg_table[hour_h]; else P0 = 0xFF; // 熄灭(共阳极数码管全高电平熄灭) Delay_ms(2); // 显示小时个位 P2 = 0x02; // 位选 if(mode != 1 || flash_flag) P0 = seg_table[hour_l]; else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示'-' P2 = 0x04; // 位选 if(mode == 0 && flash_flag) P0 = 0xBF; // '-'(共阳极数码管段码) else if(mode != 0) P0 = 0xBF; // '-' else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示分钟十位 P2 = 0x08; // 位选 if(mode != 2 || flash_flag) P0 = seg_table[min_h]; else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示分钟个位 P2 = 0x10; // 位选 if(mode != 2 || flash_flag) P0 = seg_table[min_l]; else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示'-' P2 = 0x20; // 位选 if(mode == 0 && flash_flag) P0 = 0xBF; // '-' else if(mode != 0) P0 = 0xBF; // '-' else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示秒十位 P2 = 0x40; // 位选 if(mode != 3 || flash_flag) P0 = seg_table[sec_h]; else P0 = 0xFF; // 熄灭 Delay_ms(2); // 显示秒个位 P2 = 0x80; // 位选 if(mode != 3 || flash_flag) P0 = seg_table[sec_l]; else P0 = 0xFF; // 熄灭 Delay_ms(2); } // 按键扫描函数 void Key_Scan(void) { static uchar key_mode_state = 0; static uchar key_inc_state = 0; static uchar key_dec_state = 0; static uchar key_ctrl_state = 0; // 模式切换键检测 if(KEY_MODE == 0) { Delay_ms(10); // 消抖 if(KEY_MODE == 0 && key_mode_state == 0) { key_mode_state = 1; mode = (mode + 1) % 4; // 循环切换模式:0->1->2->3->0 } } else { key_mode_state = 0; } // 增加键检测 if(KEY_INC == 0) { Delay_ms(10); // 消抖 if(KEY_INC == 0 && key_inc_state == 0) { key_inc_state = 1; switch(mode) { case 1: hour = (hour + 1) % 24; break; // 调时 case 2: minute = (minute + 1) % 60; break; // 调分 case 3: second = (second + 1) % 60; break; // 调秒 } } } else { key_inc_state = 0; } // 减少键检测 if(KEY_DEC == 0) { Delay_ms(10); // 消抖 if(KEY_DEC == 0 && key_dec_state == 0) { key_dec_state = 1; switch(mode) { case 1: hour = (hour + 23) % 24; break; // 调时 case 2: minute = (minute + 59) % 60; break; // 调分 case 3: second = (second + 59) % 60; break; // 调秒 } } } else { key_dec_state = 0; } // 控制键检测(暂停/启动/清零) if(KEY_CTRL == 0) { Delay_ms(10); // 消抖 if(KEY_CTRL == 0 && key_ctrl_state == 0) { key_ctrl_state = 1; if(mode == 0) { // 只有在正常显示模式下才能控制计时 if(run_flag == 1) { run_flag = 0; // 暂停计时 } else { run_flag = 1; // 恢复计时 } } else { // 在设置模式下按控制键清零 hour = 0; minute = 0; second = 0; } } } else { key_ctrl_state = 0; } } // 定时器0初始化函数 void Timer0_Init(void) { TMOD |= 0x01; // 设置定时器0为模式1(16位定时器) TH0 = 0xFC; // 定时初值高8位,定时1ms TL0 = 0x66; // 定时初值低8位 ET0 = 1; // 使能定时器0中断 EA = 1; // 开总中断 TR0 = 1; // 启动定时器0 } // 定时器0中断服务函数 void Timer0_ISR(void) interrupt 1 { TH0 = 0xFC; // 重新加载初值 TL0 = 0x66; count++; if(count >= 500) { // 500ms count = 0; flash_flag = !flash_flag; // 闪烁标志取反 if(run_flag && mode == 0) { // 只有在运行且正常显示模式下才计时 second++; if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; } } } } } } // 主函数 void main(void) { Timer0_Init(); // 初始化定时器0 while(1) { Display_Time(); // 显示时间 Key_Scan(); // 扫描按键 } }该代码如何连接
06-26
#include "STC8H.h" #include <stdio.h> #include <intrins.h> /*************** 系统配置 ***************/ #define SYS_CLK 24000000UL // 系统时钟24MHz #define PWM_FREQ 1000 // PWM频率1kHz #define PWM_PERIOD (SYS_CLK / PWM_FREQ / 12) // 定时器计数周期 #define ADC_BITS 10 // 10位ADC模式 #define ADC_MAX ((1 << ADC_BITS) - 1) // 最大值1023 #define FILTER_A 0.3f // 一阶滞后滤波系数 #define SAMPLE_SIZE 8 // 移动平均窗口大小 #define ALARM_LOW 200 // ADC低阈值(约0.6V@3.3V) #define ALARM_HIGH 800 // ADC高阈值(约2.5V@3.3V) typedef unsigned char uint8_t; typedef unsigned int uint16_t; typedef unsigned long uint32_t; /*************** 硬件定义 ***************/ sbit PWM0 = P1^2; // PWM输出通道0 sbit PWM1 = P1^4; // PWM输出通道1 sbit KEY_SW = P3^7; // PWM通道切换按键 sbit KEY_DEC = P3^4; // 减少档位按键 sbit KEY_INC = P3^5; // 增加档位按键 sbit LED_ALARM = P3^2; // 报警LED sbit BEEP = P3^3; // 蜂鸣器 /*************** 全局变量 ***************/ volatile uint8_t current_pwm = 0; // 当前PWM通道(0=P1.2, 1=P1.4) volatile uint8_t current_level = 1; // 当前档位(0-2) volatile uint16_t adc_results[3]; // 滤波后ADC值(通道0/1/15) volatile uint8_t alarm_status = 0; // 报警状态(0=无,1=低,2=高,3=故障) // PWM档位占空比(25%/50%/75%) const uint16_t pwm_duty[3] = {PWM_PERIOD/4, PWM_PERIOD/2, PWM_PERIOD*3/4}; /*************** 函数声明 ***************/ void System_Init(void); void PWM_Init(void); void ADC_Init(void); void UART_Init(void); void Key_Scan(void); uint16_t ADC_Read(uint8_t channel); uint16_t Moving_Average(uint8_t ch, uint16_t new_val); void ADC_Process(void); void Alarm_Check(void); void UART_SendString(char *s); void delay_ms(uint16_t ms); /*************** 主函数 ***************/ void main() { System_Init(); UART_SendString("STC8H1K08 PWM+ADC System Ready\r\n"); while(1) { Key_Scan(); // 按键扫描(PWM控制) ADC_Process(); // ADC采样与滤波 Alarm_Check(); // 阈值检测与报警 // 串口输出状态 char buf[128]; sprintf(buf, "PWM%d Lv%d | ADC0:%04u ADC1:%04u ADC15:%04u | Alarm:%d\r\n", current_pwm+1, current_level+1, adc_results[0], adc_results[1], adc_results[2], alarm_status); UART_SendString(buf); delay_ms(100); // 控制刷新速率 } } /*************** 系统初始化 ***************/ void System_Init() { // 时钟配置 IRC24MCR = 0x80; // 启用内部24MHz时钟 while (!(IRC24MCR & 0x01)); // 等待时钟稳定 // IO配置 P1M0 = 0x14; // P1.2/P1.4推挽输出(PWM) P1M1 = 0x00; P3M0 = 0x0C; // P3.2/P3.3推挽输出(报警) P3M1 = 0xC0; // P3.6/P3.7准双向 // 外设初始化 PWM_Init(); ADC_Init(); UART_Init(); EA = 1; // 全局中断使能 } /*************** PWM功能 ***************/ void PWM_Init() { // 定时器0配置 TMOD &= 0xF0; // 清除T0控制位 TMOD |= 0x01; // T0模式1,16位定时器 TH0 = (65536 - PWM_PERIOD) >> 8; TL0 = (65536 - PWM_PERIOD) & 0xFF; TR0 = 1; // 启动定时器 ET0 = 1; // 使能定时器中断 // 初始PWM输出 if(current_pwm == 0) { PWM1 = 0; PWM0 = 1; // 开启P1.2,关闭P1.4 } else { PWM0 = 0; PWM1 = 1; // 开启P1.4,关闭P1.2 } } // 定时器0中断服务函数 void Timer0_ISR() interrupt 1 { static uint16_t pwm_count = 0; TH0 = (65536 - PWM_PERIOD) >> 8; // 重装定时器 TL0 = (65536 - PWM_PERIOD) & 0xFF; // PWM波形生成 pwm_count++; if(pwm_count >= PWM_PERIOD) pwm_count = 0; if(current_pwm == 0) { // P1.2输出 PWM0 = (pwm_count < pwm_duty[current_level]) ? 1 : 0; } else { // P1.4输出 PWM1 = (pwm_count < pwm_duty[current_level]) ? 1 : 0; } } /*************** ADC功能 ***************/ void ADC_Init() { // 配置ADC引脚(P1.0/P1.1高阻输入,P3.6高阻) P1M1 |= 0x03; // P1.0/P1.1高阻 P1M0 &= ~0x03; P3M1 |= 0x40; // P3.6高阻 // ADC配置:右对齐,时钟=sysclk/16 ADCCFG = 0x0F; ADC_CONTR = 0x90; // 开启ADC电源+10位模式 _nop_(); _nop_(); // 延时稳定 } uint16_t ADC_Read(uint8_t channel) { ADC_CONTR = (ADC_CONTR & 0xF0) | channel; // 选择通道 ADC_CONTR |= 0x40; // 启动转换 while (!(ADC_CONTR & 0x20)); // 等待完成 ADC_CONTR &= ~0x20; // 清除标志 return (ADC_RES << 2) | (ADC_RESL >> 6); // 合并10位数据 } uint16_t Moving_Average(uint8_t ch, uint16_t new_val) { static uint8_t i; static uint16_t adc_buffer[3][SAMPLE_SIZE] = {0}; static uint8_t buf_index = 0; static uint32_t sum; adc_buffer[ch][buf_index] = new_val; sum = 0; for(i=0; i<SAMPLE_SIZE; i++) { sum += adc_buffer[ch][i]; } buf_index = (buf_index + 1) % SAMPLE_SIZE; return (uint16_t)(sum / SAMPLE_SIZE); } void ADC_Process() { uint16_t raw_adc; static uint16_t filtered_val[3] = {0}; // 采样三路ADC并滤波 raw_adc = ADC_Read(0); // P1.0 adc_results[0] = (uint16_t)(FILTER_A * Moving_Average(0, raw_adc) + (1-FILTER_A) * filtered_val[0]); filtered_val[0] = adc_results[0]; raw_adc = ADC_Read(1); // P1.1 adc_results[1] = (uint16_t)(FILTER_A * Moving_Average(1, raw_adc) + (1-FILTER_A) * filtered_val[1]); filtered_val[1] = adc_results[1]; raw_adc = ADC_Read(15); // P3.6(内部基准) adc_results[2] = (uint16_t)(FILTER_A * Moving_Average(2, raw_adc) + (1-FILTER_A) * filtered_val[2]); filtered_val[2] = adc_results[2]; } /*************** 报警功能 ***************/ void Alarm_Check() { uint8_t i; // 检测通道0和1的ADC值 for( i=0; i<2; i++) { if(adc_results[i] < 5 || adc_results[i] > 1018) { // 硬件故障检测 alarm_status = 3; // 故障报警 break; } else if(adc_results[i] > ALARM_HIGH) { alarm_status = 2; // 高报警 } else if(adc_results[i] < ALARM_LOW) { alarm_status = 1; // 低报警 } else { alarm_status = 0; // 正常 } } // 报警输出控制 switch(alarm_status) { case 3: // 故障报警(持续蜂鸣+LED常亮) LED_ALARM = 0; BEEP = 0; break; case 2: // 高报警(蜂鸣器10Hz闪烁) LED_ALARM = 0; BEEP = (TH0 % 50 < 25) ? 0 : 1; // 10Hz方波 break; case 1: // 低报警(蜂鸣器1Hz闪烁) LED_ALARM = 1; BEEP = (TH0 % 500 < 250) ? 0 : 1; // 1Hz方波 break; default: // 正常状态 LED_ALARM = 1; BEEP = 1; } } /*************** 按键扫描 ***************/ void Key_Scan() { static uint8_t key_state[3] = {0}; static uint8_t key_cnt[3] = {0}; // P3.7检测(PWM通道切换) if(!KEY_SW) { if(key_state[0] == 0 && ++key_cnt[0] >= 5) { key_state[0] = 1; current_pwm ^= 1; // 切换PWM输出引脚 if(current_pwm == 0) { PWM1 = 0; PWM0 = 1; } else { PWM0 = 0; PWM1 = 1; } } } else { key_state[0] = key_cnt[0] = 0; } // P3.5检测(增加档位) if(!KEY_INC && key_state[1] == 0 && ++key_cnt[1] >= 5) { key_state[1] = 1; if(current_level < 2) current_level++; } else if(KEY_INC) { key_state[1] = key_cnt[1] = 0; } // P3.4检测(减少档位) if(!KEY_DEC && key_state[2] == 0 && ++key_cnt[2] >= 5) { key_state[2] = 1; if(current_level > 0) current_level--; } else if(KEY_DEC) { key_state[2] = key_cnt[2] = 0; } } /*************** 串口通信 ***************/ void UART_Init() { SCON = 0x50; // 模式1,8位UART AUXR |= 0x40; // 定时器1使用1T模式 TL1 = 0x8F; // 115200@24MHz TH1 = 0xFD; TR1 = 1; // 启动定时器1 } void UART_SendString(char *s) { while(*s) { SBUF = *s++; while(!TI); TI = 0; } } /*************** 延时函数 ***************/ void delay_ms(uint16_t ms) { uint16_t i, j; for(i=0; i<ms; i++) for(j=0; j<1000; j++); }
09-24
#include "public.h" #include "ds1302.h" #include "key.h" #include "smg.h" #include "time.h" #include "at24c02.h" #include "iic.h" #define ALARM_HOUR_ADDR 0x00 // AT24C02中存储闹钟小时的地址 #define ALARM_MINUTE_ADDR 0x01 // 存储闹钟分钟的地址 #define ALARM_ENABLE_ADDR 0x03 // 存储闹钟使能标志的地址 sbit Buzzer = P3^5; // 系统状态 u8 current_mode = 0; // 0:时间显示, 1:闹钟设置, 2:秒表 u8 set_index = 0; // 设置项索引(0:小时, 1:分钟) u8 sep_time[6]; // 时间分解数组 u8 alarm_hour = 8, alarm_minute = 0; // 闹钟时间 bit alarm_enable = 0; // 闹钟使能 bit in_setting = 0; // 是否在设置状态 bit display_blink = 0; // 显示闪烁标志(初始为0,不闪烁) bit stopwatch_running = 0; // 秒表运行标志 bit stopwatch_reset = 0; // 秒表复位标志 // 秒表变量 u8 stopwatch_hour = 0; u8 stopwatch_minute = 0; u8 stopwatch_second = 0; u16 stopwatch_ms = 0; // 闪烁控制变量 u16 blink_counter = 0; /** * @brief 将时间分解为数码管显示数组 */ void sep_fun() { ds1302_read_time(); sep_time[0] = ds1302_time[0] / 10; // 小时十位 sep_time[1] = ds1302_time[0] % 10; // 小时个位 sep_time[2] = ds1302_time[1] / 10; // 分钟十位 sep_time[3] = ds1302_time[1] % 10; // 分钟个位 sep_time[4] = ds1302_time[2] / 10; // 秒十位 sep_time[5] = ds1302_time[2] % 10; // 秒个位 } /** * @brief 显示时间(修复闪烁问题) */ void show_time() { // 根据当前模式显示不同内容 if (current_mode == 2) { // 秒表模式 sep_time[0] = stopwatch_hour / 10; sep_time[1] = stopwatch_hour % 10; sep_time[2] = stopwatch_minute / 10; sep_time[3] = stopwatch_minute % 10; sep_time[4] = stopwatch_second / 10; sep_time[5] = stopwatch_second % 10; } else if (current_mode == 1 && in_setting) { // 闹钟设置模式 sep_time[0] = alarm_hour / 10; sep_time[1] = alarm_hour % 10; sep_time[2] = alarm_minute / 10; sep_time[3] = alarm_minute % 10; sep_time[4] = 0; // 秒固定显示00 sep_time[5] = 0; } else { // 时间显示模式 sep_fun(); } // 只在设置模式下才闪烁,其他模式不闪烁 if (current_mode == 1 && in_setting) { // 闹钟设置模式:当前设置项闪烁 blink_counter++; if (blink_counter >= 500) { // 大约0.5秒切换一次 blink_counter = 0; display_blink = !display_blink; } // 显示小时(位置0,1) if (set_index == 0) { show(0, display_blink ? sep_time[0] : 12); // 小时闪烁 show(1, display_blink ? sep_time[1] : 12); } else { show(0, sep_time[0]); // 非设置项不闪烁 show(1, sep_time[1]); } // 显示冒号(位置2) show(2, 11); // 显示分钟(位置3,4) if (set_index == 1) { show(3, display_blink ? sep_time[2] : 12); // 分钟闪烁 show(4, display_blink ? sep_time[3] : 12); } else { show(3, sep_time[2]); // 非设置项不闪烁 show(4, sep_time[3]); } } else { // 非设置模式:正常显示,不闪烁 display_blink = 0; // 强制不闪烁 show(0, sep_time[0]); show(1, sep_time[1]); show(2, 11); // 冒号 show(3, sep_time[2]); show(4, sep_time[3]); show(5, 11); // 冒号 show(6, sep_time[4]); show(7, sep_time[5]); } // 显示冒号(位置5) show(5, 11); // 显示秒(位置6,7) - 秒表模式显示秒,其他模式不闪烁 show(6, sep_time[4]); show(7, sep_time[5]); } /** * @brief 保存闹钟设置到EEPROM */ void save_alarm_to_eeprom() { at24c02_write_byte(ALARM_HOUR_ADDR, alarm_hour); at24c02_write_byte(ALARM_MINUTE_ADDR, alarm_minute); at24c02_write_byte(ALARM_ENABLE_ADDR, alarm_enable); delay_ms(10); } /** * @brief 从EEPROM读取闹钟设置 */ void load_alarm_from_eeprom() { alarm_hour = at24c02_read_byte(ALARM_HOUR_ADDR); alarm_minute = at24c02_read_byte(ALARM_MINUTE_ADDR); alarm_enable = at24c02_read_byte(ALARM_ENABLE_ADDR); if (alarm_hour >= 24) alarm_hour = 8; if (alarm_minute >= 60) alarm_minute = 0; } /** * @brief 按键处理函数 * @return 按键模式 */ u8 key_handler() { static bit k1_pressed = 0, k2_pressed = 0, k3_pressed = 0; // K1: 显示时间模式 if (!K1 && !k1_pressed) { delay_ms(10); // 消抖 if (!K1) { k1_pressed = 1; current_mode = 0; in_setting = 0; set_index = 0; display_blink = 0; // 退出设置模式,停止闪烁 Buzzer = 0; // 关闭蜂鸣器 } } else if (K1) { k1_pressed = 0; } // K2: 闹钟设置模式 if (!K2 && !k2_pressed) { delay_ms(10); // 消抖 if (!K2) { k2_pressed = 1; if (current_mode != 1) { current_mode = 1; in_setting = 1; // 进入设置状态 set_index = 0; // 从小时开始设置 display_blink = 1; // 开始闪烁 blink_counter = 0; } else { // 已经在闹钟设置模式,按K2切换设置项 set_index = (set_index + 1) % 2; // 在小时和分钟之间切换 display_blink = 1; // 重置闪烁 blink_counter = 0; } } } else if (K2) { k2_pressed = 0; } // K3: 秒表模式 if (!K3 && !k3_pressed) { delay_ms(10); // 消抖 if (!K3) { k3_pressed = 1; current_mode = 2; in_setting = 0; set_index = 0; display_blink = 0; // 秒表模式不闪烁 Buzzer = 0; // 关闭蜂鸣器 } } else if (K3) { k3_pressed = 0; } // 如果在闹钟设置模式,使用矩阵键盘进行设置 if (current_mode == 1 && in_setting) { u8 key = key_matrix_scan(); if (key != 0xFF) { switch(key) { case 1: // 增加键 if (set_index == 0) { alarm_hour = (alarm_hour + 1) % 24; } else if (set_index == 1) { alarm_minute = (alarm_minute + 1) % 60; } break; case 2: // 减少键 if (set_index == 0) { alarm_hour = (alarm_hour + 23) % 24; } else if (set_index == 1) { alarm_minute = (alarm_minute + 59) % 60; } break; case 3: // 确定/保存键 save_alarm_to_eeprom(); alarm_enable = 1; in_setting = 0; display_blink = 0; // 退出设置,停止闪烁 break; case 4: // 取消键 in_setting = 0; display_blink = 0; // 退出设置,停止闪烁 break; } delay_ms(200); } } return current_mode; } /** * @brief 秒表控制 */ void stopwatch_control() { static bit k3_long_press = 0; static u16 press_time = 0; if (!K3) { press_time++; if (press_time > 50) { // 长按约1秒复位 k3_long_press = 1; } } else { if (k3_long_press) { // 长按:复位秒表 stopwatch_running = 0; stopwatch_reset = 1; stopwatch_hour = 0; stopwatch_minute = 0; stopwatch_second = 0; stopwatch_ms = 0; k3_long_press = 0; } else if (press_time > 0 && press_time <= 20) { // 短按:开始/暂停 stopwatch_running = !stopwatch_running; stopwatch_reset = 0; } press_time = 0; } } /** * @brief 闹钟检查 */ void alarm_check() { if (alarm_enable && current_mode == 0) { // 只在时间显示模式检查闹钟 ds1302_read_time(); if (ds1302_time[0] == alarm_hour && ds1302_time[1] == alarm_minute && ds1302_time[2] == 0) { // 整分触发 static u16 alarm_duration = 0; alarm_duration++; // 闹钟响30秒 if (alarm_duration <= 300) { // 300 * 100ms = 30秒 Buzzer = ~Buzzer; // 蜂鸣器翻转发声 delay_ms(100); } else { Buzzer = 0; alarm_duration = 0; } } } } /** * @brief 定时器0中断服务程序 */ void timer0_isr() interrupt 1 { static u16 ms_counter = 0; // 定时器重装值(根据实际晶振调整) TH0 = 0xFC; TL0 = 0x18; ms_counter++; // 秒表计时 if (stopwatch_running && !stopwatch_reset) { stopwatch_ms++; if (stopwatch_ms >= 100) { // 100ms计数一次 stopwatch_ms = 0; stopwatch_second++; if (stopwatch_second >= 60) { stopwatch_second = 0; stopwatch_minute++; if (stopwatch_minute >= 60) { stopwatch_minute = 0; stopwatch_hour++; if (stopwatch_hour >= 24) { stopwatch_hour = 0; } } } } } // 闪烁控制(独立于主循环) if (current_mode == 1 && in_setting) { if (ms_counter >= 500) { // 500ms切换一次 ms_counter = 0; display_blink = !display_blink; } } } /** * @brief 定时器0初始化 */ void timer0_init() { TMOD &= 0xF0; // 清除T0模式位 TMOD |= 0x01; // 设置T0为模式1(16位定时器) TH0 = 0xFC; // 定时1ms初值(11.0592MHz) TL0 = 0x18; ET0 = 1; // 允许T0中断 TR0 = 1; // 启动T0 EA = 1; // 开总中断 } /** * @brief 主函数 */ void main() { // 初始化各模块 ds1302_init(); timer0_init(); at24c02_init(); Buzzer = 0; // 从EEPROM加载闹钟设置 load_alarm_from_eeprom(); // 设置DS1302初始时间(如果需要) // ds1302_write_time(12, 0, 0); while(1) { // 处理按键 key_handler(); // 根据模式执行相应操作 switch(current_mode) { case 0: // 时间显示模式 show_time(); alarm_check(); // 检查闹钟 break; case 1: // 闹钟设置模式 show_time(); break; case 2: // 秒表模式 show_time(); stopwatch_control(); // 秒表控制 break; } // 短暂延时 delay_ms(10); } } 为什么读取不了时间也没显示
最新发布
12-11
#include "at32f403a_407_conf.h" uint32_t gSysTick = 0; /** * @brief 系统时钟配置:64MHz * @param none * @retval none */ void system_clock_config(void) { crm_reset(); crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE); while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET); crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_16, CRM_PLL_OUTPUT_RANGE_LE72MHZ); crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE); while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET); crm_sysclk_switch(CRM_SCLK_PLL); while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL); crm_ahb_div_set(CRM_AHB_DIV_1); crm_apb2_div_set(CRM_APB2_DIV_2); crm_apb1_div_set(CRM_APB1_DIV_2); system_core_clock_update(); } /** * @brief TMR6初始化:50μs中断周期,用于精准计时 * @param none * @retval none */ void tmr6_init(void) { crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE); tmr_base_init(TMR6, 50 - 1, 64 - 1); // 64MHz/64/50 = 20000Hz(50μs) tmr_cnt_dir_set(TMR6, TMR_COUNT_UP); tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE); nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); nvic_irq_enable(TMR6_GLOBAL_IRQn, 0, 0); tmr_counter_enable(TMR6, TRUE); } /** * @brief TMR6中断服务函数:更新系统计时 * @param none * @retval none */ void TMR6_GLOBAL_IRQHandler(void) { if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET) { gSysTick++; // 每50μs加1 tmr_flag_clear(TMR6, TMR_OVF_FLAG); } } /** * @brief LED引脚初始化:仅GPIOB的6号引脚 * @param none * @retval none */ void led_gpio_init(void) { crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); gpio_init_type gpio_init_struct; gpio_init_struct.gpio_pins = GPIO_PINS_6; gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(GPIOB, &gpio_init_struct); // 初始熄灭LED(置低) gpio_bits_reset(GPIOB, GPIO_PINS_6); } /** * @brief PB6控制:50μs亮、1ms灭 * @param none * @retval none */ void pb6_ctrl(void) { static uint8_t state = 0; // 0:灭 1:亮 static uint32_t tick = 0; if (state == 0) // 灭→亮,持续50μs { gpio_bits_set(GPIOB, GPIO_PINS_6); // 亮 tick = gSysTick; state = 1; } else if (gSysTick - tick >= 1) // 50μs * 1 = 50μs { gpio_bits_reset(GPIOB, GPIO_PINS_6); // 灭 tick = gSysTick; state = 0; } // 灭的持续时间:1ms = 50μs * 20 → 计数20次 if (state == 0 && gSysTick - tick >= 20) { tick = gSysTick; } } int main(void) { system_clock_config(); // 初始化系统时钟 led_gpio_init(); // 初始化PB6引脚 tmr6_init(); // 初始化50μs定时器 while(1) { pb6_ctrl(); // 循环控制PB6亮灭 } } #include "at32f403a_407_conf.h" // 声明外部函数 extern void display_dec_int(int num); extern void display_scan(void); extern void key_gpio_init(void); extern uint8_t key_scan(void); extern void delay_ms(int ms); // 全局计数变量 int num = 0; // 用于自动计数的定时器中断计数变量 static int auto_count_tick = 0; // 自动计数间隔(单位:毫秒,这里设置为1000毫秒即1秒) #define AUTO_COUNT_INTERVAL 1000 // 系统时钟配置 void system_clock_config(void) { crm_reset(); crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE); while (crm_flag_get(CRM_HICK_STABLE_FLAG) != SET); crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_16, CRM_PLL_OUTPUT_RANGE_LE72MHZ); crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE); while (crm_flag_get(CRM_PLL_STABLE_FLAG) != SET); crm_sysclk_switch(CRM_SCLK_PLL); while (crm_sysclk_switch_status_get() != CRM_SCLK_PLL); crm_ahb_div_set(CRM_AHB_DIV_1); crm_apb2_div_set(CRM_APB2_DIV_2); crm_apb1_div_set(CRM_APB1_DIV_2); system_core_clock_update(); } // GPIO初始化(数码管相关) void gpio_pins_init(void) { crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE); gpio_init_type gpio_init_struct; gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; // 配置PE0 - PE7为段码输出 gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7; gpio_init(GPIOE, &gpio_init_struct); // 配置PD2 - PD5为位选输出 gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5; gpio_init(GPIOD, &gpio_init_struct); } // 定时器TMR6初始化,用于数码管动态扫描和自动计数计时 void tmr6_init(void) { crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE); tmr_base_init(TMR6, 1000 - 1, 64 - 1); // 1ms定时 tmr_cnt_dir_set(TMR6, TMR_COUNT_UP); tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE); nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); nvic_irq_enable(TMR6_GLOBAL_IRQn, 0, 0); tmr_counter_enable(TMR6, TRUE); } // TMR6中断服务函数,调用数码管扫描,同时实现自动计数计时 void TMR6_GLOBAL_IRQHandler(void) { if (tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET) { display_scan(); auto_count_tick++; if (auto_count_tick >= AUTO_COUNT_INTERVAL) { auto_count_tick = 0; num++; if (num > 9999) { num = 0; } display_dec_int(num); } tmr_flag_clear(TMR6, TMR_OVF_FLAG); } } int main(void) { uint8_t key_val; // 初始化 system_clock_config(); gpio_pins_init(); tmr6_init(); key_gpio_init(); // 初始显示0 display_dec_int(num); while (1) { // 扫描按键 key_val = key_scan(); if (key_val == 1) { // 按键1按下,减1 num--; if (num < 0) { num = 9999; } display_dec_int(num); } else if (key_val == 2) { // 按键2按下,加1 num++; if (num > 9999) { num = 0; } display_dec_int(num); } } } #include "at32f403a_407_conf.h" // 显示缓冲区,存储4位数码管的段码(共阳极) uint8_t disp_buf[4]; // 共阳极数码管段码表,0 - 9对应的段码 const uint8_t seg_table[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 将整数分解为各位并更新显示缓冲区 void display_dec_int(int num) { disp_buf[0] = seg_table[num / 1000 % 10]; // 千位 disp_buf[1] = seg_table[num / 100 % 10]; // 百位 disp_buf[2] = seg_table[num / 10 % 10]; // 十位 disp_buf[3] = seg_table[num % 10]; // 个位 } // 数码管动态扫描函数,利用定时器中断调用,实现视觉暂留 void display_scan(void) { static uint8_t cur_digit = 0; // 关闭所有位选 gpio_bits_set(GPIOD, GPIO_PINS_2 | GPIO_PINS_3 | GPIO_PINS_4 | GPIO_PINS_5); // 输出当前位的段码 gpio_bits_reset(GPIOE, 0xFF); gpio_bits_set(GPIOE, disp_buf[cur_digit]); // 打开当前位选 gpio_bits_reset(GPIOD, GPIO_PINS_2 << cur_digit); // 切换到下一位 cur_digit = (cur_digit + 1) % 4; } #include "at32f403a_407_conf.h" // 微秒级延时函数 void delay_us(int us) { SysTick->LOAD = system_core_clock / 1000000 * us - 1; SysTick->VAL = 0; SysTick->CTRL = 0x5; while ((SysTick->CTRL & (1 << 16)) == 0); SysTick->CTRL = 0; } // 毫秒级延时函数 void delay_ms(int ms) { for (; ms > 0; ms--) delay_us(1000); } #include "at32f403a_407_conf.h" // 声明全局计数变量,供其他文件修改 extern int num; // 按键消抖延时(单位:毫秒) #define KEY_DELAY_MS 20 // 按键 GPIO 初始化:按键1接PD6,按键2接PD7,上拉输入 void key_gpio_init(void) { // 使能GPIOD时钟 crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE); gpio_init_type gpio_init_struct; gpio_init_struct.gpio_mode = GPIO_MODE_INPUT; gpio_init_struct.gpio_pull = GPIO_PULL_UP; // 配置PD6(按键1)和PD7(按键2)引脚 gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7; gpio_init(GPIOD, &gpio_init_struct); } // 按键消抖函数 uint8_t key_debounce(uint16_t pin) { if (gpio_input_data_bit_read(GPIOD, pin) == RESET) { // 延时消抖 delay_ms(KEY_DELAY_MS); if (gpio_input_data_bit_read(GPIOD, pin) == RESET) { // 等待按键释放 while (gpio_input_data_bit_read(GPIOD, pin) == RESET); return 1; } } return 0; } // 按键扫描函数,返回按键值:1(按键1按下,减1)、2(按键2按下,加1)、0(无按键) uint8_t key_scan(void) { if (key_debounce(GPIO_PINS_6)) { return 1; } else if (key_debounce(GPIO_PINS_7)) { return 2; } return 0; } 在这几个代码的基础上 进行整合修改 要求为 led进行pwm亮灭 数码管同步显示亮度百分比 示例为100.0 99.9 0.0 将第一个代码改为此代码#include "at32f403a_407_conf.h" // 四个LED对应引脚(GPIOB_6~9) #define LED_PINS GPIO_PINS_6 | GPIO_PINS_7 | GPIO_PINS_8 | GPIO_PINS_9 #define LED_PORT GPIOB // 对应TMR4通道(PB6=CH1、PB7=CH2、PB8=CH3、PB9=CH4) #define TMR_CHANNEL1 TMR_SELECT_CHANNEL_1 #define TMR_CHANNEL2 TMR_SELECT_CHANNEL_2 #define TMR_CHANNEL3 TMR_SELECT_CHANNEL_3 #define TMR_CHANNEL4 TMR_SELECT_CHANNEL_4 void gpio_pins_init(void) { // 使能GPIOB时钟 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); gpio_init_type gpio_init_struct; gpio_default_para_init(&gpio_init_struct); // 配置PB6~9为复用模式(TMR4 PWM输出) gpio_init_struct.gpio_pins = LED_PINS; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(LED_PORT, &gpio_init_struct); } void tmr4_pwm_init(void) { uint16_t tmr_pr = 999; // 降低PWM频率,增强亮度变化感知 uint16_t prescaler_value = 0; // 使能TMR4时钟 crm_periph_clock_enable(CRM_TMR4_PERIPH_CLOCK, TRUE); tmr_output_config_type tmr_oc_init_structure; prescaler_value = 0; // TMR4时基配置 tmr_base_init(TMR4, tmr_pr, prescaler_value); tmr_cnt_dir_set(TMR4, TMR_COUNT_UP); tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1); // PWM输出配置(共阳LED:低电平点亮,用ACTIVE_LOW;共阴则改为ACTIVE_HIGH) tmr_output_default_para_init(&tmr_oc_init_structure); tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A; tmr_oc_init_structure.oc_idle_state = FALSE; tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_LOW; tmr_oc_init_structure.oc_output_state = TRUE; // 配置四个通道 tmr_output_channel_config(TMR4, TMR_CHANNEL1, &tmr_oc_init_structure); tmr_output_channel_config(TMR4, TMR_CHANNEL2, &tmr_oc_init_structure); tmr_output_channel_config(TMR4, TMR_CHANNEL3, &tmr_oc_init_structure); tmr_output_channel_config(TMR4, TMR_CHANNEL4, &tmr_oc_init_structure); // 初始熄灭所有LED tmr_channel_value_set(TMR4, TMR_CHANNEL1, 0); tmr_channel_value_set(TMR4, TMR_CHANNEL2, 0); tmr_channel_value_set(TMR4, TMR_CHANNEL3, 0); tmr_channel_value_set(TMR4, TMR_CHANNEL4, 0); // 使能通道缓冲和定时器 tmr_output_channel_buffer_enable(TMR4, TMR_CHANNEL1, TRUE); tmr_output_channel_buffer_enable(TMR4, TMR_CHANNEL2, TRUE); tmr_output_channel_buffer_enable(TMR4, TMR_CHANNEL3, TRUE); tmr_output_channel_buffer_enable(TMR4, TMR_CHANNEL4, TRUE); tmr_period_buffer_enable(TMR4, TRUE); tmr_counter_enable(TMR4, TRUE); } void delay_us(int us) { SysTick->LOAD = us * system_core_clock / 1000000; SysTick->VAL = 0; SysTick->CTRL = 0x5; while ((SysTick->CTRL & (1 << 16)) == 0); SysTick->CTRL = 0; } void delay_ms(int ms) { for (; ms > 0; ms--) delay_us(1000); } // 同步呼吸渐变效果(四个LED同时亮灭,平滑过渡) void sync_breathe_effect(void) { // 同时从灭到最亮(慢渐变) for (int i = 0; i <= 999; i += 2) { tmr_channel_value_set(TMR4, TMR_CHANNEL1, i); tmr_channel_value_set(TMR4, TMR_CHANNEL2, i); tmr_channel_value_set(TMR4, TMR_CHANNEL3, i); tmr_channel_value_set(TMR4, TMR_CHANNEL4, i); delay_ms(2); } delay_ms(400); // 保持最亮状态 // 同时从最亮到灭(慢渐变) for (int i = 999; i >= 0; i -= 2) { tmr_channel_value_set(TMR4, TMR_CHANNEL1, i); tmr_channel_value_set(TMR4, TMR_CHANNEL2, i); tmr_channel_value_set(TMR4, TMR_CHANNEL3, i); tmr_channel_value_set(TMR4, TMR_CHANNEL4, i); delay_ms(2); } delay_ms(400); // 保持熄灭状态 } int main(void) { gpio_pins_init(); tmr4_pwm_init(); // 循环执行同步呼吸渐变 for (;;) { sync_breathe_effect(); } } 摈弃第一个代码的示例
11-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值