基于80C51和MAX7219的8位数码管显示C语言源代码
MAX7219中文资料-附有程序

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX721 9的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图1所示及内部结构如图2所示。
图1 MAX7219的外部引脚分配图2 MAX7219的内部引脚分配各引脚的功能为:DIN:串行数据输入端DOUT:串行数据输出端,用于级连扩展LOAD:装载数据输入CLK:串行时钟输入DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流SEG A~SEG G DP 7段驱动和小数点驱动ISET:通过一个10k电阻和Vcc相连,设置段电流MAX7219有下列几组寄存器:(如图3)MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才可工作。
图 3 MAX7219内部的相关寄存器分别介绍如下:(1)译码控制寄存器(X9H)如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。
当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。
实际应用中可以按位设置选择B译码或是不译码方式。
图4 MAX7219的译码控制寄存器(2)扫描界限寄存器(XBH)如图5所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED 0~5显示。
51单片机程序 MAX7219

#define LSB 0x01
//max7219 part
#define DECODE_MODE 0x09
#define INTENSITY 0x0A
#define SCAN_LIMIT 0x0B
#define SHUT_DOWN 0x0C
#define DISPLAY_TEST 0x0F
{
LOAD = LOW;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
LOAD = HIGH;
}
void Init_Max7219(void) //初始化max7219子函数设置工作寄存器需要查看芯片手册
{
Write_Max7219(SHUT_DOWN,0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0
Write_Max7219(SCAN_LIMIT,0x07); //SCAN LIMIT 0~7 0xX0~0xX7
Write_Max7219(INTENSITY,0x0f); //Set Intensity 0xX0~0xXf强度调节
}
void main(void)//显示1~8数字
{
unsigned char i;
void delayms(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y-Fra bibliotek);}
void Write_Max7219_byte(unsigned char temp)//发送一个字节的子程序,上升沿发送数据
MAX7219在单片机系统显示电路中的应用

摘要:介绍8位串行LED显示驱动 ̄MAX7219的特性,并给出了单片机系统中MAX7219与MCS--51的硬件接口设计,以及相应的软件流程图和编程实现。
关键词:MAX721;单片机;显示电路单片机系统通常需要有LED对系统的状态进行观测,而很多工业控制用单片机FIMCS51系列本身并无显示接口部分,需要外接显示的译码驱动电路。
在MCS51单片机的控制系统中,采用MAxIM公司的MAX7219构成显示接口电路,仅需使用单片机3个引脚,即可实现对8位LED数码管的显示控制和驱动,线路简单,控制方便。
1MAx7219与单片机的连接MAX7219与MCS一51单片机连接时可根据具体的系统要求和系统资源占用情况选用2种驱动方式:串行口移位驱动MAX7219或I/0口模拟三线协议时序驱动MAX7219。
通常单片机系统的串口要用作其他用途,比如和上位机联机通信等。
故本系统利用单片机的I/O口来模拟MAX7219的时序,应用电路如图1所示。
其中,P2.0作串行数据输出,连接 ̄IDIN端,P2.1和P2.2连扫描电路选通某字时,相引脚DIG×为低电平。
显示接至CLK和LOAD,通过程序分别模拟MAX7219的时钟数据串行输入MAX7219,移位存入数字寄存器,片内多脉CLK及数据加载LOAD信号。
ISET管脚接l0kQ电阻路扫描电路顺序扫描,分时选通各字,被选通字的引脚用于限定峰值段电流。
置为低电平,LED发光显示数字,未选通的字引脚保持本系统的设计中,只需要5个LED,所以DIG5~DIG7高电平。
未用悬空。
显示电路中,所有LED显示器的同名段(a~f,系统设计中,应用MAX7219芯片时需要注意如下dp)连接在一起并与MAX7219的同名段引脚(SA~SG,几个关键问题:SDP)H连,各LED显示器的共阴极分别与MAX721的相(1)3根信号线。
应字引脚(DIG0一DIG4)相连,以实现位选,当MAX7219在强干扰环境中,如大功率电机的启停或高压发生过程中,干扰源可能通过供电电源或3根信号线串入显示电路,造成显示器的不稳定,从而出现段闪烁、显示不全、甚至全暗或全亮的现象。
(附汇编语言源码)基于89C51的8路抢答器

《微机原理》课程项目实施报告题目:基于89C51的8路抢答器二零二年六月十五日摘要现如今电视节目日益丰富其中的竞赛环节也越来越多,其中智力抢答器是不可或缺的器材。
采本次课程设计,我们设计了一种以单片机AT89C51为核心的八路抢答器,与晶振、数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的八路抢答器具有实时显示抢答选手的号码和抢答时间的特点,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用汇编语言编程,使其实现一些基本的功能。
通过Proteus软件仿真,仿真结果表明,该抢答器的设计实现了预期的目标。
关键词:89C51,抢答器,proteus仿真,汇编语言目录第一章项目概述 (3)1.1项目要求 (3)1.2 项目软件 (3)1.3 功能实现 (3)1.4 所需器件清单 (3)第二章硬件模块设计 (4)2.1 系统框图 (4)2.2 系统硬件 (4)2.2.1 A T89C51介绍 (4)2.2.2 A T89C51引脚功能说明 (5)2.2.3 电源电路 (6)2.3 时钟频率 (7)2.4 复位电路 (7)2.5 显示模块 (8)2.6 键盘扫描电路 (9)2.6.1 抢答键盘 (9)2.6.2 主持人按键 (9)2.7 报警电路 (10)第三章软件设计 (11)3.1 主程序流程 (11)3.2 抢答器的软件设计 (12)3.3程序分析总结 (12)第四章系统调试与仿真结果 (13)4.1 软件调试 (13)4.2 系统仿真结果 (13)项目分工............................................................................................................... 错误!未定义书签。
参考文献 (15)附件主程序 (16)第一章项目概述1.1项目要求(1)构建proteus 仿真平台:包含抢答输入+串口+数码管;(2)通过串口设置计时器的开始,并把抢答结果通过串口输出;(3)数码管输出抢答结果+组号;(4)比赛结束,能发出报警声。
max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚
8位串行接口数码显示驱动器MAX7219及其应用

8位串行接口数码显示驱动器MAX7219及其应用潍坊高等专科学校 王瑞兰LED数码管的应用已十分广泛,用于数码管显示的驱动电路种类较多,但大致可分为静态显示驱动和动态扫描显示驱动两大类别。
本文所要介绍的MAX7219芯片就是 用于动态扫描显示驱动的芯片。
该芯片的特点是利用一块芯片就能完成8位字数据和8位线数据的驱动,使得电路紧凑。
多芯片级联时,采用串行输入输出,可节省CPU的口线和接口芯片。
与数码管联接时无需限流电阻,8位显示的电流可通过一个外部电阻进行调节。
显示亮度也可通过程序进行控制。
片内具有,可以对输入的数据先进行译码再驱动输出,也可以将输入的数据直接驱动。
一、管脚功能MAX7219采用24管脚DIP和SO两种封装形式,管脚排列如图1所示,各引脚功能见表1。
二、MAX7219内部结构MAX7219的内部功能框图如图2所示。
16位移位寄存器所存数据为D0~D15,见表2。
D8~D11为寄存器地址,D0-D7为数据,D12-D15为不关心位。
片内有14个寄存器,其中8个数据寄存器,寄存着与DIG 0-DIG 7对应的显示数据,地址依次为×1H-8H;6个控制寄存器,即译码控制寄存器(Decode Mode)、显示亮度控制寄存器(Intensity)、扫描频率限制寄存器(Scan Limit)、消隐控制寄存器(Shutdown)、显示测试寄存器Display Test)及无操作寄存器(No-Op),其地址依次为×9H-CH、×FH、×0H。
数据寄存器为8×8双指针SRAM。
因为各寄存器可直接寻址,所以寄存器的数据可分别进行修改。
寄存器的数据可以保存到电源电压降低到2V。
三、控制寄存器1. Shutdown 寄存器Shutdown 寄存器写入×××××××0B数据时,将呈现消隐状态。
八位数码管滚动显示案例设计说明

“八位数码管滚动显示”程序设计说明1程序设计思路8位数码管动态扫描是经典的测试数码管是否正常工作和学习使用数码管显示的案例,首先要理解段选和位选概念,段选是选择一个数码管上哪个发光二极管发光,而位选则是选择八个数码管中哪个数码管来显示。
8位数码管动态扫描电路连接示意图2关键代码设计说明2.1公共变量定义及说明sbit Sel0=P2^0;//sbit Sel1=P2^1;//sbit Sel2=P2^2;//位选的三个引脚控制位uchar show_w1;uchar show_w2;uchar show_w3;uchar show_w4;uchar show_w5;uchar show_w6;uchar show_w7;uchar show_w8;//show_wi(i=1,2,3,4,……,8)分别是对应左到右的各个数码管上的显示的数字uchar flag;//分频作用,同时用作位选下标uchar count;//分频作用的变量uchar duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x40,0x00}; //段选,显示0-fuchar weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //位选,选择是0-7中的一个数码管2.2 Init():完成初始化配置;(1)P0和P2口需要设置成推挽模式输出,以驱动LED数码管正常显示。
P2M1=0x00; P2M0=0xff; P0M1=0x00; P0M0=0xff;(2)TMOD=0x01; //定时器0采用模式1(3)打开中断并允许定时器0中断EA=1;//打开总中断ET0=1;//允许定时器0中断TR0=1;//启动定时器0(4)设置定时器初始值TH0=(65535-1000)/256; TL0=(65535-1000)%256;(5)设置位选位flag初始值为0;(6)为每个数码管要显示的内容赋初值show_w1=0;show_w2=1;show_w3=2;show_w4=3;show_w5=4;show_w6=5;show_w 7=6;show_w8=7;2.3void timer0() interrupt 1当定时器0初始值不断加一最终溢出时激发的处理方法。
用汇编语言实现八段数码管显示

