OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7392|回复: 10

关于跑马灯的问题(不简单)

[复制链接]

23

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-11-11
在线时间
15 小时
发表于 2018-5-29 16:09:05 | 显示全部楼层 |阅读模式
5金钱
求助。问题如下,实现跑马灯,但是MCU的口是这样的。从左向右,P31 P00 P01 P02 P03 P06 P07 P34.
要求是这样的,第一下按键:P02 P03亮;然后P01 P06亮;P00 P07亮;P31 P34亮。(每一对灯依次亮,每次只有一对灯亮)
                     第二下按键:反向;
                     第三下按键:同时闪烁;
                     地四下按键:全灭。

高人指点,特别有2点,我很困惑解决不了,1,两个IO口拼成一个8bit的,怎么处理?
                                                           2,怎么调节灯闪烁的速度;(我试了delay,循环等方法都不好)

请高手写程序出来,我好学习,调试。非常感谢。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2018-5-21
在线时间
28 小时
发表于 2018-5-29 16:34:34 | 显示全部楼层
网上有很多类似的源码
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-5-19
在线时间
10 小时
发表于 2018-5-29 20:21:18 | 显示全部楼层
#include <REG52.h> //#include <stdio.H>  //本例以51为平台,以按键接在外部中断0管脚上为例,假设所有LED均为低电平点亮 /* 求助。问题如下,实现跑马灯,但是MCU的口是这样的。从左向右,P31 P00 P01 P02 P03 P06 P07 P34. 要求是这样的, 第一下按键:P02 P03亮;然后P01 P06亮;P00 P07亮;P31 P34亮。(每一对灯依次亮,每次只有一对灯亮) 第二下按键:反向; 第三下按键:同时闪烁; 地四下按键:全灭。 */  sbit LED1 = P3^1; sbit LED2 = P0^0; sbit LED3 = P0^1; sbit LED4 = P0^2; sbit LED5 = P0^3; sbit LED6 = P0^6; sbit LED7 = P0^7; sbit LED8 = P3^4;  #define all_on() LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;LED7=0;LED8=0 #define all_off() LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1  #define group1_on() all_off();LED4=0;LED5=0 #define group2_on() all_off();LED3=0;LED6=0 #define group3_on() all_off();LED2=0;LED7=0 #define group4_on() all_off();LED1=0;LED8=0  #define group1_off() all_off();LED4=1;LED5=1 #define group2_off() all_off();LED3=1;LED6=1 #define group3_off() all_off();LED2=1;LED7=1 #define group4_off() all_off();LED1=1;LED8=1   void delay(unsigned char i); void LedStatus(unsigned char KeyCount);  void LedStatus(unsigned char KeyCount) {         //static unsigned char toggle = 0;     switch(KeyCount)     {             case 1:                group1_on();                    delay(10);                    group2_on();                    delay(10);                    group3_on();                    delay(10);                    group4_on();                    delay(10);             case 2:                group4_on();                    delay(10);                    group3_on();                    delay(10);                    group2_on();                    delay(10);                    group1_on();                    delay(10);             case 3:                all_on();                    delay(10);                    all_off();                    delay(10);             default:                    all_off();     } }  unsigned char Key_Count=0;  unsigned int ReData,SenData;  void delay(unsigned char i) {         unsigned char j;         for(i;i>0;i--)         {                 for(j=200;i>0;j--);         } }  void main(void) {         unsigned char i=0;         delay(50);         IE0 = 0;//清外部中断标志位         IT0 = 1;//设置为下降沿触发     EX0 = 1;//外部中断0中断允许位                         EA = 1;                 while(1)         {                                 LedStatus(Key_Count);                 if(Key_Count >= 4)                  {                    Key_Count=0;                 }          } }  void int0(void) interrupt 0 //中断服务函数的书写格式 {     EX0 = 0;         if(IE0 == 1)//产生了外部中断,IE 自动置为1     {        //如果硬件没有对按键作消抖处理,这里要注意软件作消抖处理,此处略。                 IE0 = 0;                 Key_Count++;                             }         EX0 = 1; }
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-5-19
在线时间
10 小时
发表于 2018-5-29 20:24:37 | 显示全部楼层
将程序复制粘贴,这里并没有自动换行,如果想要交流,想要工程文件的话,可以加微信baofeng_zouyu  ,再发给你
回复

使用道具 举报

23

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-11-11
在线时间
15 小时
 楼主| 发表于 2018-5-30 09:30:21 | 显示全部楼层
pcbzy 发表于 2018-5-29 20:24
将程序复制粘贴,这里并没有自动换行,如果想要交流,想要工程文件的话,可以加微信baofeng_zouyu  ,再发 ...

非常感谢。P31 P00 P01 P02 P03 P06 P07 P34 但是现在情况是库里面不允许自己再使用sbit去定义类似P0^0这样的端口位了。所以,想问还有什么别的方法没有?我一直想使用“位段”结构,但是没搞出来,还在想。   我先试试你的程序先。再次非常感谢。
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-5-19
在线时间
10 小时
发表于 2018-5-30 10:46:02 | 显示全部楼层
不好意思,每个switch的分支后面忘了加break;了。
什么叫库里不允许用sbit了?用sbit也只是像用define一样让人看了直观一点而已,你直接用P0^0=0;也一样的啊
回复

使用道具 举报

23

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-11-11
在线时间
15 小时
 楼主| 发表于 2018-5-30 15:17:53 | 显示全部楼层
pcbzy 发表于 2018-5-30 10:46
不好意思,每个switch的分支后面忘了加break;了。
什么叫库里不允许用sbit了?用sbit也只是像用define一样 ...

是的。我表达的有问题。不够灵活。
回复

使用道具 举报

23

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2015-11-11
在线时间
15 小时
 楼主| 发表于 2018-5-30 16:40:51 | 显示全部楼层
struct Port_MakeUp
{
  volatile char P31:1;       
  volatile char P00:1;       
  volatile char P01:1;                          
  volatile char P02:1;       
  volatile char P03:1;       
  volatile char P06:1;       
  volatile char P07:1;       
  volatile char P34:1;                                                         
};
typedef struct Port_MakeUp LED;
我想使用位域的方法,但是下一步,怎么弄都不行,请高手看下,这个方法可行吗?
回复

使用道具 举报

27

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
320
金钱
320
注册时间
2018-2-1
在线时间
67 小时
发表于 2018-6-6 15:11:08 | 显示全部楼层
简单的方法就能实现的东西,搞得那么复杂干嘛?
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2018-6-25 14:38:16 | 显示全部楼层
pcbzy 发表于 2018-5-30 10:46
不好意思,每个switch的分支后面忘了加break;了。
什么叫库里不允许用sbit了?用sbit也只是像用define一样 ...

P0^0是一个地址,怎么可能直接使用
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-6-5
在线时间
1 小时
发表于 2018-8-18 22:45:12 | 显示全部楼层
速度这个用一个定时器和两个按键 一个加 一个减
for(;;)
{
t0=0;
while(t0%iTime!=0);
}
iTime 把这个保存到EEPROM中 , 开机直接读 .
fhh学习中......
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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