⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppm-rcpro.c

📁 一个用ATMEGA8L写的模型遥控器信号行程解读程序(12864显示)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************************
目标:用ATMEGA8单片机解读PWM,PCM,PPM串行1-8通道型号,将结果打印在12864LCD上
MCU=ATMEGA8,FOSE=NRC1M,LCD=12864,
欢迎词=“欢迎使用”
*********************************************************************************/
#include<iom8v.h>
#define uchar unsigned char
#define dat PORTB 
//中断入口
#pragma interrupt_handler int0_interrupt:2
#pragma interrupt_handler int1_interrupt:3
#pragma interrupt_handler t0_interrupt:10
//#pragma interrupt_handler adc_interrupt:15
//定义///////////////////////////////////////////////////////////////////////////
int ccc;
uchar bl,aj,t0;    //信号状态
uchar mod=0,ch=0,fs=0,xz=0;   //类型选择变量,通道选择变量,输入选择变量
uchar dj=0,dywz=0;                   //t0分频次数,登记证,=ch,打印位置
uchar cc1=0,cc2=0,cc3=0,cc4=0,cc5=0,cc6=0,cc7=0,cc8=0;
void delay_us(uchar us);
void delay_ms(uchar ms);
void e_1(void);
void e_0(void);
void rw_1(void);
void rw_0(void);
void di_1(void);
void di_0(void);
void cs1_1(void);
void cs1_0(void);
void cs2_1(void);
void cs2_0(void);
void rst_1(void);
void rst_0(void);
void lcd_csh(void);
void xsj(unsigned char dxsj);
void xzl(unsigned char zlz);
void xt_csh(void);
void hyjm(void);
void gzjm(void);
void xs(uchar xs,uchar xg,uchar yg,uchar zg,uchar sf);
void clear(uchar xw,uchar yw,uchar qx,uchar yq,uchar zy,uchar fb);
void pzy(uchar pz);
void gzdy1(void);
void gzdy2(void);
void gzdy3(void);
void gzdy4(void);
void gzdy5(void);
void gzdy6(void);
void gzdy7(void);
void gzdy8(void);
void xtjm(void);
void xmod(uchar mz);
void xch(uchar cz);
void xfs(uchar fz);
uchar smaj(void);
void xxm(uchar hz); 
void sw(uchar h1,uchar f0,uchar bl);                        //选择汉字
void xhz(uchar h,uchar x,uchar y,uchar z,uchar f);//字,X位置,Y位置,左右,反白
void xzm(uchar zm,uchar x,uchar y,uchar z,uchar f); //待写字母,X位置,Y位置,左右屏,反白
//字符数组
static uchar xssz[]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//"0",0
                     0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//"1",0
                     0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//"2",0
                     0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//"3",0
                     0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//"4",0
                     0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//"5",0
                     0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//"6",0
                     0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//"7",0
                     0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//"8",0
                     0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//"9",0
                     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//".",0/
                     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01};//"-",0/
static uchar huan[]={0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
                     0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00};//欢_1
static uchar ying[]={0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
                     0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00};//迎_2
static uchar shi[]={0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
                    0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00};//使_3
static uchar yong[]={0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
                     0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00};//用_4
static uchar xi[]={0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00,
                   0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00};//系_5
static uchar tong[]={0x20,0x30,0x2C,0xA3,0x60,0x10,0x84,0xC4,0xA4,0x9D,0x86,0x84,0xA4,0xC4,0x84,0x00,
                     0x20,0x22,0x23,0x12,0x12,0x92,0x40,0x30,0x0F,0x00,0x00,0x3F,0x40,0x41,0x70,0x00};//统_6
static uchar she[]={0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
                    0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00};//设_7
static uchar zhi[]={0x00,0x20,0x2F,0xA9,0xA9,0xAF,0xE9,0xB9,0xA9,0xAF,0xA9,0xA9,0x2F,0x20,0x00,0x00,
                    0x80,0x80,0x80,0xFF,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xFF,0x80,0x80,0x80,0x00};//置_8
