标题: 单片机如何通过改变P2口的状态来分别控制P1和P2LED的点亮效果? [打印本页]

作者: ION_i    时间: 2022-3-27 10:55
标题: 单片机如何通过改变P2口的状态来分别控制P1和P2LED的点亮效果?
问题是:实现用P2.0至P2.7端口连接的8个开关按键,控制P0口和P1口连接的16个发光二级管,实现不同花样的流水点亮效果。

下面是Proteus仿真图:


我现在遇到的问题就是想要通过改变P2口的状态来分别控制P1和P2LED的点亮效果,但是在点亮LED后,更改P2的状态后,原来的LED状态不改变,还是一直亮,就想请求下怎么才能改变他们的状态。

作者: 人工置顶员    时间: 2022-3-27 18:06
顶一下
作者: zhxiufan    时间: 2022-3-27 19:08
肯定是程序有问题呀,要获得帮助你需要将你的程序贴出来才行。
作者: ION_i    时间: 2022-3-27 20:43
部分代码如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. //Delay
  4. void delay(){
  5.         uchar i,j;
  6.         for(i=0;i<255;i++)
  7.         for(j=0;j<255;j++);
  8. }

  9. char GetKey(){
  10.         char key;
  11.         key = ~P2;
  12.         return key;
  13. }


  14. //P2=1,P0 All On.
  15. void P0_All_On(){
  16.         P0 = 0x00;
  17. }

  18. //P1 unidirectional led
  19. void P1_Unidirectional_Led(){
  20.        
  21. }

  22. //P2=0xfd,P1 All On.
  23. void P1_All_On(){       
  24.                 P1 = 0x00;
  25. }

  26. void LedDispose(char key){
  27.         P1 = 0xff;
  28.         P2 = 0xff;
  29.         if(key == 0x01)
  30.                 P0_All_On();
  31.         if(key == 0x02)
  32.                 P1_All_On();
  33. }


  34. void main(){
  35.         char key;
  36.         P2 = 0xff;
  37.         key = ~P2;
  38.         while(1)
  39.         {
  40.                 key = GetKey();
  41. //                state = ~P2;
  42.                 if(key != 0x00)
  43.                 {
  44.                         LedDispose(key);
  45.                 }else{
  46.                         P1 = 0xff;
  47.                         P2 = 0xff;
  48.                 }

  49.         }
  50. }
复制代码

作者: ION_i    时间: 2022-3-27 20:44
zhxiufan 发表于 2022-3-27 19:08
肯定是程序有问题呀,要获得帮助你需要将你的程序贴出来才行。

好的,正在审核
作者: lkc8210    时间: 2022-3-28 10:23
你的描述,仿真图和代码都不一至
仿真图上的描述是P2控制P0和P1
仿真图里P2接按键,P0和P1接LED
仿真图下的描述是P2控制不了P1和P2
代码里是P2控制P1和P2
请你再检查一下
作者: ION_i    时间: 2022-3-28 17:41
本帖最后由 ION_i 于 2022-3-28 18:07 编辑
lkc8210 发表于 2022-3-28 10:23
你的描述,仿真图和代码都不一至
仿真图上的描述是P2控制P0和P1
仿真图里P2接按键,P0和P1接LED

这个是后来改的,改过之后还是之前的效果。
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. //Delay
  4. void delay(){
  5.         uchar i,j;
  6.         for(i=0;i<255;i++)
  7.         for(j=0;j<255;j++);
  8. }

  9. char GetKey(){
  10.         char key;
  11.         key = ~P2;
  12.         return key;
  13. }


  14. //P2=1,P0 All On.
  15. void P0_All_On(){
  16.         P0 = 0x00;
  17. }

  18. //P1 unidirectional led
  19. void P1_Unidirectional_Led(){
  20.        
  21. }

  22. //P2=0xfd,P1 All On.
  23. void P1_All_On(){
  24.         while(1){
  25.                
  26.                 P1 = 0x00;
  27.         }
  28. }

  29. void LedDispose(char key){
  30.         P1 = 0xff;
  31.         P0 = 0xff;
  32.         if(key == 0x01)
  33.                 P0_All_On();
  34.         if(key == 0x02)
  35.                 P1_All_On();
  36. }


  37. void main(){
  38.         char key;
  39.         P2 = 0xff;
  40.         key = ~P2;
  41.         while(1)
  42.         {
  43.                 key = GetKey();
  44. //                state = ~P2;
  45.                 if(key != 0x00)
  46.                 {
  47.                         LedDispose(key);
  48.                 }else{
  49.                         P1 = 0xff;
  50.                         P0 = 0xff;
  51.                 }

  52.         }
  53. }
复制代码



1 (1).png (45.56 KB, 下载次数: 49)

1 (1).png

作者: ION_i    时间: 2022-3-28 17:43
本帖最后由 ION_i 于 2022-3-28 17:46 编辑
lkc8210 发表于 2022-3-28 10:23
你的描述,仿真图和代码都不一至
仿真图上的描述是P2控制P0和P1
仿真图里P2接按键,P0和P1接LED

这是改过后的代码和效果
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. //Delay
  4. void delay(){
  5.         uchar i,j;
  6.         for(i=0;i<255;i++)
  7.         for(j=0;j<255;j++);
  8. }

  9. char GetKey(){
  10.         char key;
  11.         key = ~P2;
  12.         return key;
  13. }


  14. //P2=1,P0 All On.
  15. void P0_All_On(){
  16.         P0 = 0x00;
  17. }

  18. //P1 unidirectional led
  19. void P1_Unidirectional_Led(){
  20.         
  21. }

  22. //P2=0xfd,P1 All On.
  23. void P1_All_On(){
  24.         while(1){
  25.                
  26.                 P1 = 0x00;
  27.         }
  28. }

  29. void LedDispose(char key){
  30.         P1 = 0xff;
  31.         P0 = 0xff;
  32.         if(key == 0x01)
  33.                 P0_All_On();
  34.         if(key == 0x02)
  35.                 P1_All_On();
  36. }


  37. void main(){
  38.         char key;
  39.         P2 = 0xff;
  40.         key = ~P2;
  41.         while(1)
  42.         {
  43.                 key = GetKey();
  44. //                state = ~P2;
  45.                 if(key != 0x00)
  46.                 {
  47.                         LedDispose(key);
  48.                 }else{
  49.                         P1 = 0xff;
  50.                         P0 = 0xff;
  51.                 }

  52.         }
  53. }
复制代码


1 (1).png (45.56 KB, 下载次数: 52)

1 (1).png

作者: lkc8210    时间: 2022-3-28 21:08
ION_i 发表于 2022-3-28 17:41
这个是后来改的,改过之后还是之前的效果。

第29行:谁教你在函数中用while(1)的?
作者: 啤酒瓶子老大    时间: 2022-3-29 10:45
掉坑里出不来了。哈哈。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1