MAX7221数码管驱动的多种探索
MAX7221的参考资料,我待补充:
先上代码#include <reg51.h>
#include <intrins.h>sbit DIN = P2^0; //数据串出引脚
sbit CS = P2^1; //片选端
sbit CLK = P2^2; //移位时钟端// 延时函数
void delayms(unsigned int x){unsigned char i;while(x--) for(i = 0;i < 120;i++);
}void write_data(unsigned char addr,unsigned char dat)
{unsigned char i;CS = 0; // 拉低CS选中芯片 先写地址,片选置低,串行数据加载到移位寄存器for(i = 0;i < 8;i++) //传输地址 {CLK = 0; //时钟上升沿数据移入内部移位寄存器addr <<= 1; //待发送的地址,每次左移一次,高位在前发送,DIN = CY; //数据移位后,如果有溢出,则可以从进位位CY中获得溢出的数据位CLK = 1; // 拉高时钟线,写入数据_nop_(); //延迟1Us_nop_();CLK = 0; //下降沿时数据从DOUT移出}for(i = 0;i < 8;i++) // 传输数据 {CLK = 0; dat <<= 1; //发送数据DIN = CY;CLK = 1;_nop_();_nop_();CLK = 0;}CS = 1; //CS上升沿,数据锁存
}//初始化函数
void init_max7221(void)
{write_data(0x09,0xff); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码write_data(0x0a,0x07); //初始亮度设置 0-15设置1-16档亮度write_data(0x0b,0x07); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作
}
void main(void)
{int i,j;init_max7221(); // 初始化for(i=0;i<8;i++) write_data(i+1,i),delayms(500);delayms(2000);while(1){// write_data(1,8);
// write_data(2,9);
// write_data(3,10); //"-"
// write_data(4,11); //"E"
// write_data(5,12); //"H"
// write_data(7,13); //"L"
// write_data(8,14); //"P"
// write_data(8,15); //全灭 我只是一个一个试的,一起显示出现乱码}
}
形成现象的
以上两图可以看出:
1、MAX7221是可以动态可变的(可能需要加上初始化最后一句)
2、MAX7221串口的使用想象(一组数据从U2流到U3,相差一帧)(我一帧一帧快进的)
3、显示现象“——”的值为10
4、MAX7221还要一直运行着,要不没显示;(因为它是串口寄存器);如果不运行,最后一个不会消失,就像上图一样;
如何让数码管的小数点亮引出的问题,探索:
问题在初始化配置的问题:探索后做过形成现象,显示修改后的代码
//初始化函数
void init_max7221(void)
{write_data(0x09,0xf0); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低4位不解码write_data(0x0a,0x0f); //初始亮度设置 0-15设置1-16档亮度 15write_data(0x0b,0x03); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位) 扫描前4个write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作
}
void main(void)
{int i,j;init_max7221(); // 初始化while(1);
}
有改动,亮度15,扫描3,低4位不解码
对应现象:
初始化的现象,我进入while(1);(CC共阴数码管,下面都是)
和上面有点改动,把原来断开的都连上了,(测试电平-高电平)也去掉;全部解码(代码也改了)
对解码、扫描、亮度和对应的段码的相关探索,修改后的代码,只显示修改的代码
//初始化函数
void init_max7221(void)
{// write_data(0x09,0xf0); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低四位不解码write_data(0x09,0x00); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低四位不解码write_data(0x0a,0x0f); //初始亮度设置 0-15设置1-16档亮度 最亮
// write_data(0x0b,0x03); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)write_data(0x0b,0x07); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)(长时间不用还可以关着)write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作 (主要是可以闪烁变化)//地址上没有0x00和0x0d,为啥呢,没找到,也不太清除;资料上写了
}
void main(void)
{init_max7221(); // 初始化while(1){ write_data(1,0x01); // 地址位选,数据段选write_data(2,0x02);write_data(3,0x04); //"-"write_data(4,0x08); //"E"write_data(5,0x10); //"H"write_data(6,0x20); //"L"write_data(7,0x40); //"P"write_data(8,0x80); //全灭}
}
全不解码,扫描8位
推算出MAX7221的信息:不是按上面推算的,我是一个一个试的:
段位(高电平) | 对应数字 | 对应上图的第几个(左到右) |
---|---|---|
A | 0x40 | 7 |
B | 0x20 | 6 |
C | 0x10 | 5 |
D | 0x08 | 4 |
E | 0x04 | 3 |
F | 0x02 | 2 |
G | 0x01 | 1 |
DP | 0x80 | 8 |
解码和不解码的区别
//相同部分已去掉,只显示修改的部分//初始化函数
void init_max7221(void)
{// write_data(0x09,0x00); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低四位不解码write_data(0x09,0xf0); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低四位不解码write_data(0x0a,0x07); //初始亮度设置 0-15设置1-16档亮度 最亮write_data(0x0b,0x07); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)(长时间不用还可以关着)write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作 (主要是可以闪烁变化)//地址上没有0x00和0x0d,为啥呢,没找到,也不太清除;资料上写了
}
void main(void)
{int i,j;init_max7221(); // 初始化while(1){for(i=0;i<8;i++) write_data(i+1,DSY_CODE[i]); // 验证低四位不解码的现象}
}
和上面对比会发现,不解码会按照我们写的段码显示;解码会按照MAX7221内部的默认的段码显示(0),最后一个是不解码的写在了最高位,而默认的就低7个位的段码,叠加而成的。
最后送自己一个Π(3.141592……)
几个寄存器的合用,扫描,亮度,解码,小数点等操作
#include <reg51.h>
#include <intrins.h>sbit DIN = P2^0; //数据串出引脚
sbit CS = P2^1; //片选端
sbit CLK = P2^2; //移位时钟端unsigned char code DSY_CODE[]={0xf9,0x30,0x33,0x30,0x5b,0x7b,0x4f,0xff};// 3. 1 4 1 5 9 2 8.
// 延时函数
void delayms(unsigned int x){unsigned char i;while(x--) for(i = 0;i < 120;i++);
}void write_data(unsigned char addr,unsigned char dat){unsigned char i;CS = 0; // 拉低CS选中芯片 先写地址,片选置低,串行数据加载到移位寄存器for(i = 0;i < 8;i++){CLK = 0,addr <<= 1,DIN = CY,CLK = 1; // 拉高时钟线,写入数据_nop_(),_nop_(),CLK = 0; //下降沿时数据从DOUT移出}for(i = 0;i < 8;i++){CLK = 0,dat <<= 1,DIN = CY,CLK = 1;_nop_(),_nop_(),CLK = 0;}CS = 1; //CS上升沿,数据锁存
}//初始化函数
void init_max7221(void)
{write_data(0x09,0x00); //解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码 低四位不解码write_data(0x0a,0x07); //初始亮度设置 0-15设置1-16档亮度 最亮write_data(0x0b,0x05); //扫描方式选择 0-7 设置扫描1-8个LED(通俗就是控制数码管的位)write_data(0x0c,0x01); //工作模式选择 1:正常工作 0:掉电模式(开关)(长时间不用还可以关着)write_data(0x0f,0x00); //测试模式开关 1:测试模式 0:正常工作 (主要是可以闪烁变化)//地址上没有0x00和0x0d,为啥呢,没找到,也不太清除;资料上写了
}
void main(void)
{int i;init_max7221(); // 初始化while(1){for(i=0;i<8;i++) write_data(i+1,DSY_CODE[i]); // 验证低四位不解码的现象}
}
MAX7221数码管驱动的多种探索相关推荐
- 超级快充移动电源SOC芯片SW6208:内置数码管驱动,三进三出全接口快充
有需求的老板请留言 ismartware智融继SW6106之后,再次推出一款高级成超级快充移动电源SOC芯片.该芯片具有全接口快充.全协议快充.内置数码管驱动三大特点. 智融SW6208 DEMO板正 ...
- (38)FPGA数码管驱动设计(第8天)
(38)FPGA数码管驱动设计(第8天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA数码管驱动设计(第8天) 5)技术交流 6)参考资料 2 FPGA ...
- [记录] 基于STC89C52RC的贪吃蛇三色游戏机设计(内含点阵驱动、数码管驱动详解)
目录 设计目标 需求分析 硬件设计 点阵模块 数码管模块 节拍信号发生电路 蜂鸣器电路 串口驱动电路.按键电路及MCU最小系统 软件设计 重要数据结构 蛇 显存 驱动 LED点阵驱动 74595驱动 ...
- 大尺寸共阴数码管驱动电路
以前做而论道曾经写过"驱动大尺寸数码管的方法与电路"的博文,链接如下: http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item ...
- 树莓派控制3631AS数码管 驱动 python程序 共阴数码管|徐奥雯编写|XUAOWEN
使用方法: 新建py文件,将下面的驱动代码复制到文件中保存,命名为drive_3631as.py 连接树莓派与数码管 根据上面的引脚图的1-12号(没有6) 所连接树莓派的GPIO引脚,在刚刚新建的d ...
- 八、【中级篇】数码管驱动(74HC138,74HC595)
数码管驱动 1.各类数码管介绍 2.4位数码管 数码管结构: 四位共阴极数码管 3.74HC138 4.74HC595 数码管接线图以及介绍: 1.各类数码管介绍 数码管也可以称为7段数码管或者8段数 ...
- 天微TM1650数码管驱动IC新旧版 驱动和注意事项
天微TM1650数码管驱动IC新旧版 驱动和注意事项 项目场景: 项目需要一个控制板和显示,通过一条1米数据线连接主控制 TM1650市面上多,价格便宜,使用简单, 相对于用逻辑门或单片机做,开发简单 ...
- zlg72128数码管驱动管理显示芯片
数码管驱动管理显示芯片框图 数码管驱动管理显示芯片概述 ZLG72128 是广州周立功单片机科技有限公司自行设计的数码管显示驱动键盘扫描管理芯片.能够直接驱动 12 位共阴式数码管(或 96 只独立的 ...
- 8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动
从上一博文<8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动>,我们可以了解到数码管一些驱动原理,实际上静态扫描在项目中基本不会用到,在项目中我们经常用动 ...
最新文章
- 机器人II(sdutoj2585)-JAVA
- 成功解决C4996: ‘fopen‘: This function or variable may be unsafe. Consider using fopen_s instead
- RO段、RW段和ZI段 转载:RO段、RW段和ZI段
- matlab实现图像放大两倍,matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)...
- 微软携手 Docker 打造 CNAB,分布式应用来了!
- 小储云v1.782免授权版
- 9行代码提高少样本学习泛化能力! ICLR2021 Oral,代码已开源
- 【码云周刊第 3 期】来自国内开发者的实战项目,开源让通讯从未如此简单!...
- python学习路线--从入门到入土
- 我的日常Vim使用--凌波微步
- SQLPrompt10带注册机(支持SSMS v18.5)
- 修改毕设,降低查重率方法
- 【初等概率论】 01
- android 后台 截屏,Android 截屏方式
- 使用FFmpeg截取视频封面图片(完整例子)
- 基于WebUploader的文件上传插件
- [4G5G专题-49]:物理层-为什么从事计算机领域的人,学习无线通信那么难?从物理层信号处理看无线通信思维领域的切换与跨越。
- 利用树制作的简易家谱
- 金彩教育:提升产品标签的方法
- mysql 联合索引 abc_ABC联合索引生效问题(整理笔记!!!)
热门文章
- 谷歌创始人口述历史:创建谷歌是意外 曾被赶出宿舍
- 周日我们能见证历史时刻吗?反正现在先预热!
- python的编译器与解释器
- sfc 修复 xp rpc服务器,指定的错误代码是?0x000006ba?[RPC?服务器不可用。]
- .zip: Skipping, found more recently modified local copy (use --force to (关于kaggle下载数据集中断后下载失败的原因)
- CodeForces 44B- A - Cola- 分类讨论
- 雨林木风 Windows XP SP3 纯净安装版
- windows强行删除文件/文件夹
- Tair基础-从入门到入土
- jfinal生成二维码