哈罗CQ火腿社区  

返回   哈罗CQ火腿社区 > 火腿技术区 > 单片机与自动控制
用户名
密码
注册 常见问题 会员列表 日历 标记论坛为已读

回复
 
主题工具 搜索本主题 显示模式
旧 2008-08-16, 16:14   #1
xjl
骨灰级火腿(*******)
 
xjl的头像
 
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
xjl is off the scale
请教关于单片c的问题

看了不少朋友都在用AVR,也想学习学习,并想从此抛弃汇编也使用高级的C.
这两天找了两个简单的例程看了一下,有点疑惑向坛内大侠请教.
C语言又称为函数语言,某一个功能可以用一个函数来完成,当用到这个功能时可以调用这个功能函数.这样问题来了.比如调用LED数码管显示函数使数码管显示,然后再调用其他函数完成其他功能,如果有多个其他功能函数要调用,并执行时间超过0.1秒,这样就会造成LED数码管闪烁.编译器在编译时会自动处理类似问题吗?还是象汇编一样要每0.1秒内要调用一次LED显示子程序? 或采取其他措施?
谢谢
__________________
呼号:BD2XJL
姓名:胡姣龙
通信方式:辽宁抚顺133信箱
电话:0413-7701635(宅电)
xjl离线中   回复时引用此帖
旧 2008-08-16, 16:21   #2
BG4UVR
HELLOCQ Honor Roll
 
BG4UVR的头像
 
加入日期: 2004-06-24
帖子: 4,987
BG4UVR is on a distinguished road
首先,编译器并不会去自动处理。

深入一点,其实这并不是语言的区别,就算是使用汇编也一样会碰到这种问题。对于时间上要求严格的步骤,比如数码管的扫描,一般是要放在定时器中断中去执行的。
BG4UVR离线中   回复时引用此帖
旧 2008-08-16, 16:39   #3
BG4XDO
骨灰级火腿(*******)
 
BG4XDO的头像
 
加入日期: 2006-01-25
您的住址: 江苏连云港东海
帖子: 847
BG4XDO is on a distinguished road
可以考虑用静态驱动
__________________
***********
陈明=bg4xdo<AT>163.com
QQ469785391
***********
BG4XDO离线中   回复时引用此帖
旧 2008-08-16, 16:47   #4
xjl
骨灰级火腿(*******)
 
xjl的头像
 
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
xjl is off the scale
哦,明白了,谢谢
__________________
呼号:BD2XJL
姓名:胡姣龙
通信方式:辽宁抚顺133信箱
电话:0413-7701635(宅电)
xjl离线中   回复时引用此帖
旧 2008-08-16, 16:57   #5
albert
火腿长老(*********)
 
albert的头像
 
加入日期: 2003-03-20
您的住址: 下面有。
帖子: 1,974
albert is off the scale
跳出单片机来说这个问题那就是多线程/多进程编程。而且对实时性要求高的那种~~
albert现在在线   回复时引用此帖
旧 2008-08-22, 23:54   #6
hahamm
菜鸟(*)
 
加入日期: 2008-06-29
帖子: 18
hahamm is on a distinguished road
AVR运行很快,多位数码管用循环显示,一位有2毫秒可以了,在2毫秒内可以运行其他函数,例如按键处理等,就看程序总体安排了。
hahamm离线中   回复时引用此帖
旧 2008-08-23, 00:39   #7
小比尔/5
水池
 
小比尔/5的头像
 
加入日期: 2006-06-17
您的住址: 浙江传媒学院挖煤学院
帖子: 1,145
小比尔/5 is on a distinguished road
搞个RTOS
__________________
我的呼号:BG5-1-62178。
开放 包容 合作~希望梦想能成真!
电话:133,3606,3062
E-Mail:zhuangzhihui<小老鼠>263.net
博客搬家中,暂停服务。
小比尔/5离线中   回复时引用此帖
旧 2008-08-25, 17:00   #8
xjl
骨灰级火腿(*******)
 
xjl的头像
 
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
xjl is off the scale
引用:
作者hahamm
AVR运行很快,多位数码管用循环显示,一位有2毫秒可以了,在2毫秒内可以运行其他函数,例如按键处理等,就看程序总体安排了。

我很菜,刚刚接触C,所以不是很懂,如果用汇编能理解,但是用C还是不很理解.是否每显示一位后跳出显示函数,执行其他函数,然后循环执行显示函数显示下一位?
__________________
呼号:BD2XJL
姓名:胡姣龙
通信方式:辽宁抚顺133信箱
电话:0413-7701635(宅电)
xjl离线中   回复时引用此帖
旧 2008-08-25, 17:30   #9
xjl
骨灰级火腿(*******)
 
xjl的头像
 
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
xjl is off the scale
引用:
作者小比尔/5
搞个RTOS

老大不要笑我,我真的不懂.能讲的通俗一点吗?
__________________
呼号:BD2XJL
姓名:胡姣龙
通信方式:辽宁抚顺133信箱
电话:0413-7701635(宅电)
xjl离线中   回复时引用此帖
旧 2008-08-25, 21:45   #10
小比尔/5
水池
 
小比尔/5的头像
 
加入日期: 2006-06-17
您的住址: 浙江传媒学院挖煤学院
帖子: 1,145
小比尔/5 is on a distinguished road
引用:
作者xjl
老大不要笑我,我真的不懂.能讲的通俗一点吗?


不好意思,卖弄了。
其实C用好了比汇编简单,汇编老要研究怎么传递参数,C可以直接利用参数来传
比如说

