![]() |
|
|
#1 |
|
骨灰级火腿(*******)
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
![]() |
请教关于单片c的问题
看了不少朋友都在用AVR,也想学习学习,并想从此抛弃汇编也使用高级的C.
这两天找了两个简单的例程看了一下,有点疑惑向坛内大侠请教. C语言又称为函数语言,某一个功能可以用一个函数来完成,当用到这个功能时可以调用这个功能函数.这样问题来了.比如调用LED数码管显示函数使数码管显示,然后再调用其他函数完成其他功能,如果有多个其他功能函数要调用,并执行时间超过0.1秒,这样就会造成LED数码管闪烁.编译器在编译时会自动处理类似问题吗?还是象汇编一样要每0.1秒内要调用一次LED显示子程序? 或采取其他措施? 谢谢 ![]()
__________________
呼号:BD2XJL 姓名:胡姣龙 通信方式:辽宁抚顺133信箱 电话:0413-7701635(宅电) |
|
|
|
|
|
#2 |
|
HELLOCQ Honor Roll
加入日期: 2004-06-24
帖子: 4,987
![]() |
首先,编译器并不会去自动处理。
深入一点,其实这并不是语言的区别,就算是使用汇编也一样会碰到这种问题。对于时间上要求严格的步骤,比如数码管的扫描,一般是要放在定时器中断中去执行的。 |
|
|
|
|
|
#3 |
|
骨灰级火腿(*******)
加入日期: 2006-01-25
您的住址: 江苏连云港东海
帖子: 847
![]() |
可以考虑用静态驱动
__________________
*********** 陈明=bg4xdo<AT>163.com QQ469785391 *********** |
|
|
|
|
|
#4 |
|
骨灰级火腿(*******)
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
![]() |
哦,明白了,谢谢
![]()
__________________
呼号:BD2XJL 姓名:胡姣龙 通信方式:辽宁抚顺133信箱 电话:0413-7701635(宅电) |
|
|
|
|
|
#5 |
|
火腿长老(*********)
加入日期: 2003-03-20
您的住址: 下面有。
帖子: 1,974
![]() |
跳出单片机来说这个问题那就是多线程/多进程编程。而且对实时性要求高的那种~~
|
|
|
|
|
|
#6 |
|
菜鸟(*)
加入日期: 2008-06-29
帖子: 18
![]() |
AVR运行很快,多位数码管用循环显示,一位有2毫秒可以了,在2毫秒内可以运行其他函数,例如按键处理等,就看程序总体安排了。
|
|
|
|
|
|
#7 |
|
水池
加入日期: 2006-06-17
您的住址: 浙江传媒学院挖煤学院
帖子: 1,145
![]() |
搞个RTOS
__________________
我的呼号:BG5-1-62178。 开放 包容 合作~希望梦想能成真! 电话:133,3606,3062 E-Mail:zhuangzhihui<小老鼠>263.net 博客搬家中,暂停服务。 |
|
|
|
|
|
#8 | |
|
骨灰级火腿(*******)
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
![]() |
引用:
我很菜,刚刚接触C,所以不是很懂,如果用汇编能理解,但是用C还是不很理解.是否每显示一位后跳出显示函数,执行其他函数,然后循环执行显示函数显示下一位? ![]()
__________________
呼号:BD2XJL 姓名:胡姣龙 通信方式:辽宁抚顺133信箱 电话:0413-7701635(宅电) |
|
|
|
|
|
|
#9 | |
|
骨灰级火腿(*******)
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
![]() |
引用:
老大不要笑我,我真的不懂.能讲的通俗一点吗? ![]()
__________________
呼号:BD2XJL 姓名:胡姣龙 通信方式:辽宁抚顺133信箱 电话:0413-7701635(宅电) |
|
|
|
|
|
|
#10 | |
|
水池
加入日期: 2006-06-17
您的住址: 浙江传媒学院挖煤学院
帖子: 1,145
![]() |
引用:
不好意思,卖弄了。 其实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 编辑. |
|
|
|
|
|
|
#11 | |
|
骨灰级火腿(*******)
加入日期: 2002-12-18
您的住址: 抚顺
帖子: 817
![]() |
引用:
谢谢详细的讲解,明白了.谢谢!!! 并不是您卖弄,是我还有很长的路要走,很多的知识要学呀 ![]()
__________________
呼号:BD2XJL 姓名:胡姣龙 通信方式:辽宁抚顺133信箱 电话:0413-7701635(宅电) |
|
|
|
|
|
|
#12 |
|
口水级火腿(***)
加入日期: 2005-03-07
您的住址: 广东深圳
帖子: 157
![]() |
用c比汇编更方便
|
|
|
|
;