使用SPI驱动数码管

news2024/11/26 8:58:05

代码:

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  No
  0xC0,  // 0              1100 0000  0
  0xF9,  // 1              1111 1001  1
  0xA4,  // 2              1001 0100  2
  0xB0,  // 3              1011 0000  3
  0x99,  // 4              1001 1001  4
  0x92,  // 5              1001 0010  5
  0x82,  // 6              1000 0010  6
  0xF8,  // 7              1111 1000  7
  0x80,  // 8              1000 0000  8
  0x90,  // 9              1001 0000  9
  0x88,  // A              1000 1000  10
  0x83,  // b              1000 0011  11
  0xC6,  // C              1100 0110  12
  0xA1,  // d              1010 0001  13
  0x86,  // E              1000 0110  14
  0x8E,  // F              1000 1110  15
  0xC2,  // G              1100 0010  16
  0x89,  // H              1000 1001  17
  0x7F,  // .              0111 1111  18
  0xF1,  // J              1111 0001  19
  0xFF,  // blank          1111 1111  20
  0xC7,  // L              1100 0111  21
  0xBF,  // -              1011 1111  22
  0xF7,  // _              1111 0111  23
  0xA3,  // o              1010 0011  24
  0xA7,  // [              1010 0111  25
  0xE3,  // u              1110 0011  26
  0xB3,  // ]              1011 0011  27
  0xAB,  // n              1010 1011  28
  0xFF,
  0xFF,
  0xFF
};