⽤汇编语⾔实现⼋段数码管显⽰⽤汇编语⾔实现⼋段数码管显⽰⼀、实验要求利⽤实验仪提供的显⽰电路,动态显⽰⼀⾏数据.⼆、实验⽬的1. 了解数码管动态显⽰的原理。
2. 了解⽤总线⽅式控制数码管显⽰三、实验线路及连线四、实验说明1.本实验仪提供了6 位8段码LED 显⽰电路,只要按地址输出相应数据,就可以实现对显⽰器的控制。
显⽰共有6位,⽤动态⽅式显⽰。
8位段码、6位位码是由两⽚74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显⽰位。
本实验仪中 8位段码输出地址为0X004H ,位码输出地址为 0X002H 。
此处X 是由KEY/LED CS 决定,参见地址译码。
做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。
以便⽤相应的地址来访问。
例如,将KEY/LED CS 接到CS0上,则段码地址为08004H ,位码地址为08002H 。
位选通信号 (0x002H)段码输出 (0x004H)数据总线七段数码管的字型代码表如下表:五、程序框图程序代码OUTBIT equ 08002h ; 位控制⼝OUTSEG equ 08004h ; 段控制⼝LEDBuf equ 60h ; 显⽰缓冲Num equ 70h ; 显⽰的数据DelayT equ 75h ;ljmp StartLEDMAP: ; ⼋段管显⽰码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ;mov r7, #0djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED:mov r0, #LEDBuf mov r1, #6 ;mov r2, #00100000b ; Loop:mov dptr, #OUTBIT mov a, #0movx @dptr, a ;mov a, @r0mov dptr, #OUTSEG movx @dptr,amov dptr, #OUTBIT mov a, r2movx @dptr, a ;mov r6, #01call Delaymov a, r2 ;rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBIT mov a, #0movx @dptr, a ;retStart:mov sp, #40hmov Num, #0 MLoop:inc Nummov a, Nummov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ;mov @r0,a ;inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#0DispAgain:call DisplayLED ;djnz DelayT,DispAgain ljmp MLoop end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#ifndef _PWLOCK_H // 防止PWLock.h被重复引用#define _PWLOCK_H#include <reg52.h>#include <absacc.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intuchar digbit; // 字位uchar wordbuf[6]; // 字型码缓冲区uchar t1count; // 定时器1由50ms累积到1s所用的计数器uchar count; // 密码位计数uchar pw[6]; // 初始密码存储区uchar pwbuf[6]; // 输入密码存储区bit enterflag; // 确认键按下与否标志bit pwflag; // 密码正确与否标志bit showflag; // 数码管显示与否标志sbit green=P3^0;sbit red=P3^1;void display(void); // 显示函数#endif/**************以上是头文件***********//**************以上C文件****************/#include "PWLock.h"/* 键消抖延时函数*/void delay(void){uchar i;for (i=300;i>0;i--);}/* 键扫描函数*/uchar keyscan(void)uchar scancode,tmpcode;P1 = 0xf0; // 发全0行扫描码if ((P1&0xf0)!=0xf0) // 若有键按下{delay(); // 延时去抖动if ((P1&0xf0)!=0xf0) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x10)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf0)!=0xf0) // 本行有键按下{tmpcode = (P1&0xf0)|0x0f;/* 返回特征字节码,为1的位即对应于行和列*/return((~scancode)+(~tmpcode));}else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}/* 定时器0中断服务子程序,2ms定时动态扫描显示*/void time0_int(void) interrupt 1{/* 重置2ms定时*/TH0 = -2000/256;TL0 = -2000%256;if (showflag==1)display(); // 调用显示函数}/* 定时器1中断服务子程序,50ms*/void time1_int(void) interrupt 3{uchar k;/* 重置50ms定时*/TH1 = -50000/256;TL1 = -50000%256;if (t1count<20){t1count++;}else // 计时到1s{TR1 = 0; // 关闭计数器1t1count = 0;green = 1; // 绿灯不亮red = 1; // 红灯不亮showflag = 1; // 打开数码管显示digbit = 0x01; // 从数码管第1位开始动态显示for (k=0;k<6;k++) // 显示888888wordbuf[k] = 8;}}/* 根据共阴极字型编码表获取0~9,A~B字型代码*/uchar getcode(uchar i){uchar p;switch (i){case 0: p=0x3f; break; /* 0 */case 1: p=0x06; break; /* 1 */case 2: p=0x5B; break; /* 2 */case 3: p=0x4F; break; /* 3 */case 4: p=0x66; break; /* 4 */case 5: p=0x6D; break; /* 5 */case 6: p=0x7D; break; /* 6 */case 7: p=0x07; break; /* 7 */case 8: p=0x7F; break; /* 8 */case 9: p=0x67; break; /* 9 */case 10: p=0x77; break; /* A */case 11: p=0x7C; break; /* B */case 12: p=0x39; break; /* C */case 13: p=0x5E; break; /* D */case 14: p=0x79; break; /* E */case 15: p=0x71; break; /* F */default: break;}return(p);}/* 显示函数*/void display(void){uchar i;switch (digbit){case 1: i=0; break;case 2: i=1; break;case 4: i=2; break;case 8: i=3; break;case 16: i=4; break;case 32: i=5; break;default: break;}P2 = 0x0; // 关闭显示P0 = getcode(wordbuf[i]); // 送字型码P2 = digbit; // 送字位码if (digbit<0x20) // 共6位digbit = digbit*2; // 左移一位elsedigbit = 0x01;}/* 密码比较函数*/bit pwcmp(void){bit flag;uchar i;for (i=0;i<6;i++){if (pw[i]==pwbuf[i])flag = 1;else{flag = 0;i = 6;}}return(flag);}/* 主程序*/void main(){uchar j,key;P2 = 0x0; // 关闭数码管显示TMOD = 0x11; // T0,T1工作方式1/* 2ms 定时设置*/TH0 = -2000/256;TL0 = 2000%256;/* 50ms 定时设置*/TH1 = -50000/256;TL1 = -50000%256;/* 启动计数器0,关闭计数器1 */TR0 = 1;ET0 = 1;TR1 = 0;ET1 = 1;EA = 1;count = 0; // 初始没有输入密码,计数器设为0 enterflag = 0; // 没有按下确认键pwflag = 0; // 密码标志先置为0green = 1; // 绿灯不亮red = 1; // 红灯不亮/* 假设内定密码为937602 */pw[0] = 9;pw[1] = 3;pw[2] = 7;pw[3] = 6;pw[4] = 0;pw[5] = 2;digbit = 0x01; // 从第一位数码管开始动态扫描/* 刚加电时,显示888888 */for (j=0;j<6;j++)wordbuf[j] = 8;showflag = 1; // 打开数码管显示while(1){key = keyscan(); // 调用键盘扫描函数switch(key){case 0x11: // 1行1列,数字0 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F”pwbuf[count] = 0;count++;}break;case 0x21: // 1行2列,数字1 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 1;count++;}break;case 0x41: // 1行3列,数字2 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 2;count++;}break;case 0x81: // 1行4列,数字3 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 3;count++;}break;case 0x12: // 2行1列,数字4 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 4;count++;}break;case 0x22: // 2行2列,数字5 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 5;count++;}break;case 0x42: // 2行3列,数字6 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 6;count++;}break;case 0x82: // 2行4列,数字7 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 7;count++;}break;case 0x14: // 3行1列,数字8 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 8;count++;}break;case 0x24: // 3行2列,数字9 if (count<6){wordbuf[count] = 0x0f; // 对应密码位上显示“F"pwbuf[count] = 9;count++;}break;case 0x44: // 3行3列,确认键enterflag = 1; // 确认键按下if (count==6) // 只有输入6个密码后按确认键才作密码比较pwflag = pwcmp();elsepwflag = 0; // 否则直接pmflag赋0break;case 0x84: // 3行4列,取消键count = 0; // 密码计数清零for (j=0;j<6;j++){wordbuf[j] = 8; // 数码管显示888888pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码}break;default:break;}if (enterflag==1) // 如果按下确认键{enterflag = 0; // 标志位置回0count = 0; // 密码位计数器清零for (j=0;j<6;j++)pwbuf[j] = 0x0f; // 用FFFFFF清除已经输入的密码showflag = 0; // 关闭数码管显示TR1 = 1; // 计数器1开始计数t1count = 0; // 定时器1由50ms累积到1s所用的计数器if (pwflag==1)green = 0; // 绿灯亮elsered = 0; // 红灯亮}}}。