• #循循渐进学51单片机#变量进阶与点阵LED#not.6


    1、掌握变量的作用域及存储类别。

    局部变量

    函数内部声明的变量,只在函数内部有效,在本函数以外是不能使用的,叫局部变量。

    全局变量

    在函数外部声明的变量就是全局变量,一个源程序可以包含一个或多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束。

    全局变量的副作用

    1)降低函数的独立性,对任何一个函数的修改都可能影响到其他函数。

    2)降低函数的通用性,不利于函数的重复利用。

    3)降低程序的清晰度,每个函数执行都有可能改变全局变量值,无法清楚判断每个时刻的全局变量的值。

    4)全局变量永久占用内存单元。

    原则:能用局部变量就不用全局变量

    全局变量和局部变量同名,在局部变量作用域范围内,局部变量有效。

    自动变量

    函数中的局部变量,如果不加static关键词修饰,都属于自动变量,也叫动态变量。

    静态变量

    所有的全局变量都属于静态变量,局部变量加了static关键词修饰的话,也是静态变量


    2、了解点阵的显示原理,理解点阵动画显示原理。

    点阵的显示原理是多个LED小灯组合在一起,点亮不同的LED小灯集合下来组成不同的图案,点阵的动画显示实际上就是不同图案的高帧变化。


    3、独立完成点阵显示I❤U向下移动的程序。

    1. clude <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned char code LedBuff[] = {
    8. 0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
    9. 0xE7,0xC3,0x81,0x00,0x00,0x99,0xFF,0xC3,
    10. 0x81,0x99,0x99,0x99,0x99,0x99,0xFF,0xFF,
    11. };
    12. unsigned int flag1s = 0;
    13. unsigned int cnt = 0,i = 0;
    14. void main()
    15. {
    16. ENLED = 0;
    17. addr3 = 0;
    18. TMOD = 0x01;
    19. TH0 = 0xfc;
    20. TL0 = 0x67;
    21. TR0 = 1;
    22. while(1)
    23. {
    24. if(TF0 == 1)
    25. {
    26. TF0 = 0;
    27. cnt++;
    28. if(cnt >= 5)
    29. {
    30. cnt = 0;
    31. flag1s++;
    32. }
    33. }
    34. P0 = 0xff;
    35. switch (i)
    36. {
    37. case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 7];i++;break;
    38. case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 6];i++;break;
    39. case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 5];i++;break;
    40. case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 4];i++;break;
    41. case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 3];i++;break;
    42. case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 2];i++;break;
    43. case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 1];i++;break;
    44. case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 0];i=0;break;
    45. default:break;
    46. }
    47. if(flag1s >= 16)
    48. {
    49. flag1s = 0;
    50. }
    51. }
    52. }


    4、独立完成点阵显示I❤U向右移动的程序。

    1. #include <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned char code LedBuff[] = {
    8. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    9. 0x7D,0x01,0x01,0x7D,0xFF,0xFF,0xE3,0xC1,
    10. 0x81,0x03,0x03,0x81,0xC1,0xE3,0xFF,0xFF,
    11. 0x81,0x01,0x3F,0x3F,0x3F,0x01,0x81,0xFF,
    12. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
    13. };
    14. unsigned int flag1s = 0;
    15. unsigned int cnt = 0,i = 0;
    16. void main()
    17. {
    18. ENLED = 0;
    19. addr3 = 0;
    20. TMOD = 0x01;
    21. TH0 = 0xfc;
    22. TL0 = 0x67;
    23. TR0 = 1;
    24. while(1)
    25. {
    26. if(TF0 == 1)
    27. {
    28. TF0 = 0;
    29. cnt++;
    30. if(cnt >= 5)
    31. {
    32. cnt = 0;
    33. flag1s++;
    34. }
    35. }
    36. P0 = 0xff;
    37. switch (i)
    38. {
    39. case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 7];i++;break;
    40. case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s + 6];i++;break;
    41. case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 5];i++;break;
    42. case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s + 4];i++;break;
    43. case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 3];i++;break;
    44. case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s + 2];i++;break;
    45. case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 1];i++;break;
    46. case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s + 0];i=0;break;
    47. default:break;
    48. }
    49. if(flag1s >= 32)
    50. {
    51. flag1s = 0;
    52. }
    53. }
    54. }


    5、用点阵做一个9到0的倒计时牌显示。

    1. #include <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned char code LedBuff[][8] = {
    8. 0xFF,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xFF,
    9. 0xFF,0xE3,0xDF,0xDF,0xEF,0xF7,0xC3,0xFF,
    10. 0xFF,0xC3,0xDF,0xDF,0xE3,0xDF,0xDF,0xC3,
    11. 0xFF,0xEF,0xE7,0xEB,0xC1,0xEF,0xEF,0xEF,
    12. 0xFF,0xC3,0xFB,0xC3,0xDF,0xDF,0xDF,0xE3,
    13. 0xFF,0xC3,0xDF,0xDF,0xC3,0xDB,0xDB,0xC3,
    14. 0xFF,0xC3,0xDF,0xEF,0xF7,0xF7,0xF7,0xF7,
    15. 0xFF,0xC3,0xDB,0xDB,0xE7,0xDB,0xDB,0xC3,
    16. 0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xEF,
    17. 0xFF,0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7,
    18. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    19. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    20. };
    21. unsigned int flag1s = 0;
    22. unsigned int cnt = 0,i = 0;
    23. void main()
    24. {
    25. ENLED = 0;
    26. addr3 = 0;
    27. TMOD = 0x01;
    28. TH0 = 0xfc;
    29. TL0 = 0x67;
    30. TR0 = 1;
    31. while(1)
    32. {
    33. if(TF0 == 1)
    34. {
    35. TF0 = 0;
    36. cnt++;
    37. if(cnt >= 10)
    38. {
    39. cnt = 0;
    40. flag1s++;
    41. }
    42. }
    43. P0 = 0xff;
    44. switch (i)
    45. {
    46. case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s][0];i++;break;
    47. case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[flag1s][1];i++;break;
    48. case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s][2];i++;break;
    49. case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[flag1s][3];i++;break;
    50. case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s][4];i++;break;
    51. case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[flag1s][5];i++;break;
    52. case 6 :addr0 = 0;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s][6];i++;break;
    53. case 7 :addr0 = 1;addr1 = 1;addr2 = 1;P0 = LedBuff[flag1s][7];i=0;break;
    54. default:break;
    55. }
    56. if(flag1s >= 10)
    57. {
    58. flag1s = 0;
    59. }
    60. }
    61. }


    6、尝试实现流水灯、数码管和点阵的同时显

    1. #include <REGX52.H>
    2. sbit addr0 = P1^0;
    3. sbit addr1 = P1^1;
    4. sbit addr2 = P1^2;
    5. sbit addr3 = P1^3;
    6. sbit ENLED = P1^4;
    7. unsigned int i = 0;
    8. void main()
    9. {
    10. EA = 1;
    11. ENLED = 0;
    12. TMOD = 0x01;
    13. TH0 = 0xfc;
    14. TL0 = 0x67;
    15. ET0 = 1;
    16. TR0 = 1;
    17. while(1)
    18. {
    19. }
    20. }
    21. void InterruptTimer0() interrupt 1
    22. {
    23. TH0 = 0xfc;
    24. TL0 = 0x67;
    25. P0 = 0xff;
    26. switch (i)
    27. {
    28. case 0 :addr3 = 0;addr0 = 0;addr1 = 0;addr2 = 0;P0 = 0;i++;break;
    29. case 1 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 0;P0 = 0;i++;break;
    30. case 2 :addr3 = 0;addr0 = 0;addr1 = 1;addr2 = 0;P0 = 0;i++;break;
    31. case 3 :addr3 = 0;addr0 = 1;addr1 = 1;addr2 = 0;P0 = 0;i++;break;
    32. case 4 :addr3 = 0;addr0 = 0;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    33. case 5 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    34. case 6 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    35. case 7 :addr3 = 0;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    36. case 8 :addr3 = 1;addr0 = 0;addr1 = 0;addr2 = 0;P0 = 0;i++;break;
    37. case 9 :addr3 = 1;addr0 = 1;addr1 = 0;addr2 = 0;P0 = 0;i++;break;
    38. case 10 :addr3 = 1;addr0 =0;addr1 = 1;addr2 = 0;P0 = 0;i++;break;
    39. case 11 :addr3 = 1;addr0 = 1;addr1 = 1;addr2 = 0;P0 = 0;i++;break;
    40. case 12 :addr3 = 1;addr0 = 0;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    41. case 13 :addr3 = 1;addr0 = 1;addr1 = 0;addr2 = 1;P0 = 0;i++;break;
    42. case 14 :addr3 = 1;addr0 = 0;addr1 = 1;addr2 = 1;P0 = 0;i=0;break;
    43. default:break;
    44. }
    45. }

  • 相关阅读:
    新零售六大模式,你学会了吗?
    Android11 添加adb后门
    AIE有机荧光探针/荧光高分子纳米微球AIE-PEN FPNs/AIE有机荧光分子带电荷微球
    华为OD 打印任务排序(100分)【java】A卷+B卷
    关于我使用vue-quill-editor遇到的一些“坑”
    3D建模新手必学:zBrush常用笔刷
    Springboot面向网络直播平台的推荐系统y9tf8计算机毕业设计-课程设计-期末作业-毕设程序代做
    vivado 仿真读写bmp图片
    Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)
    多协议充电桩平台系统小程序方案
  • 原文地址:https://blog.csdn.net/2301_77479336/article/details/132845026