static uchar lei[]={0x80,0x88,0x49,0x4A,0x2C,0x28,0x18,0xFF,0x18,0x28,0x2C,0x4A,0x49,0x88,0x08,0x00,
                    0x82,0x82,0x42,0x42,0x22,0x12,0x0A,0x07,0x0A,0x12,0x22,0x22,0x42,0xC2,0x42,0x00};//类_9
static uchar xing[]={0x10,0x12,0x92,0x7E,0x12,0x12,0xFE,0x12,0x12,0x10,0xFC,0x00,0x00,0xFF,0x00,0x00,
                     0x40,0x42,0x49,0x48,0x48,0x48,0x49,0x7E,0x48,0x48,0x48,0x4A,0x4C,0x4B,0x40,0x00};//型_10
static uchar xuan[]={0x40,0x40,0x42,0xCC,0x00,0x50,0x4E,0xC8,0x48,0x7F,0xC8,0x48,0x48,0x40,0x00,0x00,
                     0x00,0x40,0x20,0x1F,0x20,0x48,0x46,0x41,0x40,0x40,0x47,0x48,0x48,0x4E,0x40,0x00};//选_11
static uchar ze[]={0x08,0x08,0xFF,0x88,0x48,0x08,0x42,0x46,0x2A,0xD2,0x2A,0x46,0x42,0x80,0x80,0x00,
                   0x42,0x81,0x7F,0x00,0x00,0x08,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x08,0x08,0x00};//择_12
static uchar tong1[]={0x40,0x41,0xC6,0x00,0x00,0xF2,0x52,0x52,0x56,0xFA,0x5A,0x56,0xF2,0x00,0x00,0x00,
                      0x40,0x20,0x1F,0x20,0x40,0x5F,0x42,0x42,0x42,0x5F,0x4A,0x52,0x4F,0x40,0x40,0x00};//通_13
static uchar dao[]={0x40,0x42,0xCC,0x00,0x04,0x04,0xE5,0xB6,0xAC,0xA4,0xA6,0xE5,0x04,0x04,0x00,0x00,
                    0x40,0x20,0x1F,0x20,0x40,0x40,0x5F,0x4A,0x4A,0x4A,0x4A,0x5F,0x40,0x40,0x40,0x00};//道_14
static uchar shu[]={0x44,0xF4,0x4F,0xE4,0x44,0x64,0x90,0x98,0x94,0x93,0x14,0x98,0x08,0xD0,0x10,0x00,
                    0x04,0x04,0x04,0xFF,0x02,0x02,0xFF,0x4A,0x8A,0x7F,0x00,0x3F,0x80,0xFF,0x00,0x00};//输_15
static uchar ru[]={0x00,0x00,0x00,0x00,0x01,0x83,0x76,0x18,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
                   0x40,0x20,0x10,0x08,0x06,0x01,0x00,0x00,0x00,0x00,0x03,0x04,0x18,0x30,0x10,0x00};//入_16
static uchar chu[]={0x00,0x00,0xFC,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,
                    0x00,0x00,0x7E,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7E,0x00,0x00};//出_17
static uchar zhi1[]={0x00,0x04,0x04,0xF4,0x94,0x94,0x9C,0x97,0x94,0x94,0x94,0xF4,0x04,0x04,0x00,0x00,
                     0x40,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x40,0x00};//直_18
static uchar jie[]={0x08,0x08,0x08,0xFF,0x88,0x68,0x24,0x2C,0xB4,0x25,0x26,0x34,0x2C,0x24,0x20,0x00,
                     0x02,0x42,0x81,0x7F,0x02,0x82,0x8A,0x4E,0x53,0x32,0x12,0x2E,0x42,0xC2,0x02,0x00};//接_19
