|
本帖最后由 i7gly 于 2015-11-26 11:41 编辑
最近有个案子要使用义隆153芯片,1K ROM 32Byte RAM,模拟5路PWM,红外解码,IIC,资源勉强够用.这款芯片大家都推荐汇编语言来编程,可我偏偏要用C,然后就被啪啪啪的打脸了,,,
路漫漫其修远兮,写好构架,编译,RAM不够?我明明只用了23Byte!!!然后上网查了下,编译器本身要占16Byte RAM,所以只能用32-16 = 16Byte RAM.我擦.竟然还有如此厚颜无耻的编译器!好吧,我忍了,谁叫我汇编不精.优化优化后,嘿嘿,刚刚好16Byte,编译,,,艹,当时我就想摔电脑了!!!编译器苦苦哀求:哥,再留3字节给我,中断时我还要保存保存状态寄存器呢!我当时就火大了,你TM的明明已经占用了16Byte了,你竟然出入栈都还向我要,你拿RAM去勾引妹子吗!!!
啪啪啪,脸被打肿后我只能忍着巨痛使用13Byte的RAM写完了这个案子.汇编不好真是苦逼,连编译器都欺负人.
下面送上这个案子使用的红外解码程序,只占用3.5Byte的RAM
采用轮询方式,例子是0.2ms轮询一次,修改时间参数可改动轮询时间.
- #define READ_IR R62 //定义红外接收管脚
- unsigned char ir_step; //解码步
- unsigned char ir_code_cnt; //解码计时
- unsigned char ir_table; //解码值
- bit ir_status; //状态
- bit ir_pin_old; //管脚
- bit ir_pin_now; //管脚
- bit ir_bit_ok; //接收到1 BIT
- void Ir_Code(void)
- {
- if(ir_code_cnt<255)
- ir_code_cnt ++; //脉宽计时
- ir_pin_now = READ_IR; //读取IO状态
- if((ir_pin_now) && (ir_pin_now != ir_pin_old)) //捕捉脉冲上升沿
- {
- if(ir_code_cnt < 8) //脉冲1.125ms, -> 0
- {
- ir_bit_ok = 1; //读取到1 bit
- ir_pin_old = 0; //此处为借用变量
- }
- else if(ir_code_cnt < 16) //脉冲2.25ms, -> 1
- {
- ir_bit_ok = 1;
- ir_pin_old = 1;
- }
- if(ir_code_cnt > 56) //脉冲13.5ms, -> 包头
- { //计时时间一定要适当放宽
- ir_step=0; //解码步复位
- }
- ir_code_cnt = 0; //计时复位
- }
- if(ir_bit_ok) //有读取到内容
- {
- ir_bit_ok = 0; //先复位
- if(ir_step < 24) //只接收24bit
- {
- ir_table >>= 1; //移位
- if(ir_pin_old) ir_table+= 0x80;
- }
- if(ir_step == 7) //第一个字节数据
- {
- if(ir_table !=0x80) ir_step = 0; //如果用户码为0x80,允许继续
- }
- if(ir_step == 15)
- {
- if(ir_table !=0x7f) ir_step = 0; //如果用户反码为0x7f,允许继续
- }
- if(ir_step == 23) //好了,接收到按键值了
- {
- ir_status = 1; //置位状态,标识可读取
- }
- if(ir_step < 255) //接收步计数
- ir_step ++;
- }
-
- ir_pin_old = ir_pin_now; //管脚状态
- }
- void main()
- {
- while(1)
- {
- if(ir_status) //如果有接收标识
- {
- ir_status = 0; //复位标识
- switch(ir_table) //键值使用
- {
- case 0x01:
- ......
- break;
- }
- }
- }
- }
- //0.2ms中断
- void _intcall interrupt(void) @ int
- {
- Ir_Code(); //中断里调用
- }
复制代码
修改理由:修改代码注释
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|