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

📄 ptr8000.c

📁 很精简的LCD12864程序!!!对大家绝对有用
💻 C
字号:
//陈广大,发射部分程序,发射信息加累加校验。
/*******************
按键使用5个键P2.4~P2.7
液晶屏P2.1~P2.3 依次是RS,RW,E,
蜂鸣器起到按键提示作用
//注意全局变量尽量少用为好
/*************火箭发射点火系统******************/
#include <STC12C5410AD.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
/*****************************/
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
bdata uchar DATA_BUF;
#define DATA7   ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
/*-----------------------------------------------
nrf905命令控制字
------------------------------------------------*/
#define WC	0x00		// Write configuration register command
#define RC	0x10		// Read  configuration register command
#define WTP	0x20		// Write TX Payload  command
#define RTP	0x21            // Read  TX Payload  command
#define WTA	0x22            // Write TX Address  command
#define RTA	0x23            // Read  TX Address  command
#define RRP	0x24            // Read  RX Payload  command
/*------------------液晶屏命令--------------------*/
#define clear   0x01  //清屏幕,约1.6ms
#define home    0x02  //光标回零(左上角)/
#define f_set   0x30  //并行、基本指令
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
/**************************端口定义***************************/
sbit P_RS=P2^1;//液晶屏
sbit P_RW=P2^3;
sbit P_E= P2^2;

sbit FMQ=P3^5; //低电平响

sbit TX_EN=P2^0;//PTR8000控制脚
sbit PWR= P1^2;
sbit TRX_CE=P1^3;

sbit MISO=P1^6;
sbit MOSI=P1^5;
sbit SCK=P1^7;
sbit CSN=P1^4;

