STC8H8K64U 学习笔记 - 基础代码

STC8H8K64U 学习笔记 - 基础代码

  • 环境说明
    • 引脚说明
  • 基础代码
    • 电动马达
    • 蜂鸣器
    • 小蓝灯
    • LED 灯
      • 走马灯
      • 来回灯
      • 流水灯
      • 流水逐灭灯
      • 相遇灯
    • 独立按键
  • 串口
    • 串口接收查询
    • 按键反馈

环境说明

该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。

  • 芯片:STC8H8K64U
  • 烧录软件:stc-isp-v6.92G
  • 编码工具:天问

引脚说明

  • P0_0:蜂鸣器,按频率发音,1:高,0:低
  • P0_1:电动马达,0:停,1:动
  • P5_3:小蓝灯,0:灭,1:亮
  • P2_7:1 号 LED 灯,0:亮,1:灭
  • P2_6:2 号 LED 灯,0:亮,1:灭
  • P1_5:3 号 LED 灯,0:亮,1:灭
  • P1_4:4 号 LED 灯,0:亮,1:灭
  • P2_3:5 号 LED 灯,0:亮,1:灭
  • P2_2:6 号 LED 灯,0:亮,1:灭
  • P2_1:7 号 LED 灯,0:亮,1:灭
  • P2_0:8 号 LED 灯,0:亮,1:灭
  • P5_1:1 号按键,0:按下,1:弹起
  • P5_2:2 号按键,0:按下,1:弹起
  • P5_3:3 号按键,0:按下,1:弹起
  • P5_4:4 号按键,0:按下,1:弹起
  • P3_4:矩阵键盘第 1 行引脚
  • P3_5:矩阵键盘第 2 行引脚
  • P4_0:矩阵键盘第 3 行引脚
  • P4_1:矩阵键盘第 4 行引脚
  • P0_3:矩阵键盘第 1 列引脚
  • P0_6:矩阵键盘第 2 列引脚
  • P0_7:矩阵键盘第 3 列引脚
  • P1_7:矩阵键盘第 4 列引脚

基础代码

电动马达

void setup() {twen_board_init();//天问51初始化P0M1&=~0x02;P0M0|=0x02;//推挽输出P0_1 = 0;// 0:停,1:动
}

蜂鸣器

void setup() {twen_board_init();//天问51初始化P0M1&=~0x02;P0M0|=0x02;//推挽输出P0_0 = 0;// 按频率发音,1:高,0:低
}

小蓝灯

void setup() {twen_board_init();//天问51初始化P5M1=0x00;P5M0=0xff;//推挽输出P5_3 = 0; // 0:灭,1:亮
}

LED 灯

走马灯

从左往右一次亮,某个灯亮的时候,其他灯灭。

#define PWM_DUTY_MAX 1000//PWM最大占空比值#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/UART.h"
#include "lib/PWM.h"
#include <stdio.h>uint8 index = 0;
const uint32 INTERVAL = 100;void putchar(char c) {if (c == '\n') {uart_putchar(UART_1, 0x0d);uart_putchar(UART_1, 0x0a);} else {uart_putchar(UART_1, (uint8)c);}
}void setup() {twen_board_init();//天问51初始化P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口
}void scan(uint8 row) {// 全部置 1P3_4 = 1, P3_5 = 1, P4_0 = 1, P4_1 = 1;P0_3 = 1, P0_6 = 1, P0_7 = 1, P1_7 = 1;// 根据行号将对应行引脚置零switch (row) {case 1: P3_4 = 0; break;case 2: P3_5 = 0; break;case 3: P4_0 = 0; break;case 4: P4_1 = 0; break;}// 逐个检查列引脚if(P0_3 == 0) {printf_small("(%d,1)by P0_3\n", row);if(row == 1) {// 若按键 (1,1) 被按下, 1 号灯亮起P2_7 = 0;delay(INTERVAL);P2_7 = 1;}if(row == 2) {// 若按键 (2,1) 被按下, 5 号灯亮起P2_3 = 0;delay(INTERVAL);P2_3 = 1;}}if(P0_6 == 0) {printf_small("(%d,2)by P0_6\n", row);if(row == 1) {// 若按键 (1,2) 被按下, 2 号灯亮起P2_6 = 0;delay(INTERVAL);P2_6 = 1;}if(row == 2) {// 若按键 (2,2) 被按下, 6 号灯亮起P2_2 = 0;delay(INTERVAL);P2_2 = 1;}}if(P0_7 == 0) {printf_small("(%d,3)by P0_7\n", row);if(row == 1) {// 若按键 (1,3) 被按下, 3 号灯亮起P1_5 = 0;delay(INTERVAL);P1_5 = 1;}if(row == 2) {// 若按键 (2,3) 被按下, 7 号灯亮起P2_1 = 0;delay(INTERVAL);P2_1 = 1;}}if(P1_7 == 0) {printf_small("(%d,4)by P1_7\n", row);if(row == 1) {// 若按键 (1,4) 被按下, 4 号灯亮起P1_4 = 0;delay(INTERVAL);P1_4 = 1;}if(row == 2) {// 若按键 (2,4) 被按下, 8 号灯亮起P2_0 = 0;delay(INTERVAL);P2_0 = 1;}}
}void loop() {for (index = 1; index < 5; index++) {scan(index);}// delay(500);
}void main(void) {setup();while(1){loop();}
}

