找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 975|回复: 9
打印 上一主题 下一主题
收起左侧

单片机如何通过改变P2口的状态来分别控制P1和P2LED的点亮效果?

[复制链接]
跳转到指定楼层
楼主
问题是:实现用P2.0至P2.7端口连接的8个开关按键,控制P0口和P1口连接的16个发光二级管,实现不同花样的流水点亮效果。

下面是Proteus仿真图:


我现在遇到的问题就是想要通过改变P2口的状态来分别控制P1和P2LED的点亮效果,但是在点亮LED后,更改P2的状态后,原来的LED状态不改变,还是一直亮,就想请求下怎么才能改变他们的状态。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-3-27 18:06 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:121859 发表于 2022-3-27 19:08 | 只看该作者
肯定是程序有问题呀,要获得帮助你需要将你的程序贴出来才行。
回复

使用道具 举报

地板
ID:1013404 发表于 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. }
复制代码
回复

使用道具 举报

5#
ID:1013404 发表于 2022-3-27 20:44 | 只看该作者
zhxiufan 发表于 2022-3-27 19:08
肯定是程序有问题呀,要获得帮助你需要将你的程序贴出来才行。

好的,正在审核
回复

使用道具 举报

6#
ID:161164 发表于 2022-3-28 10:23 | 只看该作者
你的描述,仿真图和代码都不一至
仿真图上的描述是P2控制P0和P1
仿真图里P2接按键,P0和P1接LED
仿真图下的描述是P2控制不了P1和P2
代码里是P2控制P1和P2
请你再检查一下
回复

使用道具 举报

7#
ID:1013404 发表于 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, 下载次数: 27)

1 (1).png
回复

使用道具 举报

8#
ID:1013404 发表于 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, 下载次数: 39)

1 (1).png
回复

使用道具 举报

9#
ID:161164 发表于 2022-3-28 21:08 | 只看该作者
ION_i 发表于 2022-3-28 17:41
这个是后来改的,改过之后还是之前的效果。

第29行:谁教你在函数中用while(1)的?
回复

使用道具 举报

10#
ID:230742 发表于 2022-3-29 10:45 | 只看该作者
掉坑里出不来了。哈哈。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表