使用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 知识的补充

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

AcWing算法基础课笔记——求组合数2

求组合数Ⅱ 1万组数据&#xff0c; 1 ≤ b ≤ a ≤ 1 0 5 1 \le b \le a \le 10^5 1≤b≤a≤105&#xff0c;预处理阶乘。时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN) C a b a ! ( b − a ) ! b ! C_a^b \frac{a !}{(b - a)! b!} Cab​(b−a)!b!a!​ 预处理出 i ! i ! i…

力扣148A

文章目录 1. 题目链接2. 题目代码3. 题目总结 1. 题目链接 Insomnia cure 2. 题目代码 #include<iostream> using namespace std; int main(){int dragonDamagedByPan;int dragonDamagedByDoor;int dragonDamagedByheel;int dragonDamagedBythreat;int totalNumberOfDra…

高速缓存存储器(Chche)

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

Geopandas函数大全

GeoSeries函数和方法解析 GeoSeries.plot(self, *args, **kwargs) 几何图形空间可视化GeoSeries.area 返回几何图形的面积GeoSeries.bounds 返回几何图形x、y的最大最小值GeoSeries.length 返回几何图形的长度GeoSeries.geom_type 返回几何类型GeoSeries.distance(self, other…

嵌入式系统固件升级方案设计

文章目录 0. 概要1. 存储布局2. 升级文件格式配置文件格式 3. UML图组件图状态图活动图 4. C代码示例异常处理模块化代码示例实用工具函数 5. 其它故障处理方案性能优化安全性分析版本控制策略 6. 总结 0. 概要 在嵌入式系统中&#xff0c;固件升级是一个至关重要的功能。为了…

小白指南:前端使用javascript如何判断集合是不是空集合?

背景 最近在开发一个Web应用时&#xff0c;我遇到了一个关于集合处理的问题。具体来说&#xff0c;我需要判断一个集合是否为空。集合可以是数组、对象、Map或Set等不同的数据结构。就简单的整理了一下如何在JavaScript中有效地判断一个集合是否为空呢&#xff1f; 解决方案 …

鸿枫网盘,文件夹面包屑跳转实现功能

新增功能&#xff0c;磁盘格式化&#xff0c;层级面包屑跳转&#xff0c;视频预览优化 主要记录一下面包屑的实现思路 2.1 面包屑渲染 <el-breadcrumb separator-class"el-icon-arrow-right"> <el-breadcrumb-item> <el-link :under…

Pytorch(5)-----梯度计算

一、问题 如何使用Pytorch计算样本张量的基本梯度呢&#xff1f;考虑一个样本数据集&#xff0c;且有两个展示变量&#xff0c;在给定初始权重的基础上&#xff0c;如何在每次迭代中计算梯度呢&#xff1f; 二、如何运行 假设有x_data 和 y_data 列表&#xff0c;计算两个列表需…

树莓派4B设置AP热点步骤

树莓派4B设置AP热点步骤&#xff1a;先进入root模式 预先进行apt-get update 第1步&#xff1a;安装network-manager ​sudo apt-get install network-manager第2步&#xff1a;安装git apt-get install git apt-get install util-linux procps hostapd iproute2 iw haveged …

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

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

HMI 的 UI 风格,超凡脱俗

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

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历&#xff0c;因为不可能存住水)&#xff0c;找到当前柱子的左边最高柱子lHeight&#xff0c;右边最高柱子rHeight&#xff0c;当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Soluti…

mediasoup专栏介绍

mediasoup专栏介绍 mediasoup基础概览网络编程-libuv介绍mediasoup源码分析-v2和v3版本差异mediasoup日志模块mediasoup源码分析(一)编译及部署mediasoup源码分析(二)--worker启动golang实现mediasoup的tcp服务及channel通道mediasoup源码分析(三)channel创建及信令交互mediaso…

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) …