当前位置:   article > 正文

2024新年快乐_用c语言制作新年贺卡

用c语言制作新年贺卡

前言

2023年马上就要过去,希望2024年会越来越好,根据自己学的内容来实现一些我的idea。

单片机

思路

最开始的构思是这样的,“2024”用数码管来输出然后中文的“新年快乐”用点阵来实现,但是点阵是动态的截图不好看,就想干脆用LCD1602输出英文的新年快乐算了,这样就只需要一个AT89C51就行了,还剩下五根引脚,想起来过年我印象中听过最多的歌是“好运来”就想增加一个蜂鸣器来播放好运来歌曲,大致的构思出的原理图如下,实验所需器件在代码后面。

3b046931d58a4e96bb4c4270e571139d.png

 2024

首先是对2024的输出,这个就是输出他的BCD码。这个网络标号最开始就是C0在上面,输出的时候发现不对,然后就反过来标记,算是蒙对的。

  1. #include<reg51.h>
  2. void main(void){
  3. while(1){
  4. //2024 0010 0000 0010 0100
  5. P1=0x20;
  6. P3=0x24;
  7. }
  8. }

7fc401bec8ca423bb6a96788a6772d5c.png

Happy New Year 

LCD 1602输出我们没必要重新书写代码,只需要修改之后的代码即可。顺便对输出“2024”部分封装成函数。字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)_1602液晶显示电路在keli中名称-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134224776

  1. #include<reg51.h>
  2. #include<intrins.h> //包含_nop_()空函数指令的头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define out P0
  6. sbit RS=P2^0;//位变量
  7. sbit RW=P2^1;//位变量
  8. sbit E=P2^2;//位变量
  9. //函数声明部分
  10. void lcd_initial(void);//LCD初始化函数
  11. void check_busy(void);//检查忙标志位函数
  12. void write_command(uchar com);//写命令函数
  13. void write_data(uchar dat);//写数据函数
  14. void string(uchar ad,uchar *s);//显示字符串
  15. void delay(uint);//延时
  16. void print_LED();//输出“2024”的数码管
  17. void main(void){
  18. lcd_initial();//对LCD初始化
  19. while(1){
  20. print_LED();
  21. string(0x81,"Happy New Year");//显示第一行的字符
  22. string(0xC1,"peace happiness");//显示第二行的字符
  23. delay(100);//延时
  24. write_command(0x01);//清屏
  25. delay(100);//延时
  26. }
  27. }
  28. //延时
  29. void delay(uint j){
  30. uchar i=250;
  31. for(;j>0;j--){
  32. while(--i);
  33. i=249;
  34. while(--i);
  35. i=250;
  36. }
  37. }
  38. //检查忙标志
  39. void check_busy(void){
  40. uchar dt;
  41. do{
  42. dt=0xff;//dt为变量单元,初值为0xff
  43. //RS=0,E=1时才可以读忙标志位
  44. E=0;
  45. RS=0;
  46. RW=1;
  47. E=1;
  48. dt=out;//out为P0口,P0口的状态送入dt中
  49. }while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0
  50. E=0;//BF=0,LCD 1602不忙,结束检测
  51. }
  52. //写命令
  53. void write_command(uchar com){
  54. check_busy();
  55. //按规定RS和E同时为0时,才可以写命令
  56. E=0;
  57. RS=0;
  58. RW=0;
  59. out=com;//将命令com写入P0口
  60. E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0
  61. _nop_();//空操作1个机器周期,等待硬件反应
  62. E=0;//E由高电平变为低电平,LCD 1602开始执行命令
  63. delay(1);//延时,等待硬件反应
  64. }
  65. //写数据
  66. void write_data(uchar dat){
  67. check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令
  68. E=0;//按规定写数据时,E应为正脉冲,所以先置E=0
  69. //按规定RS=1和RW=0时,才可以写入数据
  70. RS=1;
  71. RW=0;
  72. out=dat;//将数据”dat“从P0口输出,即写入LCD 1602
  73. E=1;//E产生正跳变
  74. _nop_();//空操作1个机器周期,等待硬件反应
  75. E=0;//E由高电平变为低电平,写数据操作结束
  76. delay(1);
  77. }
  78. //液晶显示器初始化函数
  79. void lcd_initial(void){
  80. write_command(0x38);//8位两行显示,5*7点阵字符
  81. _nop_();//空操作1个机器周期,等待硬件反应
  82. write_command(0x0C);//开整体显示,光标关,无闪烁
  83. _nop_();//空操作1个机器周期,等待硬件反应
  84. //write_command(0x05);//光标右移
  85. _nop_();//空操作1个机器周期,等待硬件反应
  86. write_command(0x01);//清屏
  87. delay(1);
  88. }
  89. //输出显示字符串
  90. void string(uchar ad,uchar *s){
  91. write_command(ad);
  92. while(*s>0){
  93. write_data(*s++);//输出字符串,且指针增1
  94. delay(100);
  95. }
  96. }
  97. void print_LED(){//输出“2024”的数码管
  98. //2024 0010 0000 0010 0100
  99. P1=0x20;
  100. P3=0x24;
  101. }

116ae46585cf41c8ad177c7fd68b2196.png

 好运来

先找到“好运来”的音乐简谱,然后带入之前的代码中。

e49385ca9d264f47ae832dc45c3ea91d.png

2ebf477100524be49a0140e910cdae88.png

