C++字模软件发送 单片机接收显示

2024-05-07 08:04

本文主要是介绍C++字模软件发送 单片机接收显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/****先定义数组类型再赋值**L310*********/     

/*2014 8 21 10:01**PAST*CODE1000**TEST**/     

               #include<reg51.h>    

               #define  uint unsigned int  

               #define  uchar unsigned char

  sfr      AUXR=0x8e;              //辅助寄存器

               sfr      SADDR=0xA9;             //从机地址寄存器

               sfr      SADEN=0xB9;             //从机地址屏蔽寄存器

  typedef  uchar BYTE;

               typedef  uint  WORD;

               #define  SLAVE 1                 //定义从机编号,0 为从机 1, 1 为从机 2

               #if      SLAVE==0

               #define  SAMASK 0x33             //从机 1 地址屏蔽位

               #define  SERADR 0x55             //从机 1 的地址为 xx01,xx01

               #define  ACKTST 0x78             //从机 1 应答测试数据

               #else

               #define  SAMASK 0x3C             //从机 2 地址屏蔽位

               #define  SERADR 0x5A             //从机 2 的地址为 xx01,10xx

               #define  ACKTST 0x49             //从机 2 应答测试数据

               #endif

               #define  URMD 2                  //0:使用定时器 2 作为波特率发生器

      int      x,a,y,j;                //待放入数组的数据

               int      k,m,*p=&k;              //数组下标位变量

               uint     aa=0;            //

  uint     val,Buff;

               sfr      P4=0xc0;

               sfr      P5=0xc8;

      sbit     out=P5^5;    //

      sbit     CS=P3^5; //12864 PIN4

               sbit     SID=P3^6;    //12864 PIN5

               sbit     SCLK=P3^7;   //12864 PIN6

  sbit     key1=P3^2;   //

               sbit     key2=P3^3;   //

  sbit     key3=P3^4;   //

  uint     array[32],i; //定义数组a 循环总变量i 

  uchar    code zk[]=

      {

      0x41,0x00,0x21,0x00,0x31,0x00,0x21,0xFC,

               0x02,0x20,0x02,0x20,0xF4,0x20,0x10,0x20,

               0x17,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,

               0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20,

      };

/*------------------延时子程序----------------------*/ 

               void delay_1ms(uint x) 

               {

               int i, j;

               for (i=0; i<x; i++)

               for (j=0; j<1500; j++);

               }

/*------------------延时子程序----------------------*/ 

              void delay(unsigned int t) 

              {  

 unsigned int i,j; 

              for(i=0;i<t;i++) 

              for(j=0;j<100;j++); 

              } 

/*------------------写命令到LCD---------------------*/ 

               void write_com(unsigned char cmdcode) 

               { 

               uchar i; 

               uchar i_data,temp_data1,temp_data2; 

               i_data=0xf8; 

               delay(10); 

               CS=1; 

               SCLK=0; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               i_data=cmdcode; 

               i_data&=0xf0; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               i_data=cmdcode; 

               temp_data1=i_data&0xf0; 

               temp_data2=i_data&0x0f; 

               temp_data1>>=4; 

               temp_data2<<=4; 

               i_data=temp_data1|temp_data2; 

               i_data&=0xf0; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               CS=0; 

               } 

/*-------------------写数据到LCD--------------------*/ 

               void write_data(unsigned char Dispdata) 

               { 

               uchar i; 

               uchar i_data,temp_data1,temp_data2; 

               i_data=0xfa; 

               delay(10); 

               CS=1; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               i_data=Dispdata; 

               i_data&=0xf0; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               i_data=Dispdata; 

               temp_data1=i_data&0xf0; 

               temp_data2=i_data&0x0f; 

               temp_data1>>=4; 

               temp_data2<<=4; 

               i_data=temp_data1|temp_data2; 

               i_data&=0xf0; 

                for(i=0;i<8;i++) 

                { 

                SID=(bit)(i_data&0x80); 

                SCLK=0; 

                SCLK=1; 

                i_data=i_data<<1; 

                } 

               CS=0; 

               } 

/*------------------初始化LCD屏---------------------*/ 

  void lcd_init() 

               { 

               uchar comdata; 

               delay_1ms(100); 

               comdata=0x30; 

               write_com(comdata);   /*功能设置:一次送8位数据,基本指令集*/ 

               comdata=0x04; 

               write_com(comdata);   /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ 

  comdata=0x0f; 

               write_com(comdata);   /*显示设定:开显示,显示光标,当前显示位反白闪动*/ 

               comdata=0x01; 

               write_com(comdata);   /*清DDRAM*/ 

               comdata=0x02; 

               write_com(comdata);   /*DDRAM地址归位*/ 

               comdata=0x80; 

               write_com(comdata);   /*把显示地址设为0X80,即为第一行的首位*/ 

               }

/*------------初始化串口---------------------*/

               void InitUart()

               {

               SADDR=SERADR;

               SADEN=SAMASK;

               SCON=0x50;     //8位数据,可变波特率允许接收

               #if URMD==0

               T2L=0xDF;             //设置波特率重装值

               T2H=0xFE;             //9600bps(65536-11059200/4/9600)

               AUXR &=0x40;     //定时器1时钟为Fosc/12,即12T

          AUXR&=0xFE;     //串口1选择定时器1为波特率发生器

               #elif URMD==1

               AUXR=0x40;            //定时器 1 为 1T 模式

               TMOD=0x20;     //设定定时器1为16位自动重装方式

          TL1=0xDF;     //设定定时初值

          TH1=0xFE;     //设定定时初值

          ET1=0;         //禁止定时器1中断

          TR1=1;         //启动定时器1

               #else

               TMOD=0x20;            //设置定时器 1 为 8 位自动重装载模式

               AUXR=0x40;            //定时器 1 为 1T 模式

      TL1=TH1=0xDB;         //9600 bps(256 - 11059200/32/9600)

               TR1=1;

               #endif

               }

/****************************************************/

               void timer0() interrupt 1

               { 

               aa=aa+1;

               TH0=0X53;

               TL0=0X32;

               if(aa==500)

               out=!out,

               aa=0;

               }  

/*--------UART 中断服务程序----Buff=SBUF---------------*/

               void Uart() interrupt 4 using 1

               {

                if(RI)

                {

array[i]=SBUF;           //数组下标位置的数据等于j

                i++;                     //m加一

                RI=0;

       }  

               }

/*--------显示     程序-------------------*/

              void uartdisp() 

              {

   a=0;

x=0;

   for(y=0;y<=16;)

{

                if(x==0)

       {

write_com(0x36); //写入数据的地址 

       write_com(y+0X80);   //起始地址加计数地址80->8F

                write_com(0X80);     //列地址

         write_com(0x30); //扩充指令

       write_data(zk[a]);    //一个字符的左半部 前一个字节

a++;

       }

       else

       {

                write_data(zk[a]); //一个字符的右半部 后一个字节

a++;

       y++;

       }

       x=~x;

       if(y>=16)

                {

        write_com(0x34); 

                 write_com(0x36);

       }

}

               }

/*--------显示     程序-------------------*/

              void disp() 

              {

   a=0;

x=0;

   for(y=0;y<=16;)

{

                if(x==0)

       {

       write_com(0x36); //写入数据的地址 

                write_com(y+0X80);   //起始地址加计数地址80->8F

                write_com(0X80);     //列地址

         write_com(0x30); //扩充指令

       write_data(array[a]);//一个字符的左半部 前一个字节

a++;

       }

       else

       {

                write_data(array[a]);//一个字符的右半部 后一个字节

a++;

       y++;

       }

       x=~x;

       if(y>=16)

                {

        write_com(0x34); 

                 write_com(0x36);

       }

}

               }

/****************************************************/

               void send(unsigned temp) 

              { 

               unsigned serial;

      serial=temp;

      SBUF=(unsigned char)temp;

               while(TI!=1);

      TI=0;

              }          

/****************************************************/

               void main()

               { 

  lcd_init(); //初始化LCD屏

  AUXR=0X80;            //STC系列的1T 设置

               TMOD=0X01;

               TH0=0X53;

               TL0=0X32;

  ET0=1;

               TR0=1; 

  i=0; 

  m=0;

  InitUart();           //初始化串口

  EA=1;

  ES=1;

  while(1)

  {

            if(!key1)

    {

 i=0;

     disp();

}

    if(!key2)

    {

 i=0;

 out=0;

 for(k=0;k<32;k++) // zk[]

 {

 send(array[k]); 

 delay(200);

 }

 delay(2000);

     out=1;

}

if(!key3)         //

{

 uartdisp();

}

}

               }

           

这篇关于C++字模软件发送 单片机接收显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966784

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取