假设有个动态显示的函数(右侧用汇编类比):
void Display(unsigned char num);  // DISPLAY: MOV P0,A/ RET
一个扫描的函数:
unsigned char ScanKey();  // SCANKEY: .../ RET
一个延时函数:
void Delay();  // DELAY: MOV R2,#XX .../ DJNZ ... /RET

那么你可以这样:
while(1)  // 主程序循环  MAIN:
{
  unsigned char i,key;
  P2=0x80;  // MOV P2,#80H
  for(i=4;i>0;i--)  // 显示循环  FOR:
  {
    Display(...);  // 显示一位  MOV A,.../ ACALL DISPLAY
    key=ScanKey();  // 扫键  ACALL SCANKEY/ PUSH ACC
    Delay();  // 延时  ACALL DELAY/ POP ACC
    if(key!=0) key=ScanKey();  // 键消抖 JZ MAIN0/ ACALL SCANKEY / MAIN0:...
    switch(key)  // ...
    {
      case UP: AddNum();break;  // 加1  CJNE MAIN1/ ACALL ADDNUM
      case DOWN: ...;break;  // ...  MAIN1: CJNZ MAIN2/ ACALL ...
      case LEFT: ...;break;  // ...
      case RIGHT: ...;break;  // ...
      case ...
      default: break;
    }
    P2=P2>>1;  // 字位码右移  // MOV A,P2/ RL A/ MOV P2,A
  } /* for */  // DJNZ R5, FOR
}  // AJMP MAIN

整个流程和汇编其实是一样的,这个过程由你自己安排。当然,处理按键的时候,显示扫描就会受到影响。

所以如果要处理和动态显示互不影响,就要把显示放到中断去,当然也可以用移位寄存器搞静态显示,就是硬件会复杂些。

再疯狂一点的,要“同时”处理多个乱七八糟的对时间要求都很高的任务,就要搞实时操作系统RTOS了(卖弄了,一般是用不到啦~
__________________
我的呼号:BG5-1-62178。
开放 包容 合作~希望梦想能成真!
电话:133,3606,3062
E-Mail:zhuangzhihui<小老鼠>263.net
博客搬家中,暂停服务。

此帖于 2008-08-25 22:18 被 小比尔/5 编辑.
小比尔/5离线中   回复时引用此帖
旧 2008-08-26, 08:37   #11
xjl
骨灰级火腿(*******)
 
xjl的头像
 
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
xjl is off the scale
引用:
作者小比尔/5
不好意思,卖弄了。
其实C用好了比汇编简单,汇编老要研究怎么传递参数,C可以直接利用参数来传
比如说

假设有个动态显示的函数(右侧用汇编类比):
void Display(unsigned char num);  // DISPLAY: MOV P0,A/ RET
一个扫描的函数:
unsigned char ScanKey();  // SCANKEY: .../ RET
一个延时函数:
void Delay();  // DELAY: MOV R2,#XX .../ DJNZ ... /RET

那么你可以这样:
while(1)  // 主程序循环  MAIN:
{
  unsigned char i,key;
  P2=0x80;  // MOV P2,#80H
  for(i=4;i>0;i--)  // 显示循环  FOR:
  {
    Display(...);  // 显示一位  MOV A,.../ ACALL DISPLAY
    key=ScanKey();  // 扫键  ACALL SCANKEY/ PUSH ACC
    Delay();  // 延时  ACALL DELAY/ POP ACC
    if(key!=0) key=ScanKey();  // 键消抖 JZ MAIN0/ ACALL SCANKEY / MAIN0:...
    switch(key)  // ...
    {
      case UP: AddNum();break;  // 加1  CJNE MAIN1/ ACALL ADDNUM
      case DOWN: ...;break;  // ...  MAIN1: CJNZ MAIN2/ ACALL ...
      case LEFT: ...;break;  // ...
      case RIGHT: ...;break;  // ...
      case ...
      default: break;
    }
    P2=P2>>1;  // 字位码右移  // MOV A,P2/ RL A/ MOV P2,A
  } /* for */  // DJNZ R5, FOR
}  // AJMP MAIN

整个流程和汇编其实是一样的,这个过程由你自己安排。当然,处理按键的时候,显示扫描就会受到影响。

所以如果要处理和动态显示互不影响,就要把显示放到中断去,当然也可以用移位寄存器搞静态显示,就是硬件会复杂些。

再疯狂一点的,要“同时”处理多个乱七八糟的对时间要求都很高的任务,就要搞实时操作系统RTOS了(卖弄了,一般是用不到啦~

谢谢详细的讲解,明白了.谢谢!!! 并不是您卖弄,是我还有很长的路要走,很多的知识要学呀
__________________
呼号:BD2XJL
姓名:胡姣龙
通信方式:辽宁抚顺133信箱
电话:0413-7701635(宅电)
xjl离线中   回复时引用此帖
旧 2008-08-26, 13:27   #12
antforum
口水级火腿(***)
 
加入日期: 2005-03-07
您的住址: 广东深圳
帖子: 157
antforum is on a distinguished road
用c比汇编更方便
antforum离线中   回复时引用此帖
回复
Google
    


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式 对此主题评分
对此主题评分:

发帖规则
不可以发起新主题
不可以回复主题
不可以上传附件
不可以编辑你的帖子

vB 代码打开
[IMG]代码打开
HTML代码关闭
论坛跳转



所有的时间均为北京时间。 现在的时间是11:36.


vBulletin Version 3.0.7 Translated by NewVBB.com™ 2008.
Translated and Hacked by: Ztbbs
站长:BA7IX BA7NQ BD7CE BD8GA
备案序号:粤ICP备05043810号
;