单片机实验(三)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_64066303/article/details/134624276

  1. #include<reg51.h>
  2. #include<intrins.h> //包含_nop_()空函数指令的头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define out P0
  6. #define L1 1
  7. #define L1_ 2
  8. #define L2 3
  9. #define L2_ 4
  10. #define L3 5
  11. #define L4 6
  12. #define L4_ 7
  13. #define L5 8
  14. #define L5_ 9
  15. #define L6 10
  16. #define L6_ 11
  17. #define L7 12
  18. #define M1 13
  19. #define M1_ 14
  20. #define M2 15
  21. #define M2_ 16
  22. #define M3 17
  23. #define M4 18
  24. #define M4_ 19
  25. #define M5 20
  26. #define M5_ 21
  27. #define M6 22
  28. #define M6_ 23
  29. #define M7 24
  30. #define H1 25
  31. #define H1_ 26
  32. #define H2 27
  33. #define H2_ 28
  34. #define H3 29
  35. #define H4 30
  36. #define H4_ 31
  37. #define H5 32
  38. #define H5_ 33
  39. #define H6 34
  40. #define H6_ 35
  41. #define H7 36
  42. #define ClockSpeed 12000000 //时钟频率,Hz
  43. #define SongSpeed 240 //ms,八分音符
  44. sbit beepIO = P2^7; //定义蜂鸣器IO口
  45. uchar freq_select;
  46. //音阶频率表
  47. unsigned int code freq_table[]={0,61714 ,61928 ,62131 ,62322 ,62502 ,62673 ,62833 ,62985 ,63128 ,63263 ,63391 ,63511, //低音
  48. 63628 ,63731 ,63835 ,63928 ,64021 ,64103 ,64185 ,64260 ,64331 ,64400 ,64463 ,64524, //中音
  49. 64580 ,64633 ,64684 ,64732 ,64777 ,64820 ,64860 ,64898 ,64934 ,64968 ,65000 ,65030 //高音
  50. };
  51. //好运来
  52. uchar code song[]={
  53. //叠个千纸鹤 再系个红腰带
  54. M6,3, M6,1, H1,1, H1,1, M6,3, M6,1, M5,1, M3,1, M5,1, H1,1, M6,2, 0,2,
  55. //愿善良的人们 天天好运来.你
  56. M6,1, H1,1, H1,1, H1,1, H1,2, M5,2, M6,1, M5,1, M2,1, M5,1, M3,3, M2,1,
  57. //勤劳生活美,你健康春常在
  58. M3,1, M2,1, M1,1, M3,1, M2,3, M3,1, M6,1, M5,1, M3,1, M6,1, M6,1, M5,3,
  59. //你一生的忙碌为了笑逐颜开。
  60. M6,1, H1,1, H1,3, M6,1, H2,1, H2,1, H2,1, H1,1, M6,2, M5,1, H1,1, M6,4, M6,3,
  61. //好运来,祝你好运来,好运
  62. M6,2, H3,3, H2,1, H2,2, H1,1, M6,1, M5,2, H1,2, M6,4, M6,2, H2,2,
  63. //带来了喜和爱。好运
  64. H1,2, M6,1, M5,1, M2,2, M5,1, M6,1, M5,1, M3,3, M3,2, M6,3, M5,1,
  65. //来,我们好运来,迎着好运来
  66. M6,2, M6,1, M5,1, M6,2, H2,3, H1,1, H2,4, H1,3, H1,1, H1,1, H2,1,
  67. //兴旺发达通四海。
  68. H3,1, H3,1, H2,1, H1,1, M5,2, H1,3, M6,1, M6,2,
  69. 40
  70. };
  71. sbit RS=P2^0;//位变量
  72. sbit RW=P2^1;//位变量
  73. sbit E=P2^2;//位变量
  74. //函数声明部分
  75. void lcd_initial(void);//LCD初始化函数
  76. void check_busy(void);//检查忙标志位函数
  77. void write_command(uchar com);//写命令函数
  78. void write_data(uchar dat);//写数据函数
  79. void string(uchar ad,uchar *s);//显示字符串
  80. void delay(uint);//延时
  81. void print_2024();//输出“2024”的数码管
  82. void print_HappyNewYear();//输出“新年快乐”的LCD 1602
  83. void timer0_initial();//初始化定时器0的状态
  84. void delay_ms(unsigned int x); //音乐延时函数
  85. void main(void){
  86. uchar select;
  87. timer0_initial();//对定时器T0进行初始化
  88. lcd_initial();//对LCD初始化
  89. print_2024();
  90. print_HappyNewYear();
  91. while(song[select]!= 40) //判断歌曲是否结束
  92. {
  93. freq_select=song[select];
  94. if(freq_select) //判断是否是休止符0
  95. {
  96. select++;
  97. delay_ms(song[select]*SongSpeed);
  98. TR0 = 0; //关闭蜂鸣器一段时间再打开,模拟按键抬手动作。
  99. delay_ms(10);
  100. TR0 = 1;
  101. select++;
  102. }else{
  103. TR0 = 0;
  104. select++;
  105. delay_ms(song[select]*SongSpeed);
  106. TR0 = 1;
  107. select++;
  108. }
  109. }
  110. }
  111. //延时
  112. void delay(uint j){
  113. uchar i=250;
  114. for(;j>0;j--){
  115. while(--i);
  116. i=249;
  117. while(--i);
  118. i=250;
  119. }
  120. }
  121. //检查忙标志
  122. void check_busy(void){
  123. uchar dt;
  124. do{
  125. dt=0xff;//dt为变量单元,初值为0xff
  126. //RS=0,E=1时才可以读忙标志位
  127. E=0;
  128. RS=0;
  129. RW=1;
  130. E=1;
  131. dt=out;//out为P0口,P0口的状态送入dt中
  132. }while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0
  133. E=0;//BF=0,LCD 1602不忙,结束检测
  134. }
  135. //写命令
  136. void write_command(uchar com){
  137. check_busy();
  138. //按规定RS和E同时为0时,才可以写命令
  139. E=0;
  140. RS=0;
  141. RW=0;
  142. out=com;//将命令com写入P0口
  143. E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0
  144. _nop_();//空操作1个机器周期,等待硬件反应
  145. E=0;//E由高电平变为低电平,LCD 1602开始执行命令
  146. delay(1);//延时,等待硬件反应
  147. }
  148. //写数据
  149. void write_data(uchar dat){
  150. check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令
  151. E=0;//按规定写数据时,E应为正脉冲,所以先置E=0
  152. //按规定RS=1和RW=0时,才可以写入数据
  153. RS=1;
  154. RW=0;
  155. out=dat;//将数据”dat“从P0口输出,即写入LCD 1602
  156. E=1;//E产生正跳变
  157. _nop_();//空操作1个机器周期,等待硬件反应
  158. E=0;//E由高电平变为低电平,写数据操作结束
  159. delay(1);
  160. }
  161. //液晶显示器初始化函数
  162. void lcd_initial(void){
  163. write_command(0x38);//8位两行显示,5*7点阵字符
  164. _nop_();//空操作1个机器周期,等待硬件反应
  165. write_command(0x0C);//开整体显示,光标关,无闪烁
  166. _nop_();//空操作1个机器周期,等待硬件反应
  167. //write_command(0x05);//光标右移
  168. _nop_();//空操作1个机器周期,等待硬件反应
  169. write_command(0x01);//清屏
  170. delay(1);
  171. }
  172. //输出显示字符串
  173. void string(uchar ad,uchar *s){
  174. write_command(ad);
  175. while(*s>0){
  176. write_data(*s++);//输出字符串,且指针增1
  177. delay(100);
  178. }
  179. }
  180. void print_2024(){//输出“2024”的数码管
  181. //2024 0010 0000 0010 0100
  182. P1=0x20;
  183. P3=0x24;
  184. }
  185. void print_HappyNewYear(){//输出“新年快乐”的LCD 1602
  186. string(0x81,"Happy New Year");//显示第一行的字符
  187. string(0xC1,"peace happiness");//显示第二行的字符
  188. delay(50);//延时
  189. //write_command(0x01);//清屏
  190. }
  191. void timer0_initial()//初始化定时器0的状态
  192. {
  193. beepIO = 0;
  194. TH0 = 0xFD;
  195. TL0 = 0x09;
  196. TMOD = 0x01; //选择定时器0,工作方式1
  197. ET0 = 1; //允许定时器0中断
  198. EA = 1; //CPU开放中断
  199. TF0 = 0; //溢出标志位清0
  200. TR0 = 1; //开启定时器0
  201. }
  202. void BeepTimer0() interrupt 1 //中断函数
  203. {
  204. beepIO = !beepIO; //蜂鸣器IO口高低电平转换
  205. TH0 = freq_table[freq_select]/256 ;
  206. TL0 = freq_table[freq_select]%256 ;
  207. }
  208. void delay_ms(unsigned int x) //音乐延时函数
  209. {
  210. uchar t;
  211. while(x--) for(t=0;t<120;t++);
  212. }

