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

相关文章

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提