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

📄 led.c

📁 显示屏程序
💻 C
📖 第 1 页 / 共 4 页
字号:
//***********************************************
// 程序名称:ASCCLED.c                         *
// 编译环境:为WAVE6000  使用芯片  :AT89C55 DIP40*
// 版本号  :v1.0    硬件版本号:                 *
// 完成日期:07.8.20 晶振:18.432                *
// 作者 :zhu yin                                *
//***********************************************
#include<reg51.h>
#include<absacc.h>           // 端口函数
#include<intrins.h>          // _nop_();函数

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

//display base--------------------------------------------------
#define d_rom0 XBYTE[0x200]       //200 信息的总条数 =0没有信息
#define d_rom1 XBYTE[0x201]       //201 屏的长度
#define d_rom2 XBYTE[0x202]       //202 屏的高度
#define d_rom3 XBYTE[0x203]       //203 扫描方式
#define d_rom4 XBYTE[0x204]       //204 是什么数据格式 55是点阵 aa是汉字点阵
#define d_rom5 XBYTE[0x205]       //205 数据是正向还是反向  55正向 aa反向

#define d_receive XBYTE[0x300]    //接收信息的起始地址
#define data_count XBYTE[0x2000]  //字库地址  不是汉字   是数字或字母
#define data_count1 XBYTE[0x3000] //字库地址  汉字
#define d_address XBYTE[0x8000]      //  板子子号 地址
#define d_374  XBYTE[0xc000]      //  6264 的功能控制地址  选通某个6264
#define dram   XBYTE[0xe000]      //  6264 的地址 e
#define dramm  XBYTE[0xf000]      //  6264 的地址 f


//常量

bit    b_fnew;                   //是否有信息
bit    b_you;                    //游动标志 =1 游动
bit    b_clean;                  //小消屏标志  =1消屏

sbit   store=P1^5;                //  锁存  0  锁存
sbit   enabl=P1^4;                //  行 开 0 开  1 关      说明本程序中是景泰扫描  所以不起作用
sbit   wdog=P3^5;
sbit   sb_int1=P3^3;              //接收和发送控制脚  0接收  1发送

uchar  idata da_address;          //屏号码
uchar  idata seep;                //停留时间
uchar  idata da_scan;             //扫描方式
uchar  idata da_loog;             //屏的长度
uchar  idata da_high;             //屏的高度
uchar idata da_send_count;        //发送的数据长度
uchar idata wd_send_sbuf[4];        //针头0x8c  地址  应答0xc8  校验和

uchar xdata *daw_data_pointer;    //接收缓冲区指针
//uchar xdata *daw_ascc;            //数据体地址
uchar xdata *daw_ascc_count;      // 信息地址
uchar xdata *daw_6264e;
uchar xdata *daw_6264f;

uchar code cd_le_ri[8]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //从左向右取位
uchar code cd_le_ri_c[8]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //从左向右灭位

