使用SPI驱动数码管

代码:

7-seg.c

/*《AVR专题精选》随书例程3.通信接口使用技巧项目:改进的延时法实现半双工软件串口文件:7seg.c说明:SPI控制数码管驱动文件作者:邵子扬时间:2012年12月15日*/#include <avr/io.h>extern unsigned char SPI_RW(unsigned char dat);// LED 数码管数量
#define SEG_CNT   2// 7 SEG LED, 共阳极字模(共阴极类似)
//
//     0
//    ---
//  5| 6 |1
//    ---
//  4|   |2
//    ---  .7
//     3
//
const unsigned char LEDMASK[] = 
{                        //7654 3210  No0xC0,  // 0              1100 0000  00xF9,  // 1              1111 1001  10xA4,  // 2              1001 0100  20xB0,  // 3              1011 0000  30x99,  // 4              1001 1001  40x92,  // 5              1001 0010  50x82,  // 6              1000 0010  60xF8,  // 7              1111 1000  70x80,  // 8              1000 0000  80x90,  // 9              1001 0000  90x88,  // A              1000 1000  100x83,  // b              1000 0011  110xC6,  // C              1100 0110  120xA1,  // d              1010 0001  130x86,  // E              1000 0110  140x8E,  // F              1000 1110  150xC2,  // G              1100 0010  160x89,  // H              1000 1001  170x7F,  // .              0111 1111  180xF1,  // J              1111 0001  190xFF,  // blank          1111 1111  200xC7,  // L              1100 0111  210xBF,  // -              1011 1111  220xF7,  // _              1111 0111  230xA3,  // o              1010 0011  240xA7,  // [              1010 0111  250xE3,  // u              1110 0011  260xB3,  // ]              1011 0011  270xAB,  // n              1010 1011  280xFF,0xFF,0xFF
};// 显示驱动文件
void DISP7SEG(unsigned char *ledbuf)
{unsigned char i, t;// Enable updatePORTB |= (1 << PB2);for(i = 0; i < SEG_CNT; i++){t = LEDMASK[ledbuf[i] % 32];// 缓存最高位控制数据闪烁if(ledbuf[i] & 0x80)t &= 0x7F;SPI_RW(t);}// Disable updatePORTB &= ~(1 << PB2);
}

main.c

/*《AVR专题精选》随书例程3.通信接口使用技巧项目:SPI驱动数码管文件:main.c说明:主程序作者:邵子扬时间:2012年12月15日*/#include <avr/io.h>// 系统时钟频率
#define F_CPU  1000000UL#include <util/delay.h>#include "macromcu.h"// 定义SPI端口
#define CS    B, 2
#define SCK   B, 5
#define MOSI  B, 3/*函数说明: SPI初始化输入参数:mode: b7:      1 slave, 0 masterb65432:  not useb10:     mode  CPOL CPHA3     1    12     1    01     0    10     0    0speed: b76543: not useb210:   speed   KHz0     500   F/21     500   F/22     250   F/43     125   F/84     62.5  F/165     31.25 F/326     15.63 F/647     7.81  F/128*/
void SPI_init(char mode, char speed)
{unsigned char bSPR, bSPI2X, bMODE;PINDIR(CS,  PIN_OUTPUT);PINDIR(SCK, PIN_OUTPUT);PINDIR(MOSI,PIN_OUTPUT);// SPI modeswitch(mode%4){case 1:// mode 1bMODE = (0 << CPOL)|(1 << CPHA);break;case 2:// mode 2bMODE = (1 << CPOL)|(0 << CPHA);break;case 3:// mode 3bMODE = (1 << CPOL)|(1 << CPHA);break;default:// mode 0bMODE = (0 << CPOL)|(0 << CPHA);break;}// Master or Slaveif((mode & 0x80) == 0)bMODE |= (1 << MSTR);// SPI speedbSPI2X = 0;switch(speed){case 7:// F/128 = 7.8125KbSPR = (1 << SPR1)|(1 << SPR0);break;case 6:// F/64 = 15.625KbSPR = (1 << SPR1)|(0 << SPR0);break;case 5:// F/32 = 31.25KbSPR = (1 << SPR1)|(0 << SPR0);bSPI2X = 1;break;case 4:// F/16 = 62.5KbSPR = (0 << SPR1)|(1 << SPR0);break;case 3:// F/8 = 125KbSPR = (0 << SPR1)|(1 << SPR0);bSPI2X = 1;break;case 2:// F/4 = 250KbSPR = (0 << SPR1)|(0 << SPR0);break;default:// F/2 = 500KbSPR = (0 << SPR1)|(0 << SPR0);bSPI2X = 1;break;}SPCR = (1 << SPE)|bMODE|bSPR;SPSR = (bSPI2X << SPI2X);
}// SPI读写
unsigned char SPI_RW(unsigned char dat)
{SPSR &= ~(1 << SPIF);SPDR = dat;while((SPSR & (1 << SPIF)) == 0);return SPDR;
}// 系统初始化
void init()
{SPI_init(0, 0);
}extern void DISP7SEG(unsigned char *ledbuf);// LED显示缓存
unsigned char LEDBUF[2];
unsigned char cnt;int main()
{init();  // 初始化for(;;){_delay_ms(500);  // 延时500mscnt++;           // 计数器递增LEDBUF[0] = cnt / 16; // 修改缓存内容LEDBUF[1] = (cnt % 16)|0x80;DISP7SEG(LEDBUF); // 更新显示}return 0;
}