// 显示驱动文件
void DISP7SEG(unsigned char *ledbuf)
{
  unsigned char i, t;

  // Enable update
  PORTB |= (1 << PB2);

  for(i = 0; i < SEG_CNT; i++)
  {
    t = LEDMASK[ledbuf[i] % 32];
 
    // 缓存最高位控制数据闪烁
    if(ledbuf[i] & 0x80)
      t &= 0x7F;

    SPI_RW(t);
  }

  // Disable update
  PORTB &= ~(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 master
        b65432:  not use
        b10:     mode  CPOL CPHA
                  3     1    1
                  2     1    0
                  1     0    1
                  0     0    0

  speed: b76543: not use
         b210:   speed   KHz
                   0     500   F/2
                   1     500   F/2
                   2     250   F/4
                   3     125   F/8
                   4     62.5  F/16
                   5     31.25 F/32
                   6     15.63 F/64
                   7     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 mode
  switch(mode%4)
  {
    case 1:// mode 1
      bMODE = (0 << CPOL)|(1 << CPHA);
      break;
    case 2:// mode 2
      bMODE = (1 << CPOL)|(0 << CPHA);
      break;
    case 3:// mode 3
      bMODE = (1 << CPOL)|(1 << CPHA);
      break;
    default:// mode 0
      bMODE = (0 << CPOL)|(0 << CPHA);
      break;
  }

  // Master or Slave
  if((mode & 0x80) == 0)
    bMODE |= (1 << MSTR);

  // SPI speed
  bSPI2X = 0;
  switch(speed)
  {
    case 7:// F/128 = 7.8125K
      bSPR = (1 << SPR1)|(1 << SPR0);
      break;
    case 6:// F/64 = 15.625K
      bSPR = (1 << SPR1)|(0 << SPR0);
      break;
    case 5:// F/32 = 31.25K
      bSPR = (1 << SPR1)|(0 << SPR0);
      bSPI2X = 1;
      break;
    case 4:// F/16 = 62.5K
      bSPR = (0 << SPR1)|(1 << SPR0);
      break;
    case 3:// F/8 = 125K
      bSPR = (0 << SPR1)|(1 << SPR0);
      bSPI2X = 1;
      break;
    case 2:// F/4 = 250K
      bSPR = (0 << SPR1)|(0 << SPR0);
      break;
    default:// F/2 = 500K
      bSPR = (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);  // 延时500ms
    
    cnt++;           // 计数器递增

    LEDBUF[0] = cnt / 16; // 修改缓存内容
    LEDBUF[1] = (cnt % 16)|0x80;

    DISP7SEG(LEDBUF); // 更新显示
  }

  return 0;
}

仿真

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

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

相关文章

AIGC时代的英语教育:人工智能会取代英语老师吗?

在当前AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;时代&#xff0c;人工智能技术正在迅速发展并渗透到各个领域&#xff0c;其中包括英语教育。面对这一趋势&#xff0c;许多人担心人工智能会取代传统的英语教师。然而&#xff0c;本文将探讨人工智…

Android 天气APP(八)城市切换 之 自定义弹窗与使用

然后在模块的utils包中新建一个LiWindow类 代码如下&#xff1a; package com.llw.mvplibrary.utils; import android.app.Activity; import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; im…

GitHub 标星 6

美国网友对这个大全给予了很高的评价&#xff1a;这份清单中列出的开源软件&#xff0c;不仅解决了硅谷大厂前员工的难处&#xff0c;也能为其他所有码农解除困惑。 在这套大全的指导下&#xff0c;任何一个工程师&#xff0c;都能获得类似在谷歌内部写代码的体验。xg2xg 上线…

【Flutter 专题】120 Flutter 腾讯移动通讯 TPNS~

1.2 方法使用 小菜按照官网的介绍尝试了一些常用的 API 方式&#xff0c;主要分为应用类&#xff0c;账号类和标签类三种 API&#xff0c;小菜业务中没有应用账号和标签模块&#xff0c;暂未深入研究&#xff1b; 应用接口 API a. 注册推送服务 对于服务的注册初始化&#x…

软件串口接收子程序

代码; stduart.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;使用延时法实现半双工软件串口文件&#xff1a;sfuart.c说明&#xff1a;软件串口驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月13日*/ #include "sfduart.h"// 循环中延…

数据结构历年考研真题对应知识点(栈)

目录 3.1栈 3.1.1栈的基本概念 【栈的特点&#xff08;2017&#xff09;】 【入栈序列和出栈序列之间的关系(2022)】 【特定条件下的出栈序列分析(2010、2011、2013、2018、2020)】 3.1.2栈的顺序存储结构 【出/入栈操作的模拟(2009)】 3.1栈 3.1.1栈的基本概念 【栈…

嵌入式linux系统中LCD屏驱动实现思路分析

在 Linux 下 LCD 的使用更加广泛,在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。接下来就来学习一下如何在 Linux 下驱动 LCD 屏幕。 第一:Framebuffer设备简介 先来回顾一下裸机的时候 LCD 驱动是怎么编写的,裸机 LCD 驱动编写流程如下: ①、初始化 I.MX6U 的…

NeRF从入门到放弃4: NeuRAD-针对自动驾驶场景的优化

NeuRAD: Neural Rendering for Autonomous Driving 非常值得学习的一篇文章&#xff0c;几乎把自动驾驶场景下所有的优化都加上了&#xff0c;并且也开源了。 和Unisim做了对比&#xff0c;指出Unisim使用lidar指导采样的问题是lidar的垂直FOV有限&#xff0c;高处的东西打不…

一年前 LLM AGI 碎片化思考与回顾系列⑦ · 在SystemⅡ未知之境之中徘徊

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章「融合RL与LLM思想&#xff0c;探寻世界模型以…

02--MySQL数据库概述

目录 第10章 子查询 10.1 SELECT的SELECT中嵌套子查询 10.2 SELECT的WHERE或HAVING中嵌套子查询 10.3 SELECT中的EXISTS型子查询 10.4 SELECT的FROM中嵌套子查询 第11章 MySQL支持的数据类型 11.1 数值类型:包括整数和小数 1、整数类型 2、bit类型 3、小数类型 11.2…

1996年-2023年 全国298个地级市-外商直接投资FDI(数据收集)

外商直接投资&#xff08;FDI&#xff09;是一种跨国界的经济活动&#xff0c;它涉及外国投资者在中国境内进行的直接投资行为。这种投资行为不仅包括以货币、实物、技术等形式的资本投入&#xff0c;还可能包括开办独资企业、合资企业、合作企业&#xff0c;以及参与资源开发等…

FreeCAD中智能指针分析

实现原理 FreeCAD中有两套智能指针&#xff0c;一个是OCC的智能指针handle&#xff0c;另一个是自己定义的智能指针Reference&#xff0c;两种智能指针都是通过引用计数方式管理指针。 1.1 OCC智能指针handle OCC在基础类包中定义了一个模板类handle&#xff0c;该类包含一个私…

Github 2024-06-23开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3C++项目2JavaScript项目2非开发语言项目2Jupyter Notebook项目1Python项目1Vue项目1Java项目1HTML项目1从零开始构建你喜爱的技…

直流电机三级串电阻启动

直流电动机在工农业生产中拥有广泛的应用&#xff0c;这主要得益于其调速范围广、调速平稳、过载能力强以及启动和制动转矩大的优点。为了降低起动电流和起动转矩&#xff0c;研究者们探索了直流电动机串电阻起动方法。这种方法通过在直流电动机电枢绕组中串入电阻&#xff0c;…

【学习笔记】CSS

CSS 1、 基础篇 1.1、选择器 1.2、长度单位 1.3、CSS2 常用属性 1.4、盒模型 1.5、浮动 1.6、定位 position2、 CSS3 2.1、新增长度单位 2.2、新增颜色表示 2.3、新增选择器 2.4、新增盒子属性 2.5、新增背景属性 …

电子SOP实施(MQTT协议)

架构图 服务与程序 用docker启动mqtt broker(服务器) 访问&#xff1a;http://192.168.88.173:18083/#/dashboard/overview 用户名&#xff1a;admin 密码&#xff1a;*** 消息发布者(查找sop的url地址&#xff0c;发布出去) 修改url&#xff0c;重新发布消息 import ran…

5.XSS-反射型(post)利用:获取cookie

原理&#xff1a; 文件路径&#xff1a;\pikachu\pkxss\xcookie\post.html 将post.html文件&#xff0c;复制到皮卡丘的根路径下或者根下随意路径即可&#xff0c;并编辑文件 需要修改以下两个地址&#xff0c;第一个地址是将原界面的样子链接过来&#xff0c;让用户认为是原…

探索Agent AI智能体的未来

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;Agent AI智能体正成为一种改变世界的新力量。这些智能体不仅在当前的技术领域中发挥着重要作用&#xff0c;而且在未来将以更深远的影响改变我们的生活、工作和社会结构。本文将探讨Agent AI智能体的现状、潜…

Python学习打卡:day13

day13 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1397、初识对象98、类的成员方法类的定义和使用成员变量和成员方法成员方法的定义语法 99、类和对象在程序中通过类来描述基于类创建对象 100、…

通信系统网络架构_2.广域网网络架构

1.概述 通俗来讲&#xff0c;广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建&#xff0c;将分布在不同地区的局域网或计算机系统互连起来&#xff0c;实现…