STC 51单片机56——摇摇棒

news2024/11/16 3:27:09

 

主要代码:

//增减图像时,需要修改    switch_show()和 H对应参数
//所用单片机:STC15W408S 内部Rc 11.0592MHz
#include <STC15.H>
#include <intrins.h>

#define POSITIVE 0
#define  OPPOSE  1

//sbit P32        =   P3^2;       //I/O口P3.2  在STC12C56.H已经定义

unsigned char code hao_hao_xue_xi[]={0x10,0x40,0x10,0x22,0xF0,0x15,0x1F,0x08,
      0x10,0x14,0xF0,0x63,0x80,0x00,0x82,0x00,
      0x82,0x40,0x82,0x80,0xE2,0x7F,0x92,0x00,
      0x8A,0x00,0xC6,0x00,0x80,0x00,0x00,0x00,
                                   0x10,0x40,0x10,0x22,0xF0,0x15,0x1F,0x08,
      0x10,0x14,0xF0,0x63,0x80,0x00,0x82,0x00,
      0x82,0x40,0x82,0x80,0xE2,0x7F,0x92,0x00,
      0x8A,0x00,0xC6,0x00,0x80,0x00,0x00,0x00,
                                   0x40,0x04,0x30,0x04,0x11,0x04,0x96,0x04,
      0x90,0x04,0x90,0x44,0x91,0x84,0x96,0x7E,
      0x90,0x06,0x90,0x05,0x98,0x04,0x14,0x04,
      0x13,0x04,0x50,0x06,0x30,0x04,0x00,0x00,
                                    0x04,0x00,0x04,0x00,0x04,0x08,0x04,0x18,
      0x14,0x04,0x24,0x04,0xC4,0x02,0x04,0x02,
      0x04,0x01,0x04,0x21,0x84,0x40,0x04,0x80,
      0x04,0x40,0xFE,0x3F,0x04,0x00,0x00,0x00
                                   } ;
unsigned char code tian_tian_xiang_shang[]={0x40,0x80,0x42,0x80,0x42,0x40,0x42,0x20,
      0x42,0x10,0x42,0x0C,0x42,0x03,0xFE,0x00,
      0x42,0x03,0x42,0x0C,0x42,0x10,0x42,0x20,
      0x43,0x40,0x62,0xC0,0x40,0x40,0x00,0x00,
                                    0x40,0x80,0x42,0x80,0x42,0x40,0x42,0x20,
      0x42,0x10,0x42,0x0C,0x42,0x03,0xFE,0x00,
      0x42,0x03,0x42,0x0C,0x42,0x10,0x42,0x20,
      0x43,0x40,0x62,0xC0,0x40,0x40,0x00,0x00,
                                    0x00,0x00,0xF8,0xFF,0x08,0x00,0x08,0x00,
      0xCC,0x1F,0x4A,0x08,0x49,0x08,0x48,0x08,
      0x48,0x08,0x48,0x08,0xE8,0x1F,0x48,0x40,
      0x08,0x80,0xFC,0x7F,0x08,0x00,0x00,0x00,
                                    0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,
      0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0x7F,
      0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x40,
      0x20,0x40,0x00,0x60,0x00,0x40,0x00,0x00
                                    };

。。。。。

。。。。。


unsigned char V;          //用于eeprom的记录与读取
unsigned char H;          //确定图像数量

void long_delay(unsigned char k);
void short_delay(void);
void show_one(unsigned char *tab,unsigned char k,unsigned char nub);
void switch_show(unsigned char a,unsigned char k);
void  cc(unsigned int addr);
void  xcx(unsigned int addr,unsigned char dat);
unsigned char dcx(unsigned int addr);
void  Q0(void);

void long_delay(unsigned char k)
{
  unsigned char i,j;
  for(;k>0;k--)
    for(i=0;i<50;i++)
      for(j=0;j<10;j++);       
}
void short_delay()
{
  unsigned char i,j;
  for(i=0;i<6;i++)
    for(j=0;j<25;j++)
      ;
}
void show_one(unsigned char *tab,unsigned char k,unsigned char nub)          //显示一幅画 ,一个字符串
{
  int i,n=nub*32-1;
  if(k==1)             //顺次显示
  {
    for(i=0;i<n;i++)
    {
      P1=~tab[i];    short_delay();
      P1=0xff;
        i++;
      P2=~tab[i];    short_delay();
      P2=0xff;
      long_delay(1);
    }
  }
  else                //逆次显示
  {
      for(i=n;i>0;i--)
    {
      P2=~tab[i];   short_delay();
      P2=0xff;
      i--;
      P1=~tab[i];   short_delay();
      P1=0xff ;    
      long_delay(1);
    }
  }
}