sbit AM = P1^0;//NRF905状态IO
sbit CD = P1^1;
sbit DR = P3^7;//最好接到中断口上
data uint       T_key           = 0x0000;//秒分时标记用
data uint       second          = 0x0000;//秒位,
data uchar SendBuffer[4],screen[5],st;			// RF发送缓冲区
idata uchar str2[3];//显示字符串用
bdata     uchar ab;
sbit      abit0=ab^0;  sbit abit1=ab^1;  sbit abit2=ab^2;  sbit abit3=ab^3;
sbit      abit4=ab^4;  sbit abit5=ab^5;  sbit abit6=ab^6;  sbit abit7=ab^7;
/*******************************/
void Delay(int x)
{
     unsigned int i;
    for(i=0;i<x;i++);
}
/********************************************/
void rst_wdog(void)     //看门狗
{
WDT_CONTR=0x3c; //1.1377s
}
/*------------------------------------------*/
/* 液晶屏程序 */
/*------------------------------------------*/
void bit8_serial_input(uchar ix)
{
        data uchar i,j,nc;
        P_E=0;
        ab=ix;
        for(i=0;i<8;i++){
	                P_RW=abit7;
	                ab<<=1;
	                P_E=1;
	                for(j=0;j<10;j++)nc=0;
	                P_E=0;
	                }
}
/*-------------------------------------*/
void instruct(uchar dat)
{
        data uchar ch;
        P_RS=1;   //选通
        ch=0xf8;
        bit8_serial_input(ch);
        ch=dat&0xf0;
        bit8_serial_input(ch);
        ch=dat<<4;
        bit8_serial_input(ch);
        P_RS=0;  //结束作业
}
/****************************************/
void write_abyte(uchar dat)
{
        data uchar ch;
        P_RS=1;  //读数据--不选通
        ch=0xfa;  //RS=1 RW=0;
        bit8_serial_input(ch);
        ch=dat&0xf0;  //RS=1 RW=0;
        bit8_serial_input(ch);
        ch=dat<<4;
        bit8_serial_input(ch);
        P_RS=0;  //结束作业
}
/*---写一个汉字到x,Y坐标处其中X为8列y为4行---*/
void  write_word(uint w)
{
        data  uchar ch,cl;
        ch=w>>8;
        cl=w;
        write_abyte(ch);
        write_abyte(cl);
}
/*----- ----------------------------*/
dis_hz_str(uchar x, uchar y, uint *p_hz)
{
        data uchar loc;
        data uint *p;
        code uchar xline[5]={0,1,3,2,4};
        x=xline[x];
        instruct(home);
        loc=((x<<3)+y-9)|0x80;
        instruct(loc); p=p_hz;
        while(*p){
               write_word(*p++);
               }
}
/*------显示字母数字在x,y处------*/
void dis_str(uchar x, uchar y, uchar *str)
{
        data uchar loc,*p;
        code uchar xline[5]={0,1,3,2,4};
        p=str;
        x=xline[x];
        instruct(home);
        loc=(16*(x-1)+y-1);
        if(loc&0x01){
                  loc/=2;
                  instruct(loc|0x80);
                  write_abyte(' ');
                  }
        else{
          loc/=2;
          instruct(loc|0x80);
          }
        while(*p){
               write_abyte(*p++);
               }
}
/*----------屏初始化-----------------*/
void initial(void)
{
        data uchar i,j;
        P_RS=0;           //串行--不选通
        P_E=0;            //串行方式
        instruct(f_set);    //0x30;     //8位并行接口 基本指令
        for(i=0;i<30;i++){}
        for(i=0;i<250;i++){}
        for(i=0;i<250;i++){}
        instruct(f_set);    //0x30;     //8位并行接口 基本指令
        for(i=0;i<30;i++){}
        for(i=0;i<250;i++){}
        for(i=0;i<250;i++){}
        instruct(dis_on);   //0x0f;     //开启屏幕 光标 闪烁
        for(i=0;i<30;i++){}
        instruct(clear);    //0x01);     //清屏幕 clear
        for(j=0;j<10;j++){
        for(i=0;i<250;i++){}
                       }
        instruct(in_mode);  //0x06);    //光标右移、地址增1 方式
        for(i=0;i<30;i++){}
        instruct(home);     //0x02   //光标回零(左上角)
}
/*-------------------------------------
void itoa(int x,unsigned char *str2)
{
        data uint n;
        idata uchar chn,*p,*p2,str1[5];
        data uchar i,j;
        p2=str2;
        if(x<0){
	     *p2++='-';
	     x=-x;
	     }
        n=x;
        p=&str1;
        j=0;
        while(n!=0){
               	 chn=n%10;
	         n=n/10;
	         *p++=chn+'0';
	         j++;
	         }
        if(j!=0){
  	      p--;
	      for(i=0;i<j;i++)*p2++=*p--;
	      }
        else    *p2++='0';
        *p2=0;
        return;
}
/*--------------------数据结构----------------------
void display_run_data(uchar lin,uchar colum, uint x)
{
        uchar str3[6],L;
        //bit flag_neg;
        //if(x<0){flag_neg=1; x=-x;}else flag_neg=0;
        itoa(x,str3);
        L=strlen(str3);
        switch(L){
               case 1:
               str3[4]=str3[0]; str3[3]='.';str3[2]='0'; str3[1]=' '; str3[0]=' ';  //1位 0.x
               break;

               }

        str3[5]=0;  //字符串结束
        dis_str(lin,colum,str3);
}
/*********************************************/
void clr_screen(void)
{
        uchar i,j;
        instruct(clear);
        for(j=0;j<10;j++){
         for(i=0;i<250;i++){}//不加延时就不好使
                       }
}
/*************************************/
void SpiWrite(uchar send)       //SPI写         将单片机中数据写到ptr8000中
{
    uchar i;
    DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                SCK=1;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
/**********************************/
void Config905(void)          //配置nRF905
{   CSN=1;
    SCK=0;
    PWR=1;
    TRX_CE=0;
    TX_EN=0;
    Delay(2);
    CSN=0;
    SpiWrite( 0x00);             //配置命令//
    SpiWrite( 0x4C);          //CH_NO,配置频段在430MHZ  4c
    SpiWrite( 0x0C);          //输出功率为10db,不重发,节电为正常模式  0c
    SpiWrite( 0x44);          //地址宽度设置,为4字节
    SpiWrite( 0x04);
    SpiWrite( 0x04);             //接收发送有效数据长度为1字节
    SpiWrite( 0x19);          //接收地址 4字节
    SpiWrite( 0x85);
    SpiWrite( 0x06);
    SpiWrite( 0x27);
    SpiWrite( 0x58);          //16位CRC校验,CRC充许,16M晶振
    CSN=1;
}
/********************发送数据打包**********************/
void TxPacket1(void)//unsigned long nRF_rxaddr) // 参数为接收端的地址,即:发送给谁?
{
uchar i;
    PWR=1;                    //待机和SPI编程模式
    TRX_CE=0;
    TX_EN=1;
    CSN=0;
    SpiWrite(WTA);         // Write address command 写发送地址,后面跟4字节地址//
    SpiWrite(0x19);             //0x19
    SpiWrite(0x85);             //0x85
    SpiWrite(0x06);               //0x06
    SpiWrite(0x28);            //0x28,接收
    CSN=1;
    //Delay(20);                 //延时1/6ms 可以不加延时
    CSN=0;
    SpiWrite(WTP);            //写发送数据命令,后面跟一字节数据//
    for(i=0;i<4;i++)
    SpiWrite(SendBuffer[i]);            //发送到数据
    CSN=1;
    //Delay(20);                可以不加延时
    TRX_CE=1;                  //使能发射模式//
    rst_wdog();
    Delay(255);                //等带发送完成//延时2ms???这个时间很重要!!!!时间短了不行
    rst_wdog();
    TRX_CE=0;
}
/***************************************/
void portint(void)
{
P1M0=0xff;//P1口设为OC门
P1M1=0xff;
P2M0=0x01;
P2M1=0x0f;
P3M0=0x80;
P3M1=0x80;
}
/*---------------定时器0中断1ms----------------*/
void t0int(void) interrupt 1 using 2
{
TH0=-11059/256;//-921/256;
TL0=-11059%256;//-921%256;
//T_5ms++;T_key++;T_51ms++;T_52ms++;T_53ms++;
T_key++;
if(T_key>=1000){ //1s
                    T_key=0;second++;
               }
}
/*--------------------初始化-----------------------*/
void init(void)
{
TMOD=0x01;//定时器0方式1
TH0=-11059/256;//-921/256;
TL0=-11059%256;//-921%256;
TR0=1;;
ET0=1;
EA=1;
}
/*********************************************/
void main()
{
uchar i;
AUXR=0X80;//定时器0用1分频方式设定!!!,定时器1按照12分频
init();
portint();
Config905();                 //P1口初始化
initial();//液晶屏初始化
clr_screen();//清屏
instruct(0x0c);//光标归零
dis_hz_str(2,1,"发射点火控制器\0");
dis_hz_str(3,3,"北华大学\0");
st=1;
for(i=0;i<4;i++){SendBuffer[i]=i;
screen[i]=i+'0'; }//发送4个字0123
while(1)
       {
        rst_wdog();
        if(second>=3){
                     second=0; T_key=0;
                     TxPacket1();
                     dis_str(4, 1,screen);
                     }
       }
}


⌨️ 快捷键说明

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