请单片机高手帮忙看看这个控制电路怎么用C语言来写程序?急急急!!!在线等~~

lc_617 2008-05-25 10:15:31
信号灯控制电路如下图(在附件中)所示,其功能是当按下不同的键时发光二极管有不同的亮灭规律。按1号键LED从左到右依次亮,按2号键从右到左依次亮,按3号键闪烁,按4号键呈流水追逐效果。
解:电路图中P1口分别接了4个开关,每个开关都有相对应的功能,当某一开关闭合时,相应的口线变为低电平,而其他口线依然为高电平,因此,可以用4条JNB指令对开关状态进行检测。如果某一按键按下,则跳转执行其所对应的控制功能。八个发光二极管经74LS04接P2口,主要因单片机的驱动能力较差,故用74LS04来加大驱动能力。P2口输出控制信号控制发光规律。
程序设计流程图在附件里
ORG 0000H
MOV SP, #60H
MOV P2, #00H
MOV P1, #0FH
START: JNB P1.0, A0 ; 如P1.0键按下,就跳至A0
JNB P1.1, A1 ; 如P1.1键按下,就跳至A1
JNB P1.2, A2 ; 如P1.2键按下,就跳至A2
JNB P1.3, A3 ; 如P1.3键按下,就跳至A3
SJMP START
********** 左移 *******************************
A0: MOV DPTR, #TAB ; 左移常数表首地址送DPTR
ACALL DISP
SJMP START
********* 右移 ********************************
A1: MOV DPTR, #TAB1 ; 右移常数表首地址送DPTR
ACALL DISP
SJMP START
********* 闪烁 ********************************
A2: MOV DPTR, #TAB2 ; 闪烁常数表首地址送DPTR
ACALL DISP
SJMP START
******** 流水追逐 *****************************
A3: MOV DPTR, #TAB3 ; 流水追逐常数表首地址送DPTR
ACALL DISP
SJMP START
********* LED显示控制子程序 *****************
功能:根据常数表控制P2口的LED发光
入口:常数表的地址送到DPTR
出口:无
********************************************
DISP: CLR A
MOVC A, @A+DPTR
CJNE A,#0AH,LOOP1
RET
LOOP1: MOV P2,A
MOV R3,#20
ACALL DELAY
INC DPTR
JMP DISP


DELAY: MOV R4,#20
D1: MOV R5,#248
DJNZ R5, $
DJNZ R4, D1
DJNZ R3, DELAY
RET
TAB : DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0AH ; 左移
TAB1: DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH,0AH ; 右移
TAB2: DB 0FFH,00H,0FFH,00H,0FFH,00H,0FFH,00H,0AH ; 闪烁
TAB3: DB 01H,02H,06H,08H,10H,20H,60H,80H,0AH ; 流水追逐
END
以上是汇编代码,但是用C语言怎么写啊?
...全文
356 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
anykao646 2008-07-23
  • 打赏
  • 举报
回复
#include <reg51.h>
#define uchar unsigned char

uchar tmp=0x01,ab,flag=0;
uchar p1,i,p2=0x80;
void delay()
{
unsigned int cnt=30000;
while(cnt--);
}
void led0()
{
for(i=0;i <8;i++)
{
}
return ;
}

void led1()
{

return ;
}
void led2()
{return;}
void led3()
{return;}

void main()
{P2=0X00;

while(1)
if((ab=0x0f&P1)==0x0f)
;
else
switch(ab)
{
case(0x0e):led0();break;
case(0x0d):led1();break;
case(0x0b):led2();break;
case(0x07):led3();break;
}


}
yangchao_cy 2008-07-22
  • 打赏
  • 举报
回复
取反,位运算。核心就是这些了。又没有什么算法,把寄存器地址定义好一切ok
meilidexue 2008-07-22
  • 打赏
  • 举报
回复
三人行,必有我师焉!
HeartFlyFly 2008-07-19
  • 打赏
  • 举报