110b3041fea14a8cad7c689c5c52a302.png

本来觉得影响不大的,但是忽略了音乐的播放是需要延迟来表示每一个音的节拍,所以就把lcd清屏取消了,让他就一直显示这个,目前的话就是一轮之后会重新从主函数开始,而且LCD输出的时候他会发出其他的声音。

所以又继续完善了一下

 代码

  1. #include<reg51.h>
  2. #include<intrins.h> //包含_nop_()空函数指令的头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define out P0
  6. #define L1 1
  7. #define L1_ 2
  8. #define L2 3
  9. #define L2_ 4
  10. #define L3 5
  11. #define L4 6
  12. #define L4_ 7
  13. #define L5 8
  14. #define L5_ 9
  15. #define L6 10
  16. #define L6_ 11
  17. #define L7 12
  18. #define M1 13
  19. #define M1_ 14
  20. #define M2 15
  21. #define M2_ 16
  22. #define M3 17
  23. #define M4 18
  24. #define M4_ 19
  25. #define M5 20
  26. #define M5_ 21
  27. #define M6 22
  28. #define M6_ 23
  29. #define M7 24
  30. #define H1 25
  31. #define H1_ 26
  32. #define H2 27
  33. #define H2_ 28
  34. #define H3 29
  35. #define H4 30
  36. #define H4_ 31
  37. #define H5 32
  38. #define H5_ 33
  39. #define H6 34
  40. #define H6_ 35
  41. #define H7 36
  42. #define ClockSpeed 12000000 //时钟频率,Hz
  43. #define SongSpeed 240 //ms,八分音符
  44. sbit beepIO = P2^7; //定义蜂鸣器IO口
  45. uchar freq_select;
  46. //音阶频率表
  47. unsigned int code freq_table[]={0,61714 ,61928 ,62131 ,62322 ,62502 ,62673 ,62833 ,62985 ,63128 ,63263 ,63391 ,63511, //低音
  48. 63628 ,63731 ,63835 ,63928 ,64021 ,64103 ,64185 ,64260 ,64331 ,64400 ,64463 ,64524, //中音
  49. 64580 ,64633 ,64684 ,64732 ,64777 ,64820 ,64860 ,64898 ,64934 ,64968 ,65000 ,65030 //高音
  50. };
  51. //好运来
  52. uchar code song[]={
  53. //叠个千纸鹤 再系个红腰带
  54. M6,3, M6,1, H1,1, H1,1, M6,3, M6,1, M5,1, M3,1, M5,1, H1,1, M6,2, 0,2,
  55. //愿善良的人们 天天好运来.你
  56. M6,1, H1,1, H1,1, H1,1, H1,2, M5,2, M6,1, M5,1, M2,1, M5,1, M3,3, M2,1,
  57. //勤劳生活美,你健康春常在
  58. M3,1, M2,1, M1,1, M3,1, M2,3, M3,1, M6,1, M5,1, M3,1, M6,1, M6,1, M5,3,
  59. //你一生的忙碌为了笑逐颜开。
  60. M6,1, H1,1, H1,3, M6,1, H2,1, H2,1, H2,1, H1,1, M6,2, M5,1, H1,1, M6,4, M6,3,
  61. //好运来,祝你好运来,好运
  62. M6,2, H3,3, H2,1, H2,2, H1,1, M6,1, M5,2, H1,2, M6,4, M6,2, H2,2,
  63. //带来了喜和爱。好运
  64. H1,2, M6,1, M5,1, M2,2, M5,1, M6,1, M5,1, M3,3, M3,2, M6,3, M5,1,
  65. //来,我们好运来,迎着好运来
  66. M6,2, M6,1, M5,1, M6,2, H2,3, H1,1, H2,4, H1,3, H1,1, H1,1, H2,1,
  67. //兴旺发达通四海。
  68. H3,1, H3,1, H2,1, H1,1, M5,2, H1,3, M6,1, M6,2,
  69. 40
  70. };
  71. sbit RS=P2^0;//位变量
  72. sbit RW=P2^1;//位变量
  73. sbit E=P2^2;//位变量
  74. //函数声明部分
  75. void lcd_initial(void);//LCD初始化函数
  76. void check_busy(void);//检查忙标志位函数
  77. void write_command(uchar com);//写命令函数
  78. void write_data(uchar dat);//写数据函数
  79. void string(uchar ad,uchar *s);//显示字符串
  80. void delay(uint);//延时
  81. void timer0_initial();//初始化定时器0的状态
  82. void delay_ms(unsigned int x); //音乐延时函数
  83. void print_2024();//输出“2024”的数码管
  84. void print_HappyNewYear();//输出“新年快乐”的LCD 1602
  85. void main(void){
  86. print_2024();//输出“2024”的数码管
  87. print_HappyNewYear();//输出“新年快乐”的LCD 1602
  88. //其他的都静态输出即可
  89. while(1){
  90. uchar select=0;//每次重新初始化
  91. timer0_initial();//对定时器T0进行初始化
  92. while(song[select]!= 40) //判断歌曲是否结束
  93. {
  94. freq_select=song[select];
  95. if(freq_select) //判断是否是休止符0
  96. {
  97. select++;
  98. delay_ms(song[select]*SongSpeed);
  99. TR0 = 0; //关闭蜂鸣器一段时间再打开,模拟按键抬手动作。
  100. delay_ms(10);
  101. TR0 = 1;
  102. select++;
  103. }else{
  104. TR0 = 0;
  105. select++;
  106. delay_ms(song[select]*SongSpeed);
  107. TR0 = 1;
  108. select++;
  109. }
  110. }
  111. }
  112. }
  113. //延时
  114. void delay(uint j){
  115. uchar i=250;
  116. for(;j>0;j--){
  117. while(--i);
  118. i=249;
  119. while(--i);
  120. i=250;
  121. }
  122. }
  123. //检查忙标志
  124. void check_busy(void){
  125. uchar dt;
  126. do{
  127. dt=0xff;//dt为变量单元,初值为0xff
  128. //RS=0,E=1时才可以读忙标志位
  129. E=0;
  130. RS=0;
  131. RW=1;
  132. E=1;
  133. dt=out;//out为P0口,P0口的状态送入dt中
  134. }while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0
  135. E=0;//BF=0,LCD 1602不忙,结束检测
  136. }
  137. //写命令
  138. void write_command(uchar com){
  139. check_busy();
  140. //按规定RS和E同时为0时,才可以写命令
  141. E=0;
  142. RS=0;
  143. RW=0;
  144. out=com;//将命令com写入P0口
  145. E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0
  146. _nop_();//空操作1个机器周期,等待硬件反应
  147. E=0;//E由高电平变为低电平,LCD 1602开始执行命令
  148. delay(1);//延时,等待硬件反应
  149. }
  150. //写数据
  151. void write_data(uchar dat){
  152. check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令
  153. E=0;//按规定写数据时,E应为正脉冲,所以先置E=0
  154. //按规定RS=1和RW=0时,才可以写入数据
  155. RS=1;
  156. RW=0;
  157. out=dat;//将数据”dat“从P0口输出,即写入LCD 1602
  158. E=1;//E产生正跳变
  159. _nop_();//空操作1个机器周期,等待硬件反应
  160. E=0;//E由高电平变为低电平,写数据操作结束
  161. delay(1);
  162. }
  163. //液晶显示器初始化函数
  164. void lcd_initial(void){
  165. write_command(0x38);//8位两行显示,5*7点阵字符
  166. _nop_();//空操作1个机器周期,等待硬件反应
  167. write_command(0x0C);//开整体显示,光标关,无闪烁
  168. _nop_();//空操作1个机器周期,等待硬件反应
  169. //write_command(0x05);//光标右移
  170. _nop_();//空操作1个机器周期,等待硬件反应
  171. write_command(0x01);//清屏
  172. delay(1);
  173. }
  174. //输出显示字符串
  175. void string(uchar ad,uchar *s){
  176. write_command(ad);
  177. while(*s>0){
  178. write_data(*s++);//输出字符串,且指针增1
  179. delay(100);
  180. }
  181. }
  182. void timer0_initial()//初始化定时器0的状态
  183. {
  184. beepIO = 0;
  185. TH0 = 0xFD;
  186. TL0 = 0x09;
  187. TMOD = 0x01; //选择定时器0,工作方式1
  188. ET0 = 1; //允许定时器0中断
  189. EA = 1; //CPU开放中断
  190. TF0 = 0; //溢出标志位清0
  191. TR0 = 1; //开启定时器0
  192. }
  193. void BeepTimer0() interrupt 1 //中断函数
  194. {
  195. beepIO = !beepIO; //蜂鸣器IO口高低电平转换
  196. TH0 = freq_table[freq_select]/256 ;
  197. TL0 = freq_table[freq_select]%256 ;
  198. }
  199. void delay_ms(unsigned int x) //音乐延时函数
  200. {
  201. uchar t;
  202. while(x--) for(t=0;t<120;t++);
  203. }
  204. void print_2024(){//输出“2024”的数码管
  205. //2024 0010 0000 0010 0100
  206. P1=0x20;
  207. P3=0x24;
  208. }
  209. void print_HappyNewYear(){//输出“新年快乐”的LCD 1602
  210. lcd_initial();//对LCD初始化
  211. string(0x81,"Happy New Year");//显示第一行的字符
  212. string(0xC1,"peace happiness");//显示第二行的字符
  213. delay(50);//延时
  214. //write_command(0x01);//清屏
  215. }