static uchar fan[]={0x00,0x00,0xFE,0x12,0x72,0x92,0x12,0x12,0x12,0x11,0x91,0x71,0x01,0x00,0x00,0x00,
                    0x40,0x30,0x4F,0x40,0x20,0x21,0x12,0x0C,0x0C,0x12,0x11,0x20,0x60,0x20,0x00,0x00};//反_20
static uchar xiang[]={0x00,0x00,0xFC,0x04,0x04,0xE6,0x25,0x24,0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00,
                     0x00,0x00,0x7F,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x0F,0x20,0x40,0x3F,0x00,0x00};//向_21
static uchar shou[]={0x00,0xF8,0x00,0x00,0xFF,0x00,0x40,0x30,0xDF,0x10,0x10,0x10,0xF0,0x10,0x10,0x00,
                     0x00,0x0F,0x04,0x02,0xFF,0x40,0x40,0x20,0x21,0x16,0x08,0x16,0x21,0x60,0x20,0x00};//收_22

static uchar zmsz[]={0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//"P"_1
                  0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//"M"_2           
                  0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//"C"_3          		 
                  0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00};//"W"_4              	          		 
//位写子函数(操作LCD控制线)
void e_1(void)                               //PD0=1
          {PORTD=PORTD|0x01;
           }
void e_0(void)                               //PD0=0
          {PORTD=PORTD&0xfe;
           }        
void rw_1(void)                             //PD1=1
            {PORTD=PORTD|0x02;
             }
void rw_0(void)                             //PD1=0
            {PORTD=PORTD&0xfd;
             }
void di_1(void)                             //PD4=1
            {PORTD=PORTD|0x10;
             }
void di_0(void)                             //PD4=0
            {PORTD=PORTD&0xef;
             }
void cs1_1(void)                             //PD5=1
            {PORTD=PORTD|0x20;
             }
void cs1_0(void)                             //PD5=0
            {PORTD=PORTD&0xdf;
             }
void cs2_1(void)                             //PD6=1
            {PORTD=PORTD|0x40;
             }
void cs2_0(void)                             //PD6=0
            {PORTD=PORTD&0xbf;
             }
void rst_1(void)                             //PD7=1
            {PORTD=PORTD|0x80;
             }
void rst_0(void)                             //PD7=0
            {PORTD=PORTD&0x7f;
             }
         
//延时
void delay_us(uchar us)                     //us延时分子
                {while(us--);
                 }
void delay_ms(uchar ms)                     //ms延时分子
                {while(ms--);
                 delay_us(500);
                 }  
                
void t0_interrupt()                      //PPM计时
                   {if(t0==0x04)
            		dj=1;
                    }

//INT0外部中断
void int0_interrupt()                 //下降沿触发()
                     {GIFR=GIFR&0x3f;   //清楚中断标志
                      TIMSK=TIMSK&0xfe;//TO中断禁止
                	  if(dj==1)
                         {t0=TCCR0=0x03;//系统时钟8分频---用于PPM计时
            			  }
                	  TCNT0=0;
                      } 
//INT1外部中断
void int1_interrupt()                           //上升沿触发
                     {TCCR0=0x00;         //无系统时钟
                      GIFR=GIFR&0x3f;   //清楚中断标志
                      TIMSK=TIMSK|0X01;//T0中断使能
                	  if(dj==0)
                         {TCNT0=50;      //计时5MS=80次 
                          t0=TCCR0=0x04;     //系统时钟64分频---用于5MS计时                                                                                                                                                                                                                                                     
            			  }
                	 if(dj==1)
                         {dywz=dywz+1;
                          if(dywz<=ch){switch(dywz)
                                       {case 1:cc1=TCNT0;break;
                                    	case 2:cc2=TCNT0;break;
                                    	case 3:cc3=TCNT0;break;
                                    	case 4:cc4=TCNT0;break;
                                    	case 5:cc5=TCNT0;break;
                                    	case 6:cc6=TCNT0;break;
                                    	case 7:cc7=TCNT0;break;
                                        case 8:cc8=TCNT0;break;}
            						  }
        				  
                          else {dywz=0;dj=0;t0=TCCR0=0x04;}
            			  }
                      }     	  

      
