单片机 摩尔斯电码

把字符转为摩斯电码 每个点或者横之后我们需要输出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++;}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部