来回灯

走马灯有去无回,来回灯有去有回

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h";uint8 index = 0;
int8 incr = 1;
uint32 INTERVAL = 100;void setup() {twen_board_init();//天问51初始化P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出
}void loop() {P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;switch(index) {case 0: P2_7 = 0; break; case 1: P2_6 = 0; break;case 2: P1_5 = 0; break; case 3: P1_4 = 0; break;case 4: P2_3 = 0; break; case 5: P2_2 = 0; break;case 6: P2_1 = 0; break; case 7: P2_0 = 0; break;    }if(index > 6) {incr = -1;} else if(index < 1) {incr = 1;}index += incr;delay(INTERVAL);
}void main(void) {setup();while(1) {loop();}
}

流水灯

从左往右,依次亮起,等会全部灭掉

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"uint8 index = 0;
const uint32 INTERVAL = 100;void setup() {twen_board_init();//天问51初始化P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;delay(INTERVAL);P2_7 = 0;delay(INTERVAL);P2_6 = 0;delay(INTERVAL);P1_5 = 0;delay(INTERVAL);P1_4 = 0;delay(INTERVAL);P2_3 = 0;delay(INTERVAL);P2_2 = 0;delay(INTERVAL);P2_1 = 0;delay(INTERVAL);P2_0 = 0;delay(INTERVAL);P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;
}void loop() { }void main(void) {setup();while(1){loop();}
}

流水逐灭灯

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"uint8 index = 0;
const uint32 INTERVAL = 100;void setup() {twen_board_init();//天问51初始化P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出
}void loop() {P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;delay(INTERVAL);P2_7 = 0;delay(INTERVAL);P2_6 = 0;delay(INTERVAL);P1_5 = 0;delay(INTERVAL);P1_4 = 0;delay(INTERVAL);P2_3 = 0;delay(INTERVAL);P2_2 = 0;delay(INTERVAL);P2_1 = 0;delay(INTERVAL);P2_0 = 0;delay(INTERVAL);P2_0 = 1;delay(INTERVAL);P2_1 = 1;delay(INTERVAL);P2_2 = 1;delay(INTERVAL);P2_3 = 1;delay(INTERVAL);P1_4 = 1;delay(INTERVAL);P1_5 = 1;delay(INTERVAL);P2_6 = 1;delay(INTERVAL);P2_7 = 1;delay(INTERVAL);
}void main(void) {setup();while(1){loop();}
}

相遇灯

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h";const SIZE = 8;
uint8 index = 0;
int8 incr = 1;
uint32 INTERVAL = 100;void setup() {twen_board_init();//天问51初始化P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出
}void loop() {P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;switch(index) {case 0: P2_7 = 0; P2_0 = 0; break;case 1: P2_6 = 0; P2_1 = 0; break;case 2: P1_5 = 0; P2_2 = 0; break;case 3: P1_4 = 0; P2_3 = 0; break;}if(index > 2) {incr = -1;} else if(index < 1) {incr = 1;}index += incr;delay(INTERVAL);
}void main(void) {setup();while(1) {loop();}
}

独立按键

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"uint8 index = 0;
int8 incr = 1;
uint32 INTERVAL = 100;void setup() {twen_board_init();//天问51初始化P0M1&=~0x02;P0M0|=0x02;//推挽输出P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出
}void marquee() {P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;switch(index) {case 0: P2_7 = 0; break; case 1: P2_6 = 0; break;case 2: P1_5 = 0; break; case 3: P1_4 = 0; break;case 4: P2_3 = 0; break; case 5: P2_2 = 0; break;case 6: P2_1 = 0; break; case 7: P2_0 = 0; break;}if(index > 6) {incr = -1;} else if(index < 1) {incr = 1;}index += incr;delay(INTERVAL);
}void loop() {// 针对按键 1 的处理逻辑if(!P5_1) {// 当按键 1 被按住不松, 马达可劲儿动P0_1 = 1;} else {// 当按键 1 被按住不松, 马达可劲儿停P0_1 = 0;}while(!P5_2) {// 当按键 2 被按住不松, 蜂鸣器可劲儿响P0_0 = 1;delay(5);P0_0 = 0;delay(5);}P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;while(P5_3) {// 当按键 3 被没有按下, 跑马当可劲儿跑marquee();}}void main(void) {setup();while(1){loop();}
}

串口

波特率:每秒钟发送的数据

串口接收查询

步骤:

  1. 引入 lib/UART.h 头文件
  2. 增加 putchar 函数以支持 printf_small
  3. 调用 uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1); 初始化串口
  4. 使用 UART1_GET_RX_FLAG 来从 UART1 获取接收信号的标志
  5. 使用 UART1_CLEAR_RX_FLAG 来清除 UART1 的 RX 标志位
  6. 使用 SBUF 获取串口数据,可以使用 uint8 类型的变量接收。