//写一个汉字
void xhz(uchar h,uchar x,uchar y,uchar z,uchar f)//字指针,X位置,Y位置,左右,反白
         {uchar bl;
          pzy(z);
          xzl(0xb8+y);
          xzl(0x40+x);
          for(bl=0;bl<16;bl++)
          sw(h,f,bl);
          xzl(0xb9+y);
          xzl(0x40+x);
          for(bl=16;bl<32;bl++)
          sw(h,f,bl);
          }
//汉字选择
void sw(uchar h1,uchar f0,uchar bl)      //选择汉字
        {switch(h1)
                 {case 1:xsj(huan[bl]);break;         //欢   
                  case 2:xsj(ying[bl]);break;         //迎
                  case 3:xsj(shi[bl]);break;          //使
                  case 4:xsj(yong[bl]);break;         //用
                  case 5:xsj(xi[bl]);break;           //系
                  case 6:xsj(tong[bl]);break;         //统
                  case 7:xsj(she[bl]);break;          //设
                  case 8:xsj(zhi[bl]);break;          //置
                  case 9:xsj(lei[bl]);break;          //类
                  case 10:xsj(xing[bl]);break;        //型
                  case 11:xsj(xuan[bl]);break;        //选
                  case 12:xsj(ze[bl]);break;          //择
                  case 13:if(f0==1)xsj(tong1[bl]);else xsj(~tong1[bl]);break;  //通
                  case 14:if(f0==1)xsj(dao[bl]);else xsj(~dao[bl]);break;      //道
                  case 15:if(f0==1)xsj(shu[bl]);else xsj(~shu[bl]);break;      //输
                  case 16:if(f0==1)xsj(ru[bl]);else xsj(~ru[bl]);break;        //入
                  case 17:if(f0==1)xsj(chu[bl]);else xsj(~chu[bl]);break;      //出
                  case 18:if(f0==1)xsj(zhi1[bl]);else xsj(~zhi1[bl]);break;    //直
                  case 19:if(f0==1)xsj(jie[bl]);else xsj(~jie[bl]);break;      //接
                  case 20:if(f0==1)xsj(fan[bl]);else xsj(~fan[bl]);break;      //反
                  case 21:if(f0==1)xsj(xiang[bl]);else xsj(~xiang[bl]);break;  //向
                  case 22:if(f0==1)xsj(shou[bl]);else xsj(~shou[bl]);break;    //收
                  default:              break;   
                  }
         }
//12864LCD初始化
void lcd_csh(void)             
             {PORTB=DDRB=0xff;
              delay_ms(10);
              rst_0();
              delay_ms(10);
              rst_1();
              delay_ms(10);
              cs1_1();
              cs2_1();
              xzl(0x3f);                //开显示
              clear(0,0,64,8,2,1);        //清除屏幕//////////////////////
              xzl(0xb8);                //页地址=0
              xzl(0xc0);                //X地址=0 
              xzl(0x40);                //Y地址=0
              }
//清除屏幕    xzl(0x3e);为关闭LCD指令
//注意——————清楚屏幕指令只有片选信号未选种才有效,和写指令、数据相反
void clear(uchar xw,uchar yw,uchar qx,uchar yq,uchar zy,uchar fb)
           {uchar bl,lb;                 //实物用此清除屏幕函数
            if(zy==1)
            {cs1_1();cs2_0();}
            else if(zy==0)
            {cs1_0();cs2_1();}
            else if(zy==2)
            {cs1_1();cs2_1();}
            for(lb=0;lb<yq;lb++)
        	{
            xzl(0xb8+yw);
            xzl(0x40+xw);
            for(bl=0;bl<qx;bl++)
                {if(fb==1)xsj(0x00);else xsj(0xff);}
            yw=yw+1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -