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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示