#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/UART.h"uint8 rec = 0;void putchar(char c) {if (c == '\n') {uart_putchar(UART_1, 0x0d);uart_putchar(UART_1, 0x0a);} else {uart_putchar(UART_1, (uint8)c);}
}void setup() {twen_board_init();//天问51初始化uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口
}void loop() {if(UART1_GET_RX_FLAG) { // 从 UART1 获取标志位UART1_CLEAR_RX_FLAG;  // 清除 UART1 的 RX 标志位rec = SBUF;           // 获取串口数据// uart_putchar(UART_1, rec);//串口单个字符输出// uart_putstr(UART_1, rec);//字符串输出// printf_small("rec = :%d", rec);if(rec == 0x32){uart_putchar(UART_1, 0x31);//串口单个字符输出}}
}void main(void) {setup();while(1){loop();}
}

按键反馈

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/delay.h"
#include "lib/UART.h"// 按键按下标志位
uint8 pressed = 0;void putchar(char c) {if (c == '\n') {uart_putchar(UART_1, 0x0d);uart_putchar(UART_1, 0x0a);} else {uart_putchar(UART_1, (uint8)c);}
}void setup() {twen_board_init();//天问51初始化uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口
}void loop() {if(P5_1 == 0 && pressed == 0) {pressed = 1;uart_putstr(UART_1, "按键 1 被按下");} else if(P5_1 && pressed) {pressed = 0;uart_putstr(UART_1, "按键 1 被谈弹起");}delay(100);
}void main(void) {setup();while(1){loop();}
}

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

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

相关文章

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的GPIO输出代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成开发环境搭建之后&#xff0c;开始使用STM32GP…

Pandas处理缺省数据

背景&#xff1a; SQL查询数据为空或者null的字段&#xff0c;如果查询字段为或者NULL需要设置为NULL 解决方案&#xff1a; 只处理指定字段 在 Pandas 中处理缺失数据&#xff08;如 SQL 查询结果中的空字符串或 NULL 值&#xff09;可以通过 fillna() 方法来实现。您可以将…

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml&#xff0c;脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…

2013年认证杯SPSSPRO杯数学建模B题(第二阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…

乐校园二手书交易管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生闲置二手书在线销售

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

蓝桥杯相关算法学习(Python)

一、排序 排序算法是指将一组数据按照某种规则重新排列&#xff0c;使得数据呈现出递增或递减的顺序。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 1.冒泡排序 解释&#xff1a; 冒泡排序通过不断交换相邻两个元素的位置&#xff0c;使…

Redis从入门到精通(四)Redis实战:短信登录

文章目录 前言第4章 Redis实战&#xff1a;短信登录4.1 基于session实现短信登录4.1.1 短信登录逻辑梳理4.1.2 创建测试项目4.1.3 实现发送短信验证码功能4.1.4 实现用户登录功能4.1.5 实现登录拦截功能4.1.6 session共享问题 4.2 基于Redis实现短信登录4.2.1 Key-Value的结构设…

【华为OD机试】欢乐的周末(并查集和搜索算法—JavaPythonC++JS实现)

本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码四.代码讲解(Ja…

mysql语句学习

SQL Select语句完整的执行顺序&#xff1a; 1、from子句组装来自不同数据源的数据&#xff1b; &#xff08;先join在on&#xff09; 2、where子句基于指定的条件对记录行进行筛选&#xff1b; 3、group by子句将数据划分为多个分组&#xff1b; 4、使用聚集函数进行计算&a…

优化网络体验:代理IP在提升网页浏览速度和安全性方面的实践

代理IP在提升网络体验&#xff0c;特别是网页浏览速度和安全性方面&#xff0c;具有显著作用。以下是代理IP在这两方面实践应用的详细说明&#xff1a; 一、提升网页浏览速度 1. 缓存加速 许多代理服务器具备缓存功能&#xff0c;它们会对之前请求过的网页内容进行存储。当后续…

postgresql 表、索引的膨胀率监控

表膨胀监控 /* WARNING: executed with a non-superuser role, the query inspect only tables and materialized view (9.3) you are granted to read. * This query is compatible with PostgreSQL 9.0 and more */ SELECT current_database(), schemaname, tblname, bs*tbl…

取证之内存取证工具Volatility学习

一、简介 Volatility是一款开源的内存取证分析工具&#xff0c;支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多类型操作系统系统的内存取证方式。该工具是由python开发的&#xff0c;目前支持python2、python3环境。 二、安装 1、下载地址 GitHub - …

搭建 Qt 开发环境

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT SDK 的下载和安装 1.QT SDK 的下载 二、QT SDK的安装 1、找到下载的文件并双击 2、双击之…

Gatekeep AI:文本转视频教学工具,开启智能学习新纪元

在当今的数字时代,技术的进步不断改变着我们学习和理解知识的方式。 Gatekeep AI 就是这样一款令人兴奋的工具,它专注于将数学和物理问题通过文本提示转化为生动的视频。 特点与优势: 直观的可视化:将复杂的数学和物理概念以直观的视频形式呈现。快速生成:根据用户提供的…

菜鸟笔记-Python函数-ones

在Python中&#xff0c;ones函数通常是与NumPy库一起使用的&#xff0c;用于生成一个全为1的数组。NumPy是Python中用于处理数组、矩阵和数学函数运算的强大库。 1. 函数介绍 numpy.ones函数用于生成一个给定形状和类型的新数组&#xff0c;其元素全部初始化为1。 函数的基本…

mysql闲谈

如何定位慢查询 1、测试环境压测时&#xff0c;有的接口非常慢&#xff0c;响应时间超过2秒以上。当时系统部署了运维的监控系统Skywalking&#xff0c;在展示报表中可以看到是哪儿个接口慢&#xff0c;可以看到SQL具体执行时间。 2、如果没有类似的监控系统&#xff0c;在Mysq…

4月02日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 滴滴启动清明假期安全部署&#xff0c;助力用户顺畅出行 &#x1f30d; 华为已撤回遥遥领先商标申请 &#x1f30b; 华为最新分红出炉&#xff1a;15 万人「瓜分」770 亿元 &#x1f381; 我国 5G 总连接数今年将超 10 …

爬虫之数据神器1---Peewee新手入门指南(1)

正文&#xff1a; 1. Peewee简介 Peewee是一个简单、轻量级的Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;用于与关系型数据库进行交互。它的名字"Peewee"源自一种小型狗的名字&#xff0c;象征着其小巧灵活的特点。 1.1 Peewee的特点 包括&…

IT公司管理者日常工作思考

一、前言 作为IT公司的管理者,我们应该一切从实际出发,理论和实际相结合,以终为始,带领公司(组织)不断前进。当然前进包括稳重求进,稳步前进,积极扩张,厚积薄发。等等。大多数公司追求的都是稳中求进,没有稳的进都是在冒比较大的风险。积极扩张,又容易出现较大的风…

世优科技上榜2024年度《中国虚拟数字人影响力指数报告》

日前&#xff0c;第三期《中国虚拟数字人影响力指数报告》在中国网络视听大会上正式发布。本期《报告》由中国传媒大学媒体融合与传播国家重点实验室&#xff08;以下简称“国重实验室”&#xff09;、中国传媒大学数字人研究院编制&#xff0c;中国网络视听协会、人民日报智慧…