完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
***it ENLED = P1^4; ***it ADDR3 = P1^3; ***it ADDR2 = P1^2; ***it ADDR1 = P1^1; ***it ADDR0 = P1^0; void shiftleft(unsigned char *p); void main() { unsigned int i=0; unsigned char buf=0x01; TMOD = 0X01; TH0 = 0XFC; TL0 = 0X67; TR0 = 1; ENLED = 0; ADDR3 = 1; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; while(1) { P0=~buf; for(i=0;i<40000;i++); while(1) { if(TF0 ==1) { TF0 = 0; TH0 = 0XFC; TL0 = 0X67; i++; if(i==1000) { i=0; } break; shiftleft(&buf); } } if(buf == 0) { buf= 0x01; } } } void shiftleft(unsigned char *p) { *p = *p <<1; } |
|
相关推荐
13个回答
|
|
Ghost# 发表于 2016-1-22 11:05 OK, 用for延时写出来是OK的,那说明,你的控制代码和实现led流水的部分是OK的; 其实看你的中断程序觉得有些混乱,接下来,去分析下,正确的中断延时该怎么去写; 楼主,不急,基础这个东西就是满满积累的,这个部分,一点点的去查自己的问题,然后修正,会收获更多,我就不举例子了,只给楼主参考的一些方向,期待楼主一点点的独立解决此问题。
最佳答案
|
|
|
|
延时用中断写的, 直接用for 循环的方式延时,楼主试过吗? 结果怎么样? 个人觉得是这里中断延时的写法有错误。
|
|
|
|
*p = *p <<1; 楼主你查过优先级吗?
|
|
|
|
break; 是干什么用的?
|
|
|
|
|
|
|
|
|
|
|
|
在这里我将定时器写在循环里面 每次都去判断间隔1s 这个原来的写法就是用的for非精确延时 结果是没有问题的 在这里我的思路是将原来的for非精确延时改写成精确延时 这样我就理不清楚了 求指教啊 刚开始学习单片机 c语言学的也不扎实 问题很多 |
|
|
|
break后面的语句执行不到啊?这个是你要的结果吗?
|
|
|
|
柠檬守护 发表于 2016-1-22 11:14 我刚开始接触这个 有点不太明白 还望大神指导 while(1)弄好了 { P0=~buf; if(TF0 ==1) { TF0 = 0; TH0 = 0XFC; TL0 = 0X67; i++; if(i==1000) { i=0; shiftleft(&buf); } } if(buf == 0) { buf= 0x01; } } } void shiftleft(unsigned char *p) { *p = (*p) <<1; } |
|
|
|
|
|
|
|
|
|
|
|
呵呵,学习看看!!!!!!!!!!!!!!!!
|
|
|
|
咋啦 我刚刚学习单片机 我就是虚心学习一下 看不懂程序 呵呵是啥个意思? |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1240 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1175 浏览 3 评论
2256 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1342 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1764 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 02:38 , Processed in 1.039635 second(s), Total 96, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号