5144|14

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

信号灯控制电路如下图(在附件中)所示,其功能是当按下不同的键时发光二极管有不同的亮灭规律。按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语言怎么写啊?
此帖出自编程基础论坛

最新回复

#include #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   详情 回复 发表于 2008-7-23 15:02
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
小弟来试试.
#include
#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;
       
       
        }


}
此帖出自编程基础论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
能解释一下吗,不好意思,因为是新手,不太了解单片机
此帖出自编程基础论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
很急?又是新手?是项目?还是自学?
是项目的话,这里的人(包括我)不会给代码你,除非有报酬的。
自学的话,这里的人(包括我)乐于帮助你,不过你的方式不对。就好像连1+1=2都不会算,却来问歌德巴赫猜想怎么证明一样。让我们从何帮起呢?
此帖出自编程基础论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
确切的说我还是一个在校的大学生,也没什么知识,更不会说做什么项目,有个作业布置下来了,只是不知道从哪个方面考虑而已.你的言辞不必那么偏激吧.你不想帮助我就算了,没必要在这里说什么风凉话
此帖出自编程基础论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,这里的气氛不太好啊.
这位同学你有用太激动,那个朋友没有针对你的意思.他不是也说了吗,如果是学习,他也是很乐于帮助你的.
你所说的"不知道从哪个方面考虑"我很理解,相信哪个初学者还不都是一样,想学好,却不知从何入手.
慢慢来,学习一项细活儿,得一点一点来.

你们的作业的目的是什么? 是只想把这段汇编程序转成C,还是说要理解一个需求到如何程序实现?
此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵,这里的气氛不太好啊.  
这位同学你不用太激动,那个朋友没有针对你的意思.他不是也说了吗,如果是学习,他也是很乐于帮助你的.
你所说的"不知道从哪个方面考虑"我很理解,相信哪个初学者还不都是一样,想学好,却不知从何入手.
慢慢来,学习一项细活儿,得一点一点来.

你们的作业的目的是什么? 是只想把这段汇编程序转成C,还是说要理解一个需求到如何程序实现?
此帖出自编程基础论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢楼上的,我们作业的目的也只是把这段汇编变为C,只是我很久都没编程了,所以我感到有点困难.您说的很对,学习单片机得一步一步来,我现在也正在努力中,谢谢你们的指点,刚才只是有点气愤而已,呵呵
此帖出自编程基础论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
开个玩笑:气愤可解决不了任何问题,有时反而会吓跑想帮助你的人。

没有关系的,以后有什么问题大胆的问吧,被人家笑话那又有什么,谁让咱不懂呢。如果被人笑笑能弄个明白,那也值了!
古人不是还说什么“不耻下问”吗。
加油吧,一分努力一分收获。
此帖出自编程基础论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
加油
此帖出自编程基础论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 
呵呵,楼主还好啦
可怜我呀连问题都发现不了
于是就没得问了
此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
这有什么好气愤的!~
此帖出自编程基础论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 
三人行,必有我师焉!
此帖出自编程基础论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
取反,位运算。核心就是这些了。又没有什么算法,把寄存器地址定义好一切ok
此帖出自编程基础论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
#include
#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;
}


}
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
直播报名最后1周:艾迈斯欧司朗 OSP 开放协议,从氛围灯动态照明到传感器交互融合
直播时间:4月22日(周二)10:00
直播奖励:京东卡、蓝牙温湿度计、定制水杯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表