/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:擦除某一扇区(每个扇区512字节)
入口:addr = 某一扇区首地址              
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(unsigned int addr)
{    
                              // 0x83(晶振<12M)   0x82(晶振<20M)   0x81(晶振<24M)   0x80(晶振<30M)
    IAP_CONTR = 0x83;          // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
    IAP_CMD   = 0x03;          // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
    IAP_ADDRL = addr;         // ISP/IAP操作时的地址寄存器低八位,
    IAP_ADDRH = addr>>8;      // ISP/IAP操作时的地址寄存器高八位。
    //EA =0;   
    IAP_TRIG = 0x5a;          // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
    IAP_TRIG = 0xa5;          // 再写入B9h,ISP/IAP命令才会生效。
    _nop_();

    Q0();                      // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:写一字节
入口:addr = 扇区单元地址 , dat = 待写入数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(unsigned int addr,unsigned char dat)
{
    IAP_CONTR = 0x83;          
    IAP_CMD   = 0x02;          // 用户可以对"Data Flash/EEPROM区"进行字节编程
    IAP_ADDRL = addr;        
    IAP_ADDRH = addr>>8;      
    IAP_DATA  = dat;          // 数据进ISP_DATA
    EA = 0;
    IAP_TRIG = 0x5a;          
    IAP_TRIG = 0xa5;          
    _nop_();
    Q0();                      // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:读一字节
入口:addr = 扇区单元地址
出口:dat  = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
unsigned char dcx(unsigned int addr)
{   
    unsigned char dat;
    IAP_CONTR = 0x83;          
    IAP_CMD   = 0x01;         // 用户可以对"Data Flash/EEPROM区"进行字节读
    IAP_ADDRL = addr;         
    IAP_ADDRH = addr>>8;      
    EA = 0;
    IAP_TRIG = 0x5a;          
    IAP_TRIG = 0xa5;          
    _nop_();
    dat = IAP_DATA;              // 取出数据
    Q0();                      // 关闭ISP/IAP               
    return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
    IAP_CONTR = 0;            // 关闭IAP功能
    IAP_CMD   = 0;            // 待机模式,无ISP操作
    IAP_TRIG  = 0;            // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
//    IAP_ADDRH = 0x80;  //将地址设置到非IAP
//    IAP_ADDRL = 0;
}
void eeprom()                                                           
{
/*用于测试eeprOM
  unsigned char kk;   
  cc(0x0200);          // 擦除第2个扇区(0200h~03FFh)
  xcx(0x0200,7);
  kk= dcx(0x0200);    
  if(kk==7)
    P37=0;
*/
  unsigned char a;
//  a= PCON;
//  a&=0xdf;
//  PCON=a;            //由于PCON的初始值为默认LVDF为1,所以必须软件清除
//  short_delay();
//  a= PCON;
//  a&=0x20;     //判断电压是否过低
   a=0;
  if(a==0)
  {
      V = dcx(0x0000);              // 开机读取EEPROM区0000h数据
    cc(0x0000);          // 擦除第1个扇区(0000h~01FFh)
    if(V<H)              //不同的一次显示图像个数
    {                                                                  
      V++;
      xcx(0x0000,V);      // 对EEPROM区0000h写入V的值
    }
    else
    {    
       V=1;              //少了这一句,折腾了老半天
       xcx(0x0000,V);      // 对EEPROM区0000h写入1
    }
  }
  else
  {
       P37=0;
     V=3;
  }

}
//不能将button_down与button_up 通过P32=state(一个变量)的形式进行合成一个函数
//因为P32只能写成P32==0或者P32==1,不能与变量进行比较
unsigned char button_down(unsigned char n)    
{
   while(P32==0){       
       n--;
       short_delay();
       if(n==0) return 1;
     }
      return 0;   
}
unsigned char button_up(unsigned char n)
{
   while(P32==1){       
       n--;
       short_delay();
       if(n==0) return 1;
     }
      return 0;   
}


void main(void)
{     
  unsigned char k=0;                                                        
  H=6;             //图像数量,即字符串数量
//  P3M0=0x04;       //P32设置为高阻,其他端口不变
//  P3M1=0x00;
    long_delay(100);  //防止上电时对eeproM操作不稳定
  eeprom();    
  while(1)
  {
    if(button_up(5)==1&&k==1){
      long_delay(85);
      switch_show(V,OPPOSE) ;
      k=0;    
    }
     if(button_down(5)==1&&k==0){      
      long_delay(85);
       switch_show(V,POSITIVE) ;  
      k=1;    
    }
//    if(button_down(3)==1) {
//       P1=0xff;
//       k=0;
//       long_delay(100);
//    }
//    else P1=0xfe;
  }  
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vector-常用CAN工具 - CANoe入门到精通_02

​咱们话接上回&#xff0c;前面已经介绍了CANoe的基本信息和硬件环境搭建&#xff0c;下面我们就要打开CANoe&#xff0c;配置CANoe工程了&#xff0c;只有完成了CANoe工程配置才能真正的使用CANoe完成测试&#xff0c;本次主要介绍的是手工测试环境&#xff0c;至于自动化测试…

[附源码]Python计算机毕业设计SSM教师职称评定系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV学习】第5课:图像模糊(均值滤波,高斯滤波)

参考文章链接:https://blog.csdn.net/qq_30460949/article/details/121990114 仅自学做笔记用,后续有错误会更改 理论 1.Smooth/blur是图像处理中最简单和常用的操作之一 2.使用该操作的原因之一就是为了给图像预处理的时候减低噪声 3.使用Smooth/Blur操作其背后是数学的卷积…

ContentProvider与ContentResolver

目录&#xff1a;一、什么是ContentProvider&#xff1a;二、如何使用ContentProvider&#xff1a;第一步.创建类继承ContentProvider&#xff1a;第二步.注册ContentProvider&#xff1a;三、URI&#xff1a;1.常用方法&#xff1a;2.解析URI&#xff1a;&#xff08;1&#x…

Android Gradle 学习笔记(二)环境安装

1. 官网安装 Gradle 安装地址&#xff1a;Gradle | Installation 最新的 Gradle 版本是 7.6&#xff0c; 需要 Java 8及以上的版本支持&#xff0c;官网有两种版本可下载&#xff1a; 二进制版本完全版本&#xff08;源码 文档&#xff09; 一般情况下&#xff0c;下载二进…

助力企业降本增效,「WorkPlus SE专业版」正式发布!

移动互联网时代&#xff0c;数字化成为了企业提质降本增效的价值路径。大中小型企业积极主动地借助各种在线办公产品&#xff0c;实现沟通协作和运营管理的优化升级。 随着企业规模的扩大和办公业态多样化发展&#xff0c;会面临着业务流程繁杂、数据利用率低、IT成本高、泄密…

RFID警用装备管理系统-公安警用装备管理可视化系统

一、方案背景 我国警用装备物资种类多、数量大、价值高&#xff0c;还包含枪支、弹药、爆炸物等需要重点监管的物资&#xff0c;在公安机关应对紧急情况、处理突发事件过程中发挥了极为重要的作用。但是&#xff0c;由于缺乏有效的信息化管理手段&#xff0c;还存在管理方式落后…

Tealium 分析

文章目录1.0 调用流程1.1 初始化流程1.2 发送数据流程2.0 Tealium 的设计2.1 总体设计2.1.1 Tealium Core2.1.2 Visitor2.1.3 Crash reporter2.1.4 Ad identifler2.1.5 Lifecycle2.1.6 Location2.1.7 InstallReferrer2.1.8 Hosteddatalayer2.1.8 Dispatcher2.2 网络设计2.3 本地…

黄菊华老师,Java Servlet毕业设计毕设辅导课(4):Servlet 实例

Servlet 实例 Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet&#xff0c;并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。 Hello World 示例代码 下面是 Servl…

为什么工业设计公司价格这么高?

随着经济的不断增长&#xff0c;各种工业设计公司逐渐出现&#xff0c;但价格不同&#xff0c;有些价格高&#xff0c;有些价格低&#xff0c;让一些人到处比较价格&#xff0c;低价格压低别人的高价格。有些人会想&#xff0c;为什么工业设计公司在设计产品时价格这么高&#…

ORB-SLAM2 ---- Tracking::UpdateLastFrame函数

目录 1.函数作用 2.步骤 3.code 4.函数解释 4.1 利用参考关键帧更新上一帧在世界坐标系下的位姿 4.2 对于双目或rgbd相机&#xff0c;为上一帧生成新的临时地图点 1.函数作用 更新上一帧位姿&#xff0c;在上一帧中生成临时地图点。 单目情况&#xff1a;只计算了上一帧…

【富文本编辑器】简记功能:neditor上传操作时提交额外数据

目录 编辑器下载&#xff08;本文使用版本v2.1.19&#xff09; 功能需求 解决思路 相关代码 调用实例的html neditor.config.js&#xff08;搜索修改内容&#xff1a;/* 设置额外请求参数 */&#xff09; 完成&#xff0c;如有其它方法&#xff0c;欢迎一起讨论 编辑器下…

使用 Fluent Bit 实现云边统一可观测性

本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理。 整理人&#xff1a;米开朗基杨、大飞哥 Fluent Operator 简介 2019 年 1 月 21 日&#xff0c;KubeSphere 社区为了满足以云原生的方…

NX上配置TLD的环境---对opencv的版本没有要求

一、TLD工程编译及运行 1.1 源码下载 网上的TLD有两个版本&#xff0c;一个是Zdenek Kalal自己使用matlabvs混合编程实现的&#xff0c;另外一个是 arthurv利用c和opencv实现的。 我利用的是arthurv版本的Tracking-Learning-Detection 连接&#xff1a;https://github.com/al…

基于Android平台的手机安全卫士的设计与实现

目 录 第1章 引言 1 1.1 研究背景及意义 1 1.2 安全软件的现状 1 1.3 本文主要工作 2 1.4 本文的组织结构 2 第2章 Android的相关技术介绍及分析 3 2.1 搭建Android开发环境 3 2.1.1 搭建Ubuntu系统下Java开发环境 3 2.1.2 搭建Ubuntu系统下Android开发环境 3 2.2 Android项目目…

「企企通」完成Pre-D轮融资,加速采购供应链工业软件和 SaaS 网络生态构建

企企通作为领先的采购供应链工业软件和SaaS生态平台&#xff0c;在一年内再次宣布获得Pre-D轮融资&#xff0c;全年合计融资额达数亿元人民币&#xff0c;目前还有意向投资机构在进行&#xff0c;并开始启动IPO的筹备工作。本轮投资由华映资本独家投资。华映资本是企企通C2轮融…

flutter系列之:flutter中的变形金刚Transform

文章目录简介Transform简介Transform的使用总结简介 虽然我们在开发APP的过程中是以功能为主&#xff0c;但是有时候为了美观或者其他的特殊的需求&#xff0c;需要对组件进行一些变换。在Flutter中这种变换就叫做Transform。 flutter的强大之处在于&#xff0c;可以对所有的…

IBM MQ 通道

一&#xff0c;定义 通道是分布式队列管理器在IBM MQ MQI 客户端和IBM MQ服务器之间或两个IBM MQ服务器之间使用的逻辑通信链接。 通道是提供从一个队列管理器到另一个队列管理器的通信路径的对象。通道在分布式队列中用于将消息从一个队列管理器移动到另一个队列管理器&#x…

计算机网络-应用层详解(持续更新中)

应用层概述 应用层是解决通过应用进程的交互来实现特定网络应用的问题。 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用&#xff08;电子邮件、远程登录、文件传输、新…

百度联合行业头部企业新发5个行业大模型,大模型产业落地路径愈发清晰

本文已在【飞桨PaddlePaddle】公众号平台发布&#xff0c;详情请戳链接&#xff1a;百度联合行业头部企业新发5个行业大模型&#xff0c;大模型产业落地路径愈发清晰 11月30日&#xff0c;由深度学习技术与应用国家工程研究中心主办、飞桨承办的WAVE SUMMIT2022深度学习开发者…