单片机 摩尔斯电码
把字符转为摩斯电码 每个点或者横之后我们需要输出500毫秒延时,让小灯关闭;点是小灯亮500毫秒,横是小灯亮1500毫秒;一个英文的字符完成摩尔斯电码,表示之后需要有1.5秒的小灯关闭时间。
enum LED {Red = 0, Green, Blue, Yellow, Cyan, Magenta, END
};enum LED led_x = Yellow; //修改颜色const unsigned char fixed_string[50] = "Hello World";//A ·- B -··· C -·-· D -·· E · F ··-· G --·
//H ···· I ·· J ·--- K -·- L ·-·· M -- N -·
//O --- P ·--· Q --·- R ·-· S ··· T - U ··-
//V ···- W ·-- X -··- Y -·-- Z --··
//1 ·---- ·- 2 ··--- ··- 3 ···-- ···- 4 ····- ····- 5 ····· ·····
//6 -···· -···· 7 --··· -··· 8 ---·· -·· 9 ----· -· 0 ----- -
//摩斯电码 用1表示点 用2表示横线 每个字母用五个unsigned char,不足5个就写0
const unsigned char mosidianma[36 * 5] = {
//A1, 2, 0, 0, 0,//B2, 1, 1, 1, 0,//C2, 1, 2, 1, 0,//D2, 1, 1, 0, 0,//E1, 0, 0, 0, 0,//F1, 1, 2, 1, 0,//G2, 2, 1, 0, 0,//H1, 1, 1, 1, 0,//I1, 1, 0, 0, 0,//J1, 2, 2, 2, 0,//K2, 1, 2, 0, 0,//L1, 2, 1, 1, 0,//M2, 2, 0, 0, 0,//N2, 1, 0, 0, 0,//O2, 2, 2, 0, 0,//P1, 2, 2, 1, 0,//Q2, 2, 1, 2, 0,//R1, 2, 1, 0, 0,//S1, 1, 1, 0, 0,//T2, 0, 0, 0, 0,//U1, 1, 2, 0, 0,//V1, 1, 1, 2, 0,//W1, 2, 2, 0, 0,//X2, 1, 1, 2, 0,//Y2, 1, 2, 2, 0,//Z2, 2, 1, 1, 0,//02, 2, 2, 2, 2,//11, 2, 2, 2, 2,//21, 1, 2, 2, 2,//31, 1, 1, 2, 2,//41, 1, 1, 1, 2,//51, 1, 1, 1, 1,//62, 1, 1, 1, 1,//72, 2, 1, 1, 1,//82, 2, 2, 1, 1,//92, 2, 2, 2, 1 };void light_led(enum LED led, uint32_t PulseOffset) {if (led == Red) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel,PulseOffset);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel, 0);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel, 0);} else if (led == Green) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel, 0);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel,PulseOffset);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel, 0);} else if (led == Blue) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel, 0);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel, 0);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel,PulseOffset);} else if (led == Yellow) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel,PulseOffset);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel,PulseOffset);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel, 0);} else if (led == Cyan) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel, 0);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel,PulseOffset);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel,PulseOffset);} else if (led == Magenta) {PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, RedChannel,PulseOffset);PWMTimerRG_SetOffsetTicks(PWMTimerRG_DeviceData, GreenChannel, 0);PWMTimerB_SetOffsetTicks(PWMTimerRG_DeviceData, BlueChannel,PulseOffset);}}//把字符转为摩斯电码 每个点或者横之后我们需要输出500毫秒延时,让小灯关闭;点是小灯亮500毫秒,横是小灯亮1500毫秒;一个英文的字符完成摩尔斯电码,表示之后需要有1.5秒的小灯关闭时间。
unsigned char convert_to_morse(unsigned char c) {unsigned char morse = 0;unsigned char i;unsigned char index = 0;unsigned char *p = NULL;if (c >= 'A' && c <= 'Z') {index = c - 'A';} else if (c >= '0' && c <= '9') {index = c - '0' + 26;} else if (c >= 'a' && c <= 'z') {index = c - 'a';} else {return 0;}p = (unsigned char *) mosidianma + index * 5;for (i = 0; i < 5; i++) {if (p[i] == 1) {light_led(led_x, 9900);delay_ms(500);light_led(led_x, 0);delay_ms(500);} else if (p[i] == 2) {light_led(led_x, 9900);delay_ms(1500);light_led(led_x, 0);delay_ms(500);} else if (p[i] == 0) {break;}}delay_ms(1500); //表示之后需要有1.5秒的小灯关闭时间return morse;
}
调用:
fixed_string_size = 0;while (fixed_string[fixed_string_size] != '\0') {//摩尔斯电码convert_to_morse(fixed_string[fixed_string_size]);fixed_string_size++;}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