51bd47c705cb4dce857f9a386eb720f5.png

器件名称Proteus关键字
红色共阴极数码管7SEG-BCD
蓝色共阴极数码管7SEG-BCD-BLUE
绿色共阴极数码管7SEG-BCD-GRN
51单片机AT89C51
复位按钮BUTTON
电容CAP
电解电容CAP-ELEC
晶体振荡器CRYSTAL
字符型LCD 1602显示器LM016L
滑动变阻器POT-HG
电阻RES
排阻RESPACK-8
蜂鸣器SPEAKER

好运来

C/C++ 

在B站上面看到了一个视频,打算就是实现这个烟花效果,当然光靠命令行是实现不了的。

【C语言开发】教你用代码写一个浪漫烟花特效!七夕最美的浪漫烟花代码,快写给她看一看吧!_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV16N4y1d7K6/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=7c3bfbf39d037fe80c97234396acc524

文字输出

首先需要用到EasyX库,我用的编译器是Dev-C++

EasyX Graphics Library for C++icon-default.png?t=N7T8https://easyx.cn/15天学会EasyX 第1天:EasyX的下载与配置安装_easyx下载-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/LCR2025/article/details/131019284

 

 

 

 

链接“-leasyx -lgdi32 -lole32”

  1. #include<stdio.h>
  2. #include<easyx.h>//图形界面库
  3. int main(){
  4. initgraph(1200,800);//创建窗口 宽1200 高度800
  5. settextcolor(YELLOW);//设置字体的颜色
  6. settextstyle(25,0,"楷体");//设置字体的风格 字号
  7. outtextxy(300,300,"2024新年之际,祝福你健康、快乐、平安、幸福");
  8. outtextxy(300,350,"愿你每天都笑容满面");
  9. outtextxy(300,400,"所求皆如愿,所行皆坦途,多喜乐,长安宁");
  10. outtextxy(300,450,"平安喜乐,万事胜意");
  11. outtextxy(300,500,"期末考试顺利");
  12. outtextxy(600,550,"——封奚泽优");
  13. getchar();//按回车键继续
  14. while(1);
  15. return 0;
  16. }

 

 播放音乐

