STC15控制数码管 38译码器
共阳极数码管举例
#define MAIN_Fosc 27000000L //定义主时钟
#include "STC15Fxxxx.H"
#define uchar unsigned char
void enable_38(void);
void LED_OUT(uchar X);
void Led_test(char pos);
//数码管显示0-9值,全暗状态是0xFF
unsigned char code LED_0F[] =
{
//0 1 2 3 4 5 6 7 8 9
0x11, 0xD7, 0x32, 0x92, 0xD4, 0x98, 0x18, 0xD3, 0x10, 0x90,
};
//595控制数码管
sbit DIO = P2 ^ 7; //串行数据输入
sbit RCK = P2 ^ 6; //锁存
sbit SCK = P2 ^ 5; //移位
//38译码器3个输入和1个使能
sbit _74HC238_A0 = P2 ^ 4;
sbit _74HC238_A1 = P2 ^ 3;
sbit _74HC238_A2 = P2 ^ 2;
sbit _74HC238_E1 = P2 ^ 1; //拉低有效
//用于控制38译码器输出不同值,来源于真值表
uchar _38[] = {0x0, 0x10, 0x8, 0x18}; //位选每个数码管
// 主程序
void main(void)
{
P0M1 = 0;
P0M0 = 0; //设置为准双向口
P1M1 = 0;
P1M0 = 0;
P2M1 = 0;
P2M0 = 0;
P3M1 = 0;
P3M0 = 0;
P4M1 = 0;
P4M0 = 0;
P5M1 = 0;
P5M0 = 0;
P6M1 = 0;
P6M0 = 0;
P7M1 = 0;
P7M0 = 0;
while(1)
{
enable_38();
}
}
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
u16 i;
do
{
i = MAIN_Fosc / 13000;
while(--i);
}
while(--ms);
}
//使能38译码器输出不同值,此函数很重要
//因为是共阳极数码管,所以必须先段选(先给电平)再位选(使能),不然有微弱重影
void enable_38(void)
{
static char index = 0; //代表位选第n列
Led_test(index); //显示第n列
//位选
P2 &= 0xE3;
P2 |= _38[index];
//38译码器使能
_74HC238_E1 = 0;
delay_ms(1);
//38译码器去使能,必须要去使能以后再使能下一个数码管,不然有严重重影
_74HC238_E1 = 1;
index++; //循环点亮
index %= 4; //一共4列
}
//点亮一个数码管
void LED_display(uchar X)
{
LED_OUT(X); //段选
RCK = 0; //锁存
RCK = 1;
}
/*
38译码器每次位选一列数码管,一列有四个数码管,分别用595控制
pos: 第n列数码管
*/
void Led_test(char pos)
{
switch(pos)
{
case 0:
//位选一次,分别点亮4个数码管
LED_display(LED_0F[0]);
LED_display(LED_0F[1]);
LED_display(LED_0F[2]);
LED_display(LED_0F[3]);
break;
case 1:
LED_display(LED_0F[3]);
LED_display(LED_0F[2]);
LED_display(LED_0F[1]);
LED_display(LED_0F[0]);
break;
case 2:
LED_display(LED_0F[5]);
LED_display(LED_0F[6]);
LED_display(LED_0F[7]);
LED_display(LED_0F[8]);
break;
case 3:
LED_display(LED_0F[8]);
LED_display(LED_0F[7]);
LED_display(LED_0F[6]);
LED_display(LED_0F[5]);
break;
default:
break;
}
}
//单个数码管显示
void LED_OUT(uchar X)
{
uchar i;
for(i = 8; i >= 1; i--)
{
if(X & 0x80)
{
DIO = 1;
}
else
{
DIO = 0;
}
X <<= 1;
SCK = 0; //移位
SCK = 1;
}
}
38译码器:https://blog.csdn.net/zhangxuechao_/article/details/91566673
STC15控制数码管 38译码器的更多相关文章
- 8-3编码器,3-8译码器的verilog实现
在数字系统中,由于采用二进制运算处理数据,因此通常将信息变成若干位二进制代码.在逻辑电路中,信号都是以高,低电平的形式输出.编码器:实现编码的数字电路,把输入的每个高低电平信号编成一组对应的二进制代码 ...
- STC-51开发板-单片机控制数码管&按键&点阵综合操作
操作: 实现按下一个按键,对应的数码管和点阵显示相应的数字 代码: /* *******************数码管按键综合项目********************* */ #include ...
- 用Verilog语言设计一个3-8译码器
case语句 if_case语句 源码下载 Github >>
- [51单片机] 以从0开始做4位8段共阴数码管3461AS驱动谈细节决定高质量DIY
目录 1)问题产生 2)失败尝试 3)最终方案 4)使用方法 5)知识共享 1)问题产生 在上一篇“以PWM控制直流电机为例建一个简单的51工程框架”中已向大家介绍了一个封装好的8位8段数码管的驱动( ...
- C51 动态数码管 个人笔记
8段led管构成一个数字. 开发板上共有8个数字. 每个数字有一个使能端(段选引脚) 每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起 轮流点亮不同数字,速度很快,视觉暂留,从而形 ...
- 数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)
一个数码管有九个引脚,控制八段二极管的亮灭,用以显示需要的数字. 当有N个数码管时,一个一个控制的话需要N x 9 个引脚,消耗资源较多. 因此可以利用动态显示的方案通过人眼的视觉暂留特性达到静态显示 ...
- 03-组合逻辑电路设计之译码器——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线——普利斯队长精心奉献 课程目标: 1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2. 以译码器为例学会简单组合逻辑电路设计 实验平台:无 实验原理: 组合逻辑, ...
- 《FPGA全程进阶---实战演练》第十章 数码管实验
1基础理论部分 led数码管是由多个发光二极管封装在一起组合的“8”字型的器件,引线内部已经完成,如下图10.1所示,图10.2为实物图. 图10.1 数码管内部结构 那么我们想要控制数码管的亮灭,其 ...
- Verilog学习笔记简单功能实现(四)...............译码器和编码器
这里以简单的3-8译码器和8-3编码器为例: module decoder3_8(a,out); :]a; :]out; 'b1<<a;/*把最低位的1左移in位(根据in口输入的值)并赋 ...
随机推荐
- go-爬图片
go语言爬取图片 注:动态加载出来的爬取不到,或怕取出来图片出错,代码中的网页是可以正常爬取的 package main import ( "fmt" "io" ...
- Web前端基础(18):jQuery基础(五)
1. 事件 前面我们介绍完js的事件流的概念之后,相信大家对事件流也有所了解了.那么接下来我们看一下jquery的事件操作. 在说jquery的每个事件之前,我们先来看一下事件对象 . 1.1 事件对 ...
- 一篇文章,彻底理解ReentrantLock
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- PlayJava Day013
今日所学: /* 2019.08.19开始学习,此为补档. */ 1.BufferedImage:是Image的一个子类,两者的主要作用就是将一副图片加载到内存中,即图像缓冲区. 对于本地图片: Fi ...
- Python进程池multiprocessing.Pool的用法
一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...
- kvm2
kvm虚拟机的桥接网络 默认的虚拟机网络是NAT模式,网段192.168.122.0/24 1:创建桥接网卡 创建桥接网卡命令 virsh iface-bridge eth0 br0 取消桥接网卡命令 ...
- 利用keras进行手写数字识别模型训练,并输出训练准确度
from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.lo ...
- hadoop访问50070
http://ip:50070 注意id必须是namenode节点才能访问,datanode不能访问
- new和delete创建和释放动态数组
1.动态创建和释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态 ...
- C++ class 内的 () 重载示例
#include <iostream> // overloading "operator () " outside class //////////////////// ...