回复
这有什么好气愤的!~
hualei24 2008-07-19
  • 打赏
  • 举报
回复
呵呵,楼主还好啦
可怜我呀连问题都发现不了
于是就没得问了
fycom200 2008-05-28
  • 打赏
  • 举报
回复
加油
shuiyan 2008-05-26
  • 打赏
  • 举报
回复
很急?又是新手?是项目?还是自学?
是项目的话,这里的人(包括我)不会给代码你,除非有报酬的。
自学的话,这里的人(包括我)乐于帮助你,不过你的方式不对。就好像连1+1=2都不会算,却来问歌德巴赫猜想怎么证明一样。让我们从何帮起呢?
SmallU 2008-05-26
  • 打赏
  • 举报
回复
开个玩笑:气愤可解决不了任何问题,有时反而会吓跑想帮助你的人。

没有关系的,以后有什么问题大胆的问吧,被人家笑话那又有什么,谁让咱不懂呢。如果被人笑笑能弄个明白,那也值了!
古人不是还说什么“不耻下问”吗。
加油吧,一分努力一分收获。
lc_617 2008-05-26
  • 打赏
  • 举报
回复
谢谢楼上的,我们作业的目的也只是把这段汇编变为C,只是我很久都没编程了,所以我感到有点困难.您说的很对,学习单片机得一步一步来,我现在也正在努力中,谢谢你们的指点,刚才只是有点气愤而已,呵呵
SmallU 2008-05-26
  • 打赏
  • 举报
回复
呵呵,这里的气氛不太好啊.
这位同学你不用太激动,那个朋友没有针对你的意思.他不是也说了吗,如果是学习,他也是很乐于帮助你的.
你所说的"不知道从哪个方面考虑"我很理解,相信哪个初学者还不都是一样,想学好,却不知从何入手.
慢慢来,学习一项细活儿,得一点一点来.

你们的作业的目的是什么? 是只想把这段汇编程序转成C,还是说要理解一个需求到如何程序实现?
SmallU 2008-05-26
  • 打赏
  • 举报
回复
呵呵,这里的气氛不太好啊.
这位同学你有用太激动,那个朋友没有针对你的意思.他不是也说了吗,如果是学习,他也是很乐于帮助你的.
你所说的"不知道从哪个方面考虑"我很理解,相信哪个初学者还不都是一样,想学好,却不知从何入手.
慢慢来,学习一项细活儿,得一点一点来.

你们的作业的目的是什么? 是只想把这段汇编程序转成C,还是说要理解一个需求到如何程序实现?
lc_617 2008-05-26
  • 打赏
  • 举报
回复
确切的说我还是一个在校的大学生,也没什么知识,更不会说做什么项目,有个作业布置下来了,只是不知道从哪个方面考虑而已.你的言辞不必那么偏激吧.你不想帮助我就算了,没必要在这里说什么风凉话
lc_617 2008-05-25
  • 打赏
  • 举报
回复
能解释一下吗,不好意思,因为是新手,不太了解单片机
seekii 2008-05-25
  • 打赏
  • 举报
回复
小弟来试试.
#include<reg51.h>
#define uchar unsigned char
uchar tab[]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0x0FF,0x0A };
uchar tmp=0x90;//p1 address;
uchar p1,i,p2=0x01;
void delay()
{
unsigned int cnt=30000;
while(cnt--);
}
void deal0()
{
for(i=0;i<8;i++)
{ p2=~p2;
P2=p2;
delay();
p2=~p2;
p2=p2<<1;
}
}
void deal1()
{
for(i=0;i<8;i++)
{ p2=~p2;
P2=p2;
delay();
p2=~p2;
p2=p2>>1;
}
}
void deal2()
{}
void deal3()
{}

void main()
{
p1=tmp&0x0f;
if(p1==0x0f)
while(1);
else
switch(p1)
{
case(0x0e):deal0();break;
case(0x0d):deal1();break;
case(0x0b):deal2();break;
case(0x07):deal3();break;


}


}

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