📄 ppm-rcpro.c
字号:
/*********************************************************************************
目标:用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 + -