dev c++播放音乐MP3(win环境)亲测有效_怎么在devc++里面用#pragma comment (lib,“winmm.lib”)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_47170063/article/details/110310633解决用mciSendString()函数不能播放音乐的问题_mcisendstring播放不出音乐-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_46436640/article/details/106591562

链接“-lwinmm”

直接放弃这个环节了,我的一直播放不了,目前不知道是什么情况,看到有的说是不能用网易云下载的音乐要用QQ音乐下载的,也有用TEXT又不用TEXT的我这里都播放不了,直接进入下一个部分了。

有知道的大佬可以帮我分析分析

烟花

  1. //烟花弹
  2. struct yhd{
  3. //属性
  4. int x,y;//当前坐标
  5. int hx,hy;//最高点的坐标
  6. unsigned long t1,t2,dt;//时间来控制速度
  7. IMAGE img;//保存烟花弹的图片
  8. bool isshoot;//烟花是否属于正在上升的状态
  9. }yhd;

加载图片

 这个也一直输出不了,重新安装了一下编译器,出现了一个错误,一个是中文注释不现实,一个是输出中文乱码。

解决Dev-C++中文注释无法显示,单击才能显示的问题_devc中文注释无法显示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_46251611/article/details/123352345

DEVC++运行中文乱码的解决方法 - 哔哩哔哩 (bilibili.com)icon-default.png?t=N7T8https://www.bilibili.com/read/cv26335420/

打算换一个编译器尝试一下,暂时先这样。

  1. #include<stdio.h>
  2. #include<easyx.h>//图形界面库
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #define _CRT_SECURE_NO_WARNINGS
  6. #include<windows.h>
  7. #pragma comment(lib,"winmm.lib")//媒体库文件
  8. #include <mmsystem.h>//媒体头文件
  9. //烟花弹
  10. struct yhd{
  11. //属性
  12. int x,y;//当前坐标
  13. int hx,hy;//最高点的坐标
  14. unsigned long t1,t2,dt;//时间来控制速度
  15. IMAGE img;//保存烟花弹的图片
  16. bool isshoot;//烟花是否属于正在上升的状态
  17. }yhd;
  18. int main(){
  19. srand((unsigned)time(NULL));//选取种子文件
  20. initgraph(1200,800);//创建窗口 宽1200 高度800
  21. //打开音乐文件
  22. mciSendString(TEXT("open music.mp3 alias song"),NULL,0,NULL);//mci 媒体控制接口
  23. mciSendString(TEXT("play song repeat"),NULL,0,NULL);//mci 媒体控制接口
  24. settextcolor(YELLOW);//设置字体的颜色
  25. settextstyle(25,0,"楷体");//设置字体的风格 字号
  26. outtextxy(300,300,"2024新年之际,祝福你健康、快乐、平安、幸福");
  27. outtextxy(300,350,"愿你每天都笑容满面");
  28. outtextxy(300,400,"所求皆如愿,所行皆坦途,多喜乐,长安宁");
  29. outtextxy(300,450,"平安喜乐,万事胜意");
  30. outtextxy(300,500,"期末考试顺利");
  31. outtextxy(600,550,"——封奚泽优");
  32. //getchar();//按回车键继续
  33. //初始化烟花弹(烟花弹需要上升,y坐标变化,x不变)
  34. yhd.x=rand()%(1200-20);
  35. yhd.y=750;//最开始烟花弹的位置
  36. yhd.hx=yhd.x;
  37. yhd.hy=rand()%400;//爆炸高度
  38. yhd.t1=GetTickCount();//获取当前系统的时间
  39. yhd.dt=10;//dt 10ms
  40. yhd.isshoot=true;//最开始是上升状态
  41. loadimage(&yhd.img,"yhd.png",20,50);//加载图片
  42. putimage(yhd.x,yhd.y,&yhd.img,SRCINVERT);
  43. while(1);
  44. return 0;
  45. }

大侠请重新来过

输出文字

 下载了Visual Studio 2022,先粘贴之前的代码,发现没有easyx图形库

我们重新安装一下
Visual Studio 2022手动安装EasyX_easyx下手动载-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zeandon/article/details/130771808 

 然后就链接成功了,接着就是显示

解决VS字符集的问题,对初学者特重要_vs的项目属性里配置属性常规里面 没有字符集这个选项-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/shi_xiaobin/article/details/122389721

 播放音乐

只是播放音乐看到后面。

VS中如何导入并且播放音乐_vs2022装bgm-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_43701019/article/details/100027495 

 然后终于有声音了,结果是因为换了一首歌,都是mp3格式的,但是有的就是不行,很奇怪,避免在网易云上面下载

我这里用的是相对路径

  1. #include<stdio.h>
  2. #include<easyx.h>//图形界面库
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #define _CRT_SECURE_NO_WARNINGS
  6. #include<windows.h>
  7. #pragma comment(lib,"winmm.lib")//媒体库文件
  8. #include <mmsystem.h>//媒体头文件
  9. //烟花弹
  10. struct yhd {
  11. //属性
  12. int x, y;//当前坐标
  13. int hx, hy;//最高点的坐标
  14. unsigned long t1, t2, dt;//时间来控制速度
  15. IMAGE img;//保存烟花弹的图片
  16. bool isshoot;//烟花是否属于正在上升的状态
  17. }yhd;
  18. int main() {
  19. srand((unsigned)time(NULL));//选取种子文件
  20. initgraph(1200, 800);//创建窗口 宽1200 高度800
  21. //打开音乐文件
  22. mciSendString(L"open music.mp3 alias bgm", 0, 0, 0);//mci 媒体控制接口
  23. mciSendString(L"play bgm repeat", 0, 0, 0);//mci 媒体控制接口
  24. settextcolor(YELLOW);//设置字体的颜色
  25. settextstyle(25, 0, _T("楷体"));//设置字体的风格 字号
  26. outtextxy(300, 300, _T("2024新年之际,祝福你健康、快乐、平安、幸福"));
  27. outtextxy(300, 350, _T("愿你每天都笑容满面"));
  28. outtextxy(300, 400, _T("所求皆如愿,所行皆坦途,多喜乐,长安宁"));
  29. outtextxy(300, 450, _T("平安喜乐,万事胜意"));
  30. outtextxy(300, 500, _T("期末考试顺利"));
  31. outtextxy(600, 550, _T("——封奚泽优"));
  32. while (1);//防止直接退出程序
  33. return 0;
  34. }

音乐

 果然就是音乐本身的问题,带回原来的Dev-C++还是可以运行。

烟花

加载图片

  1. //烟花弹
  2. struct yhd {
  3. //属性
  4. int x, y;//当前坐标
  5. int hx, hy;//最高点的坐标
  6. unsigned long t1, t2, dt;//时间来控制速度
  7. IMAGE img;//保存烟花弹的图片
  8. bool isshoot;//烟花是否属于正在上升的状态
  9. }yhd;
  10. //初始化烟花弹(烟花弹需要上升,y坐标变化,x不变)
  11. yhd.x = rand() % (1200 - 20);
  12. yhd.y = 750;//最开始烟花弹的位置
  13. yhd.hx = yhd.x;
  14. yhd.hy = rand() % 400;//爆炸高度
  15. yhd.t1 = GetTickCount();//获取当前系统的时间
  16. yhd.dt = 10;//dt 10ms
  17. yhd.isshoot = true;//最开始是上升状态
  18. loadimage(&yhd.img, _T("yhd.jpg"), 20, 50);//加载图片
  19. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);

烟花上升

  1. //获取当前时间
  2. yhd.t2 = GetTickCount();//t2
  3. //速度 处于发射状态
  4. if (yhd.t2 - yhd.t1 > yhd.dt && yhd.isshoot == true) {
  5. //会覆盖之前的
  6. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  7. if (yhd.y > yhd.hy) {//有一个上界
  8. yhd.y -= 5;//上升
  9. }
  10. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  11. if(yhd.y<=yhd.hy){
  12. //已经到达最高点
  13. //1.擦除烟花弹
  14. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  15. //停止上升
  16. yhd.isshoot = false;
  17. }
  18. if (yhd.isshoot == false) {
  19. //初始化烟花弹(烟花弹需要上升,y坐标变化,x不变)
  20. yhd.x = rand() % (1200 - 20);
  21. yhd.y = 750;//最开始烟花弹的位置
  22. yhd.hx = yhd.x;
  23. yhd.hy = rand() % 400;//爆炸高度
  24. yhd.t1 = GetTickCount();//获取当前系统的时间
  25. yhd.dt = 10;//dt 10ms
  26. yhd.isshoot = true;//最开始是上升状态
  27. loadimage(&yhd.img, _T("yhd.jpg"), 20, 50);//加载图片
  28. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  29. }
  30. yhd.t1 = yhd.t2;
  31. }

中间还发现命令行界面总是需要单独关闭,弄的太烦了,然后就用了下面的方法来关闭。

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

 烟花

视频中的代码不完整,简直了。

定义烟花类

  1. //烟花
  2. struct yh{
  3. int r;//当前半径
  4. int maxr;//最大半径
  5. int x, y;//中心点的坐标(窗口)
  6. int cx, cy;//中心点的坐标(图片)
  7. int xy[240][240];//图片的宽高,保存图片中的每一个像素点
  8. bool isboom;//是否开始爆炸(图片的显示)
  9. bool isdraw;//是否开始显示(用户看到的)
  10. unsigned long t1, t2, dt;//爆炸的速度
  11. } yh;

 初始化烟花

  1. yh.r=0;//当前半径
  2. yh.maxr = 120;//最大半径
  3. yh.cx = 120;
  4. yh.cy = 120;//中心点的坐标(图片)
  5. yh.xy[240][240];//图片的宽高,保存图片中的每一个像素点
  6. yh.isboom=false;//是否开始爆炸(图片的显示)
  7. yh.isdraw=false;//是否开始显示(用户看到的)
  8. yh.t1 = GetTickCount();
  9. yh.dt = 5;//爆炸的速度5ms
  10. IMAGE yhimg;
  11. loadimage(&yhimg, _T("yh.jpg"), 240, 240);//加载图片
  12. SetWorkingImage(&yhimg);//指定待获取的图片(默认是从窗口获取)
  13. //获取图片的像素点放到数组当中
  14. for (int a = 0; a < 240; a++) {
  15. for (int b = 0; b < 240; b++) {
  16. yh.xy[a][b]=getpixel(a, b);
  17. }
  18. }
  19. SetWorkingImage();//将烟花图片释放

 烟花的绽放

  1. //dt的数组
  2. int drt[] = { 5,5,5,15,15,15,25,25,25,55,60,65 };//烟花绽放的速度越来越慢ms
  3. yh.t2 = GetTickCount();
  4. //烟花已经爆炸
  5. if (yh.t2 - yh.t1 > yh.dt && yh.isboom == true) {
  6. if (yh.r < yh.maxr) {
  7. yh.r++;//半径不断变大,但是不能超过最大的范围
  8. yh.dt = drt[yh.r / 10];//dt不断变大
  9. yh.isdraw = true;//开始绘制
  10. }
  11. //爆炸结束(重置)
  12. if (yh.r >= yh.maxr - 1) {
  13. //停止绘制,停止爆炸
  14. yh.isdraw = false;
  15. yh.isboom = false;
  16. yh.t1 = GetTickCount();
  17. yh.dt = 5;
  18. yh.r = 0;
  19. }
  20. yh.t1 = yh.t2;
  21. }
  22. if (yh.isdraw == true) {
  23. //628次 2π
  24. for (double a = 0; a <= 6.28; a += 0.01) {
  25. //圆的轨迹方程
  26. int x1 = yh.cx + yh.r * cos(a);
  27. int y1 = yh.cy - yh.r * sin(a);
  28. //x1,y1 628个来自图片的像素点坐标
  29. yh.xy[x1][y1];
  30. }
  31. }

他是到这里结束了,然后无法实现烟花图片的输出,因为他并没有相关的代码,需要输出像素点。我最开始写的是putpixel(x1,y1,yh.xy[x1][y1]);发现每次输出的位置都是那一个地方,想着要和最高点的高度有关,改成了putpixel(hy.x,yh.y,yh.xy[x1][y1]);发现结果都不输出了,我想了很久发现如果坐标固定不变,那不就是一个点在一直输出,人眼无法发现这个变化,所以想应该在图片画圆的时候同步对窗口中以最高点为圆心画圆,所以最终变成了putpixel(x2,y2,yh.xy[x1][y1]);

【C/C++开发教程】图形图像处理入门,像素如何组成及图形图像识别和运算_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1na411t7Di/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=7c3bfbf39d037fe80c97234396acc524

  1. //开始绘制图像
  2. if (yh.isdraw == true) {
  3. //628次 2π
  4. for (double a = 0; a <= 6.28; a += 0.01) {
  5. //圆的轨迹方程(图片)
  6. int x1 = yh.cx + yh.r * cos(a);
  7. int y1 = yh.cy - yh.r * sin(a);
  8. //圆的轨迹方程(窗口)
  9. int x2 = yh.x + yh.r * cos(a);
  10. int y2 = yh.y - yh.r * sin(a);
  11. //x1,y1 628个来自图片的像素点坐标
  12. putpixel(x2,y2,yh.xy[x1][y1]);
  13. }
  14. }
  15. }

 这样就实现了单个烟花的绽放

多个烟花绽放

首先判断变成了这个,需要等爆炸完之后发下一个,其次是位置不能在if (yhd.t2 - yhd.t1 > yhd.dt && yhd.isshoot == true) 里面,此时的已经不再上升了,放里面就实现不了发送多个。

  1. if (yhd.isshoot == false && yh.isboom == false) {
  2. //初始化烟花弹
  3. initYHD();
  4. }

绽放的烟花消失 

接着就是这最后一个问题了,如何让绽放的烟花自己消失。

最开始我的想法是输出一个黑色的像素点然后去覆盖他,但是考虑到有文字出现所以需要的不是覆盖而是恢复之前的,所以我的想法是用一个结构体来保存之前窗口将会被覆盖的像素,在之后的几轮中一边绽放新的一边恢复之前的,想法很好,但是现实很骨感,如果两个烟花绽放重合,你现在保存的像素之后还是有烟花绽放的影子,所以之后就像用黑色覆盖就覆盖吧,把字体重新输出不就行了。结果和现实还是有点差距。如果是重合的话,黑色还是会把之前的给覆盖了,这个目前还没解决,有大佬会的话,希望能够提供一下思路。

  1. //用于保存之前被覆盖的像素
  2. struct tmp{
  3. int x, y;//中心点的坐标(窗口)
  4. int ishuifu;//是否恢复
  5. }tmp;
  6. //当已经发送第二个的时候恢复第一个的
  7. if (tmp.ishuifu) {
  8. //圆的轨迹方程(窗口)
  9. int x3 = tmp.x + yh.r * cos(a);
  10. int y3 = tmp.y - yh.r * sin(a);
  11. //重新弄成黑色
  12. putpixel(x3, y3,0x000000);
  13. }

代码

和老师讲的还是有点差距的,我的有点小丑。

  1. #include<stdio.h>
  2. #include<easyx.h>//图形界面库
  3. #include<stdlib.h>
  4. #include<graphics.h>
  5. #include<conio.h>
  6. #include<time.h>
  7. #define _CRT_SECURE_NO_WARNINGS
  8. #include<windows.h>
  9. #pragma comment(lib,"winmm.lib")//媒体库文件
  10. #include <mmsystem.h>//媒体头文件
  11. #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
  12. #include<math.h>
  13. //烟花弹
  14. struct yhd {
  15. //属性
  16. int x, y;//当前坐标
  17. int hx, hy;//最高点的坐标
  18. unsigned long t1, t2, dt;//时间来控制速度
  19. IMAGE img;//保存烟花弹的图片
  20. bool isshoot;//烟花是否属于正在上升的状态
  21. }yhd;
  22. //烟花
  23. struct yh{
  24. int r;//当前半径
  25. int maxr;//最大半径
  26. int x, y;//中心点的坐标(窗口)
  27. int cx, cy;//中心点的坐标(图片)
  28. int xy[240][240];//图片的宽高,保存图片中的每一个像素点
  29. bool isboom;//是否开始爆炸(图片的显示)
  30. bool isdraw;//是否开始显示(用户看到的)
  31. unsigned long t1, t2, dt;//爆炸的速度
  32. } yh;
  33. //用于保存之前被覆盖的像素
  34. struct tmp{
  35. int x, y;//中心点的坐标(窗口)
  36. int ishuifu;//是否恢复
  37. }tmp;
  38. void initYHD();//初始化烟花弹
  39. void initYH();//初始化烟花
  40. void printText();//输出文字
  41. //主函数
  42. int main() {
  43. srand((unsigned)time(NULL));//选取种子文件
  44. initgraph(1200, 800);//创建窗口 宽1200 高度800
  45. //打开音乐文件
  46. mciSendString(L"open music.mp3 alias bgm", 0, 0, 0);//mci 媒体控制接口
  47. mciSendString(L"play bgm repeat", 0, 0, 0);//mci 媒体控制接口
  48. //getchar();//按回车键继续
  49. //初始化烟花弹(烟花弹需要上升,y坐标变化,x不变)
  50. initYHD();
  51. //初始化烟花
  52. initYH();
  53. //不恢复
  54. tmp.ishuifu = false;
  55. while (1) {
  56. //打印文字
  57. printText();
  58. //获取当前时间
  59. yhd.t2 = GetTickCount();//t2
  60. //速度 处于发射状态
  61. if (yhd.t2 - yhd.t1 > yhd.dt && yhd.isshoot == true) {
  62. //会覆盖之前的
  63. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  64. if (yhd.y > yhd.hy) {//有一个上界
  65. yhd.y -= 5;//上升
  66. }
  67. //覆盖之前的
  68. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  69. if(yhd.y<=yhd.hy){
  70. //已经到达最高点
  71. //1.擦除烟花弹
  72. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  73. //停止上升
  74. yhd.isshoot = false;
  75. //开始爆炸
  76. yh.isboom = true;
  77. //上升最高点的坐标就是爆炸的中心
  78. yh.x = yhd.x;
  79. yh.y = yhd.y;
  80. }
  81. yhd.t1 = yhd.t2;
  82. }
  83. //2.重新初始化烟花弹烟花爆炸完毕(这个要移出来,如果放在前面那个if里面就不能实现了,新的一轮要isshoot==true才能进去,这判断又是不能为true)
  84. if (yhd.isshoot == false && yh.isboom == false) {
  85. //保存原点坐标
  86. tmp.x = yh.x;
  87. tmp.y = yh.y;
  88. //恢复
  89. tmp.ishuifu = true;
  90. //初始化烟花弹
  91. initYHD();
  92. }
  93. //dt的数组
  94. int drt[] = { 5,5,5,15,15,15,25,25,25,55,60,65 };//烟花绽放的速度越来越慢ms
  95. yh.t2 = GetTickCount();
  96. //烟花已经爆炸
  97. if (yh.t2 - yh.t1 > yh.dt && yh.isboom == true) {
  98. if (yh.r < yh.maxr) {
  99. yh.r++;//半径不断变大,但是不能超过最大的范围
  100. yh.dt = drt[yh.r / 10];//dt不断变大
  101. yh.isdraw = true;//开始绘制
  102. }
  103. //爆炸结束(重置)
  104. if (yh.r >= yh.maxr - 1) {
  105. //停止绘制,停止爆炸
  106. yh.isdraw = false;
  107. yh.isboom = false;
  108. yh.t1 = GetTickCount();
  109. yh.dt = 5;
  110. yh.r = 0;
  111. }
  112. yh.t1 = yh.t2;
  113. }
  114. //开始绘制图像
  115. if (yh.isdraw == true) {
  116. //628次 2π
  117. int i = 0, j = 0;
  118. for (double a = 0; a <= 6.28; a += 0.01) {
  119. //当已经发送第二个的时候恢复第一个的
  120. if (tmp.ishuifu) {
  121. //圆的轨迹方程(窗口)
  122. int x3 = tmp.x + yh.r * cos(a);
  123. int y3 = tmp.y - yh.r * sin(a);
  124. //重新弄成黑色
  125. putpixel(x3, y3,0x000000);
  126. }
  127. //圆的轨迹方程(图片)
  128. int x1 = yh.cx + yh.r * cos(a);
  129. int y1 = yh.cy - yh.r * sin(a);
  130. //圆的轨迹方程(窗口)
  131. int x2 = yh.x + yh.r * cos(a);
  132. int y2 = yh.y - yh.r * sin(a);
  133. //x1,y1 628个来自图片的像素点坐标
  134. putpixel(x2,y2,yh.xy[x1][y1]);
  135. }
  136. }
  137. }
  138. while (1);//防止直接退出程序
  139. return 0;
  140. }
  141. //初始化烟花弹
  142. void initYHD() {
  143. //初始化烟花弹(烟花弹需要上升,y坐标变化,x不变)
  144. yhd.x = rand() % (1200 - 20);
  145. yhd.y = 750;//最开始烟花弹的位置
  146. yhd.hx = yhd.x;
  147. yhd.hy = rand() % 400;//爆炸高度
  148. yhd.t1 = GetTickCount();//获取当前系统的时间
  149. yhd.dt = 5;//dt 10ms
  150. yhd.isshoot = true;//最开始是上升状态
  151. loadimage(&yhd.img, _T("yhd.jpg"), 20, 50);//加载图片
  152. putimage(yhd.x, yhd.y, &yhd.img, SRCINVERT);
  153. }
  154. //初始化烟花
  155. void initYH() {
  156. yh.r=0;//当前半径
  157. yh.maxr = 120;//最大半径
  158. yh.cx = 120;
  159. yh.cy = 120;//中心点的坐标(图片)
  160. yh.xy[240][240];//图片的宽高,保存图片中的每一个像素点
  161. yh.isboom=false;//是否开始爆炸(图片的显示)
  162. yh.isdraw=false;//是否开始显示(用户看到的)
  163. yh.t1 = GetTickCount();
  164. yh.dt = 5;//爆炸的速度5ms
  165. IMAGE yhimg;
  166. loadimage(&yhimg, _T("yh.jpg"), 240, 240);//加载图片
  167. SetWorkingImage(&yhimg);//指定待获取的图片(默认是从窗口获取)
  168. //获取图片的像素点放到数组当中
  169. for (int a = 0; a < 240; a++) {
  170. for (int b = 0; b < 240; b++) {
  171. yh.xy[a][b]=getpixel(a, b);
  172. }
  173. }
  174. SetWorkingImage();//将烟花图片释放
  175. }
  176. void printText() {//输出文字
  177. settextcolor(YELLOW);//设置字体的颜色
  178. settextstyle(25, 0, _T("楷体"));//设置字体的风格 字号
  179. outtextxy(300, 300, _T("2024新年之际,祝福你健康、快乐、平安、幸福"));
  180. outtextxy(300, 350, _T("愿你每天都笑容满面"));
  181. outtextxy(300, 400, _T("所求皆如愿,所行皆坦途,多喜乐,长安宁"));
  182. outtextxy(300, 450, _T("平安喜乐,万事胜意"));
  183. outtextxy(300, 500, _T("期末考试顺利"));
  184. outtextxy(600, 550, _T("——封奚泽优"));
  185. }

 总结

本来构思的是看自己学的都可以如何祝大家新年快乐,目前只用到了单片机的知识,C语言部分一直实现不了,之后会持续更新,争取早日输出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/149148
推荐阅读
相关标签
  

闽ICP备14008679号