uchar code cd_ri_le[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //从右向左取位
uchar code cd_ri_le_c[8]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; //从右向左灭位

void v3_getmdp(i);
//***********************************
//   程序初始化
//***********************************
void int_stant()
{
    uchar xdata *pnt00=&d_rom0;
    enabl=0;
    b_fnew=0;                        //没有新信息
    sb_int1=0;                       //=0接收
    b_clean=0;                      //不是消屏

    pnt00+=1;
    da_loog=*pnt00++;                //屏长128点
    da_high=*pnt00++;                //屏高 64点
    da_scan=*pnt00;                //扫描 16扫
}


//***********************************
//   中断初始化
//***********************************
void int_discontinuity()
{
     TCON=0;
     TMOD=0X21;
     //SCON=0Xd0;                 //
     SCON=0X50;

     TH1=0Xfb;                    //波特率为2400
     TL1=0Xfb;
     TR1=1;
     ES=1;
     IP=0x10;                    //- ps1 pt1 ps pt1 px1 pt px0  中断优先级
     EA=1;
}


//***********************************
//   串口中断子程序
//***********************************
 void serial1() interrupt 4 using 3
{
   xdata  uchar *pnt0=&d_rom0;        //内部信息的起始地址 200H
   static uchar count_all1;           // 数据体长度高位
   static uchar count_all2;           // 数据长度底位
   static uchar rmod;                 // 接收的指针
   static uchar rmod1;                // 接收指针中的接收指针
   static uchar checksum;            // 和校验单元
   static uchar count_6;             // 接收5个字节 其中包括 命令字、长、高、扫描方式、数据长度
   static uchar count_1;             //1条信息的长度
   static uchar data c,i;                     // 接收缓冲区
   static uchar biao_zhi;              // 是接收一屏信息的标志  =88为一条信息的开始
  // static uchar biao_zhi1;             // 是接收判断  是什么显示格式的标志 =77
   static uchar tion_all;             //总的信息条数

    if(RI)
    {
        RI=0;
        c=SBUF;
        switch(rmod)
        {
            //接收针头     8ch
            case(0):
            {
                if(c==0x8c)
                {
                    rmod=1;          //接收地址
                }
                else
                    rmod=0;          //针头不对从新接收
            }
            break;

            //接收地址
            case(1):
            {
                if(c==da_address)
                {
                    rmod=2;         //地址对 接收命令字
                    count_6=6;      //连续接收5个字节
                 }
                else rmod=0;
            }
            break;

            //接收命令字
            case(2):
            {
                count_6--;
                switch (count_6)
                {
                    //接收数体的总长度底位
                    case 0:
                    {
                        count_all2=c;
                        rmod=3;        //接收完6个字节  开始接收数据体
                        biao_zhi=0x88; //接收1条信息 开始标志
                        tion_all=0;    //总信息条数 =0
                        daw_data_pointer=&d_receive;   //数据体中信息的起始地址
                        checksum=0;        //准备和校验
                    }
                    break;
                    //接收数体的总长度高位
                    case 1:
                    {
                        count_all1=c;
                      //  rmod=3        //接收完5个字节  开始接收数据体
                    }
                    break;
                    //接收扫描方式
                    case 2:
                    {
                        pnt0=&d_rom0;  //200
                       // *pnt0++;
                       // *pnt0++;
                       // *pnt0++;
                        pnt0+=3;
                        *pnt0=c;       //203  扫描方式
                        da_scan=c;
                    }
                    break;
                    //接收屏的宽度
                    case 3:
                    {
                        pnt0=&d_rom0;  //200
                       // *pnt0++;
                       // *pnt0++;
                        pnt0+=2;
                        *pnt0=c;       //202  屏的宽度
                        da_high=c;
                    }
                    break;
                    //接收长度
                    case 4:
                    {
                        pnt0=&d_rom0;  //200
                        pnt0+=1;
                        *pnt0=c;       //201  屏的长度
                        da_loog=c;
                    }
                    break;
                    //方式01  为真确接收
                    case 5:
                    {
                       if(c==01)     //方式01  为真确接收
                       {
                       }
                       else
                       rmod=0;
                    }
                    break;

                    default :
                    {
                        rmod=0;
                    }
                    break;
                }
            }
            break;

            //接收数据体
            case(3):
            {

            //-----------------------------------  只是将数据长度-1
                    //数据长度 不为0   且  底位为0
                    if(count_all2==0)      //底位为0
                    {
                        count_all1--;      //高位-1
                        count_all2=0xff;   //底为补255
                    }
                    // 底位不为0
                    else
                    {
                        count_all2--;
                    }
                 //------------------------------------


                if((count_all1!=0)||(count_all2!=0))    //数据长度为0 就接收数据体的最后一位
                {

                    if(biao_zhi==0x88)   //1条信息开始 的标志  =0x88就是1条信息开始
                    {
                        biao_zhi=0;
                        count_1=c;       //1条信息的长度
                        checksum+=c;     //和校验
                    //    biao_zhi1=0x77;  //下面接收的是   显示格式 01  整屏  02游动
                        tion_all++;      //信息总条数+1
                    }
                    else// if(biao_zhi1==0x77)
                    {
                       // biao_zhi1=00;
                       // pnt0=&d_rom0;  //200
                       // pnt0+=4;       //前面4个是信息的总条数、长、高、扫描方式
                       // pnt0+tion_all; //
                        count_1--;
                        if(count_1)
                        {
                             *daw_data_pointer++=c;   //读信息
                             checksum+=c;     //和校验
                        }
                        else
                        {
                             *daw_data_pointer++=c;   //读信息
                             biao_zhi=0x88;         // 1条信息读完 从新读1条信息
                             checksum+=c;     //和校验
                        }
                    }
                }
                else
                {
                    *daw_data_pointer++=c;   //读信息
                    checksum+=c;     //和校验
                    rmod=4;   //接收完数据开始接收校验和
                }

            }
            break;

            // 接收和校验
            case(4):
            {
                if(c==checksum)
                {
                    pnt0=&d_rom0;        //信息真确接收完后  存入信息总条数据
                    pnt0-=1;
                    *pnt0++=tion_all;
                    *pnt0++=tion_all;
                    b_fnew=1;           //正确接收完数据
                    TI=1;               //发送正确应答
                }
                else
                    rmod=0;             //和校验不对
            }
            break;

            default:                    //接收第一个针头
            {
            b_fnew=0;
            rmod=0;
            }
            break;
        }
    }

    if(TI)
    {
        TI=0;
        sb_int1=1;
        if(i<da_send_count)
        {
            SBUF=wd_send_sbuf[i];         //发送一针信息
            i++;
        }
        else
        {
            i=0;
            sb_int1=0;                    //发送完后 从新等待接收
            rmod=0;
        }
    }
}




//***********************************
//     喂看门狗
//***********************************
void wtdog(void)
{
 wdog=1;
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 wdog=0;
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 wdog=1;
 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}



//***********************************
//   启动所有6264
//***********************************
void sdram(void)
{
 uchar xdata *pnt3=&d_374;
 *pnt3=0x0;
 //daw_6264e=&dram;
 //daw_6264f=&dramm;
}


//***********************************
//    向6264 的 0通道装数据
//***********************************
void sdram0(uchar data_i)
{
 uchar xdata *pnt6=&d_374;
 uchar idata i;
 i=data_i+0x08;                               //指向要放的6262的地址
 *pnt6=i;
 daw_6264e=&dram;
 daw_6264f=&dramm;
}

//***********************************
//    选择字库的地址

⌨️ 快捷键说明

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