完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是我写的一个红外解码的程序,但是编译出现了奇葩错误,求大神指导啊!
#include #include #include #include #include #include #include #include #include //头文件 #define uint unsigned int #define uchar unsigned char #define set_h(i,j) i|=(1< #define LCDEN_L set_l(PORTD,4) #define RS_H set_h(PORTD,6) #define RS_L set_l(PORTD,6) #define RW_H set_h(PORTD,5) #define RW_L set_l(PORTD,5) uchar irtime; //时间计数变量 uchar irreceok; //接收完成标志 uchar irprosok; //转换完成标志 uchar irdata[33]; //时间存放数组 uchar bitnum; //数据位 uchar ircode[4]; //解码 uchar di***uff[8]; //显缓存 uchar startflag; /****************** 1ms延时 ***************************/ void delay_1ms(void) { unsigned int i; for(i=1;i<416;i++); } /**************** 1us延时 ***************************/ void delay_1us(void) { asm("nop"); } /***************** nms延时 ***************************/ void delay_nms(uint z) { uint j; for(j=0;j } /*************** nus延时 ***************************/ void delay_nus(uint z) { uint i; for(i=0;i } /***************** 写指令 **************************/ void write_com(uchar com) { delay_nms(3); RS_L; RW_L; LCDEN_L; PORTB = com; delay_nms(3); LCDEN_H; delay_nms(3); LCDEN_L; } /**************** 写数据 *****************************/ void write_date(uchar dat) { delay_1ms();; RS_H; RW_L; LCDEN_L; PORTB = dat; delay_1ms(); LCDEN_H; delay_1ms(); LCDEN_L; } /***************** 定行定列显示 *********************/ void write_string(uchar h,uchar l,uchar data) //输入行,列,数据 { if(h==1) h = 0x80; else h = 0xc0; h = h+l; write_com(h); write_date(data); } /**************** 定行定列显示数组 *****************/ void write_stringtable(uchar h,uchar l,uchar *s) { if(h==1) h = 0x80; else h = 0xc0; h = h+l; write_com(h); while(*s) { write_date(*s); s++; } } /**************** 1602初始化 **********************/ void LCD_Initial() { write_com(0x38); delay_nms(1); write_com(0x38); delay_nms(1); write_com(0x0c); //关光标 delay_nms(1); write_com(0x06); //增量不移位 delay_nms(1); write_com(0x01); //清除LCD的显示内容 delay_nms(1); write_com(0x80); } /*************** 外部中断0初始化 ***************/ void init_int0(void) { MCUCR &=0x02; //开启外部中断触发方式为低电平触发 00低电平 03上升沿 01任意变换 02下降沿 GICR|=(1<<6); //外部中断0使能 GIFR&=~(1<<6); //中断标志位清零 SREG|=0x80; //开启总中断 } /**************定时器2中断初始化 **************/ void init_t0(void) { TCCR2=0x02; //工作方式0;8分频; TCNT2=0x00; //重置初值 TIMSK=0x40; //溢出中断使能 } /****************转换函数********************/ void irpros(void) { uchar k,i,j; uchar value; for(j=0;j<4;j++) //4bit { for(i=0;i<8;i++) //1bit { value = value>>1; if(irdata[k]>6) { value = value|0x80; } k++; } ircode[j]=value; } irprosok = 1; } /*************更新显缓存*********************/ void updata_di***uff(void) { uchar i; di***uff[0] = ircode[0]/16; di***uff[1] = ircode[0]%16; di***uff[2] = ircode[1]/16; di***uff[3] = ircode[1]%16; di***uff[4] = ircode[2]/16; di***uff[5] = ircode[2]%16; di***uff[6] = ircode[3]/16; di***uff[7] = ircode[3]%16; for(i=0;i<8;i++) { if(di***uff[i]<10) di***uff[i]=di***uff[i]+0x30; else di***uff[i]=di***uff[i]+0x37; } } int main(void) { DDRB = 0xff; DDRC = 0XFF; DDRD = 0xf0; init_int0(); init_t0(); LCD_Initial(); while(1) { if(irreceok) { irreceok=0; irpros(); } if(irprosok) { irprosok=0; updata_di***uff(); } write_stringtable(1,1,di***uff); } /****************中断服务程序*****************************/ ISR(TIMER2_OVF_vect) { irtime++; } ISR(INT0_vect) { if(startflag) { if(irtime>32) { irtime=0; bitnum=0; } irdata[bitnum]=irtime; bitnum++; irtime = 0; if(bitnum==33) { irreceok = 1; bitnum = 0; } } else { startflag = 1; irtime = 0; } } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
5178 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7795 浏览 0 评论
3074 浏览 2 评论
3125 浏览 1 评论
10107 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:26 , Processed in 0.521810 second(s), Total 45, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号