仿真

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

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

相关文章

Ubuntu:解决github出现 Permission denied (publickey)的问题

因为使用的Ubuntu 长久没有使用&#xff0c;使用下载的时候突然报错&#xff0c;使用ssh key这种方式进行clone &#xff0c;pull github上面的项目&#xff0c;使用 git clone或者git pull origin master出现permission denied (publickey)&#xff0c;原因是因为ssh key过期失…

0 知识的补充

目录 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 矢量混合积 坐标系 直角坐标系 柱坐标系 球坐标系 ​​​​​​​ 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 ​​​​​​​ 矢量混合积 坐标系 直角坐标系 柱坐标系 ​​​​​​​ 球坐标系

高速缓存存储器(Chche)

为了解决CPU和主存之间速度不匹配的问题&#xff0c;计算机系统中引入了高速缓存&#xff08;Chche&#xff09;的概念。 基本想法&#xff1a;使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器&#xff0c;用来存放经常用到的信息&#xff1b;这样一来&#xff0c;…

Chrome插件: Octotree让你GitHub代码浏览速度飙升

在GitHub上浏览和管理项目代码时&#xff0c;您是否曾为复杂的目录结构感到困惑&#xff1f;如果有一种工具能够让您轻松浏览项目的文件和目录&#xff0c;会不会大大提升您的工作效率&#xff1f;这正是Octotree浏览器插件所能做到的。 不过说实话&#xff0c;GitHub自带的代码…

HMI 的 UI 风格,超凡脱俗

HMI 的 UI 风格&#xff0c;超凡脱俗

ARM功耗管理软件之WFIWFE

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战

java中Object和json相互转换的方式

1.org中jackson转换json,springboot中内置jackson ObjectMapper onew ObjectMapper(); List<>listnew ArrayList(); String jonso.writeAsValueString(list); 2.alibaba中fastjson转换成json GetMapping("/test")public TbUser testHttpClient(){String url…

Day11 —— 大数据技术之Spark

Spark快速入门系列 Spark的概述什么是Spark&#xff1f;Spark的主要特点Spark的主要组件 Spark安装Spark三种运行模式Spark Standalone架构Spark Standalone的两种提交方式Spark On YARN架构 RDD算子转化算子行动算子 Spark RDDRDD的创建从对象集合创建RDD从外部存储创建RDD Sp…

[C/C++][VsCode]使用VsCode在Linux上开发和Vscode在线调试

目录 0. 前言1. win10上搭建环境Linux环境2.编写makefile3.怎么在线调试结语 0. 前言 在开发中&#xff0c;可以一边开发一边调试&#xff0c;这样可以大大的减少bug&#xff1b;但是正常来说一个大点的项目&#xff0c;是不太可能单步调试的&#xff0c;因为一般都是用make或…

java打印金字塔paremid和空心金字塔

java打印金字塔 首先确定每行打印几个空格&#xff0c;在确定每行打印几个* 设总层数为layers&#xff0c;当前层数为i。 则每行打印空格数layers-i&#xff0c;每行打印星号数2*i-1 import java.util.Scanner;public class Paremid{public static void main(String[] args) …

基于Pico和MicroPython点亮ws2812彩色灯带

基于Pico和MicroPython点亮ws2812彩色灯带 文章目录 基于Pico和MicroPython点亮ws2812彩色灯带IntroductionPracticeConclusion Introduction 点亮发光的LED灯是简单有趣的实验&#xff0c;点亮多个ws2812小灯串联起来的灯带&#xff0c;可对多个彩色小灯进行编程&#xff0c;…

夏季城市内涝防治:视频汇聚系统智能AI技术助力城市自然灾害应急管理

据新闻报道&#xff0c;6月19日至20日&#xff0c;受强降雨影响&#xff0c;广西桂林城区及周边等地出现今年入汛以来持续时间最长、累计降水量最大、影响范围最广、致灾风险最高的暴雨天气过程&#xff0c;导致桂林市区多处发生洪水内涝&#xff0c;房屋被淹、道路受阻、人员被…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

JAVA学习过程中遇到的问题

前言 记录学习过程中遇见的各种问题。希望对你有帮助。 目录 前言 1、新建maven项目时&#xff0c;archetype项目骨架加载慢 2、maven的pop.xml添加依赖项无法检测到 3、java: 无效的目标发行版: 20 4、idea添加maven依赖太慢 5、CTRLCV复制粘贴太慢 6、Swagger写接口文…

SD卡无法读取?数据恢复全攻略!

SD卡无法读取问题描述 在日常使用电子设备时&#xff0c;我们有时会遇到SD卡无法读取的情况。当插入SD卡后&#xff0c;设备可能无法识别或访问其中的数据&#xff0c;这给我们带来了诸多不便。SD卡无法读取&#xff0c;意味着存储在卡中的重要文件、照片和视频等资料可能面临…

数学建模---包汤圆问题引发的思考

1.前言 &#xff08;1&#xff09;虽然我学习这个数学建模已经很长一段时间了&#xff0c;但是我认为自己始终是一个门外汉&#xff0c;只是学习了一下这个基本的建模软件使用方法&#xff0c;以及一些相关的知识&#xff0c;虽然参加了一次这个电工杯的比赛&#xff0c;但是这…

1.Triangle

一、你好&#xff0c;三角形 在OpenGL中&#xff0c;任何事物都在3D空间中&#xff0c;而屏幕和窗口却是2D像素数组&#xff0c;这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。 3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线&#xff08;Graphi…

稳态与敏态业务阶段

稳态业务就是比如你登录学校的图书馆教务处这些业务系统 用户数量和数据基本上不会发生太大的变化 业务系统的更新也不是很频繁&#xff0c;比较方便资源的采购 敏态业务就是比如我开发一个应用上线了&#xff0c;我不知道有多少用户和数量&#xff0c;无法预估 这就没办法…

2小时极速入门 TypeScript-慕课网 笔记

TS文档&#xff1a;https://www.tslang.cn/docs/handbook/modules.html 一&#xff0c;什么是TS 注:Typescript无法在浏览器中运行 ,所以需要编译器,将TS转变为JS 问&#xff1a;TS运行这么麻烦&#xff0c;为什么还要有TS&#xff1f; 答&#xff1a;TS强类型 1&#xff0c;规…