基于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。
八段数码管显示程序
;********************************************** ;MCS-51系列单片机仿真实验系统软件实验项目;八段数码管显示程序;********************************************** cs8255 equ 0ffffh ;8255命令控制口outseg equ 0fffch ;字形控制口outbit equ 0fffdh ;字位/键扫控制口LEDBuf equ 60h ;显示缓冲Num equ 70h ;显示的数据DelayT equ 75h ;延迟参数org 0Start:mov sp,#40hmov Num,#0mov dptr,#CS8255mov a,#88h ;命令字:A,B口输出movx @dptr,a ;8255初始化MLoop:inc Nummov a,Nummov b,amov r0,#LEDBufFillBuf:mov a,banl a,#0fhmov dptr,#LEDMapmovc a,@a+dptr ;数字转换成显示码mov @r0,a ;显示在码填入显示缓冲inc r0inc bcjne r0,#LEDBuf+8,FillBufmov DelayT,#100DispAgain:call DisplayLED ;显示djnz DelayT,DispAgainljmp MLoopDelay: ;延时子程序mov r7,#0DelayLoop:djnz r7,DelayLoopdjnz r6,DelayLoopretDisplayLED:mov r0,#LEDBufmov r1,#8 ;共8个LED八段管mov r2,#10000000b;从左边开始显示Loop:mov dptr,#OUTBITclr amovx @dptr,a ;关所有八段管mov a,@r0mov dptr,#OUTSEGmovx @dptr,amov dptr,#OUTBITmov a,r2movx @dptr,a ;显示一位八段管mov r6,#01call Delaymov a,r2 ;显示下一位rr amov r2,ainc r0djnz r1,Loopmov dptr,#OUTBITclr amovx @dptr,a ;关所有八段管retLedMap: ;八段管显示码db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8hdb 080h,090h,088h,083h,0c6h,0a1h,086h,08ehend。
80C51键盘显示的编程
•uchar data dis_buf[6];//显示缓冲区 •uchar code table[18]= •{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0 x71,0x40,0x00 }; •void dl_1ms( ); •void display( ) //显示函数 •{ data uchar segcode, bitcode, i; • bitcode=0xfe; //位码初值 • for(i=0;i<6;i++) • { segcode=dis_buf[i]; //查表 • PA8255=table[segcode];
•void main(void) •{ unsigned int i1; • COM8255=0x80;//8255初始化 • while(1) • { dis_buf[0]=1; dis_buf[1]=2; dis_buf[2]=3; • dis_buf[3]=4; dis_buf[4]=5; dis_buf[5]=6; • display( ); //调用显示 • for(i1=0;i1<300;i1++) //延时 • { display( ); }
用MCS-51单片机串行口对MAX7219及显示器控制的方法和程序
介绍MAX7219的功能,与MCS-51的时序配合及一种新颖的利用MCS-51串行方式0对MAX7219及显示器控制的方法和程序。
单片机系统通常需要有LED对系统的状态进行观测,而很多工业控制用单片机如MCS-51系列本身并无显示接口部分,需要外接显示的译码驱动电路。
LED数码管显示有动态显示和静态显示两种方式。
通常不管采用哪种显示方式,单片机往往都工作于并行I/O或存储器方式。
作者在采用MCS-51单片机的控制系统中,利用MAXIM公司的串行接口8位LED显示驱动器MAX7219构成显示接口电路,仅需使用单片机3个引脚,即可实现对8位LED数码管的显示控制和驱动,线路非常简单,控制简单方便。
1 MAX7219的功能和设置:MAX7219芯片为MAXIM公司推出的串行输入/输出共阴极显示驱动器,是用一个芯片实现以往用软件完成的动态显示电路扫描工作的器件。
每片可控制显示8个七段LED数码管、条形图或64个发光二极管,控制字简单,可与各种微机接口。
为24引脚芯片,除与显示器连接外,与微机串行口为3线连接,芯片外部电路仅为一限制峰值段电流的电阻,线路简单,极大地方便了对显示器件的控制。
该芯片控制的显示位数多,控制字少,可对全部或个别显示位的数据进行更新。
并可方便地进行多个芯片的级联,扩展显示容量。
MAX7219有多种封装形式,如窄式DIP封装。
MAX7219的串行数据格式如表1所示。
其中:D12~D15位不用;D8~D11为显示位和各种工作方式的控制寄存器地址位,可选择要显示的位、解码方式、显示亮度、扫描位数、停止方式、显示测试等,其地址分布如表2所示;D0~D7为数据位,其形式与显示出的数字间的关系与解码方式有关。
表2中X可为16进制任意值,一般取为0。
每组16位数据中,首先接收的为最高有效位,最后接收的为最低有效位。
解码方式寄存器可设置各位数码管为解码显示方式,或非解码的数据位与显示段直接对应的显示方式。
51单片机驱动8位数码管电路图+程序
51单片机驱动8位数码管电路图+程序电路图:JP10排线连接J12 J21跳线跳12处测试程序#includetypedef unsigned char BYTE;typedef unsigned int WORD;sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制//此表为LED 的字模, 共阴数码管 0-9 -BYTE code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};WORD LedOut[10];//数码管数组/************************************************************** **************** 延时程序 **************************************************************** *************/void Delay(WORD n){WORD x;while (n--){x = 250;while (x--);}}/************************************************************** **************** 显示函数 *****************************************************************************/void display(WORD num){WORD i,LedNumVal ;LedNumVal=num;LedOut[0]=Disp_T ab[LedNumVal%100000/10000]; //万位LedOut[1]=Disp_T ab[LedNumVal%10000/1000]; //千位LedOut[2]=Disp_T ab[LedNumVal%1000/100]; //百位LedOut[3]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[4]=Disp_T ab[LedNumVal%10]; //个位LedOut[5]=Disp_T ab[LedNumVal%1000/100]|0x80; //百位带小数点LedOut[6]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[7]=Disp_T ab[LedNumVal%10]; //个位for( i=0; i<8; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}Delay(1);}}main(){while(1){display(12345); }}。
用PIC单片机驱动按键控制8个数码管的显示的C程序
用PIC16F877A单片机驱动按键控制8个数码管的显示的C程序经典按键控制数码管C程序#include <htc.h>#define HC595_SER RB7#define HC595_SCK RB6#define HC595_RCK RB5#define key_164_data RB3#define key_164_clk RB2#define key_com1 RB1#define key_com0 RB0#define TURE 1bit key_finish; //定义的位变量,这是PICmate仿真软件环境的特有的地方unsigned int sample_key;unsigned int sample_keyBuf[2];unsigned int key_value;unsigned char key_row_sel;unsigned char key_number;//键号unsigned int T100ms;unsigned char disbuf[8];const unsigned char seven_seg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71};//----------------------------------------------void disbuf_update(void){if(key_number>=16){disbuf[0]=0xff;disbuf[1]=0xff;disbuf[2]=0xff;disbuf[3]=0xff;disbuf[4]=0xff;disbuf[5]=0xff;disbuf[6]=0xff;disbuf[7]=0xff;return;}disbuf[0]=seven_seg[key_number];disbuf[1]=seven_seg[key_number];disbuf[2]=seven_seg[key_number];disbuf[3]=seven_seg[key_number];disbuf[4]=seven_seg[key_number];disbuf[5]=seven_seg[key_number];disbuf[6]=seven_seg[key_number];disbuf[7]=seven_seg[key_number];}//----------------------------------------------void inite_time0(void) //对timer0中断进行初始化{PSA=0;T0CS=0;T0IF=0;GIE=1;T0IE=1;TMR0=0xf0;PS0=1;PS1=1;PS2=1;}//----------------------------------------------//发送一个字节void s_pData(unsigned char key) //形参key对应着实参disbuf[i]{unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))HC595_SER=1;else HC595_SER=0;HC595_SCK=0;HC595_SCK=1;}}//----------------------------------------------//发送一个字节void Key_s_pData(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))key_164_data=1;elsekey_164_data=0;key_164_clk=0;key_164_clk=1;}}//---------------------------------------------- void display (void){unsigned char i;for(i=0;i<8;i++)s_pData(disbuf[i]);HC595_RCK=0;HC595_RCK=1;}//---------------------------------------------- void key_process(void){unsigned char i;for(i=0;i<16;i++){if( (key_value&(0x0001<<i)) ){key_number=i;return;}}}//---------------------------------------------- //主程序int main(void){PORTB=0;TRISB=0x03;inite_time0();key_number=0xff;while(1){if(key_finish==TURE){//按键扫描成功key_process();key_finish=0;}if(T100ms<10)continue;T100ms=0;disbuf_update();display();}}//---------------------------------------------- void scan_key(void){sample_key =sample_key<<1;if(key_com1)sample_key |=0x0001;sample_key =sample_key<<1;if(key_com0)sample_key |=0x0001;key_row_sel++;if(key_row_sel<8){Key_s_pData(1<<key_row_sel);return;}key_row_sel=0;Key_s_pData(1<<key_row_sel);sample_keyBuf[0]=sample_key;if(sample_keyBuf[1]!=sample_keyBuf[0]){sample_keyBuf[1]=sample_keyBuf[0];return;}key_value=sample_keyBuf[0];if(key_value!=0)key_finish=TURE;}//-------------------------------------------- //2ms中断interruptvoid time_int(void){if(T0IF==1){T0IF=0;TMR0=0xf0;T100ms++;scan_key();}}它的电路图可以参考用PIC16F877A单片机驱动按键控制8个数码管的显示电路图.。
串行接口8位LED显示驱动器MAX7219
就可为所有的 L ED 提供段电流 。 MAX7219 的三线串行接口适用于所有微
处理器 ,单一位数据可被寻址和修正 ,无需重写 整个显示器 。MA X7219 具有软件译码和硬件 译码两种功能 , 软件译码是根据各段笔划与数 据位的对应关系进行编码 , 硬件译码采用 BCD 码 (简称 B 码) 译码 。MA X7219 工作模式包括 150μA 低压电源关闭模式 、模拟数字亮度控 制 、限扫寄存器 (允许用户从第 1 位数字显示到 第 8 位) 及测试模式 (点亮所有 L ED) 。
变显示或影响任何控制寄存器 。
3. 工作原理
3. 1 关闭模式 当 MA X7219 处于关闭模式时 , 扫描振荡
器停止工作 ,所有的段电流源接地 ,所有的位驱 动器上拉为高电平 ,显示器为消隐状态 ,寄存器 的数据保持不变 。关闭模式寄存器数据的 16 进 制码为 ×0 ,正常工作的 16 进制码为 ×1 。系统 上电时 MA X7219 进入关闭模式 ,这样 ,用户必 须在使用 MAX7219 之前为显示驱动器编程 , 否则 , 它一开始就置位扫描 , 数据寄存器不译 码 ,强度寄存器也将置于最小值 。 3. 2 译码模式寄存器
A GA IN : CL R P1. 0 MOV A ,R0
;显示位
L CALL CHAN GE MOV A , @R1 ;取出显示数据 L CALL CHAN GE ;输出数据
SE TB IN C IN C DJ N Z
P1. 0 R0 ;指向下一位 R1 ;指向下一位显示数据 R2 ,A GA IN ;8 位未完 ,继续
20
DOU T 串行数据输出端 。从 DIN 端输入的数据经过 16. 5 个时钟周期后输出到 DOU T 端
集成电路英文代码对照
集成电路英文代码及中文对照〔一〕我的文摘2021-11-21 11:32:53 阅读111 评论0 字号:大中小订阅产品名称型号规格性能说明LMLM24J 四运放(军用级)LM148J 通用四运放LM1875T 无线电控制/接收器LM224J 四运放(工业级)LM258N 别离式双电源双运放LM2901N 四电压比拟器LM2904N 四运放LM301AN 通用运算放大器LM308N 单比拟器LM311P 单比拟器LM317L 可调三端稳压器/100mALM317TLM317K 可调三端稳压器/3ALM318 高速宽带运放LM324K 通用四运放LM331N V-F/F-V转换器基准电压电路LM336 5V 基准电压电路LM337T 基准电压电路1ALM338K 可调三端稳压器5ALM339N 四比拟器LM348N 四741运放LM358N 低功耗双运放LM361N 高速差动比拟器LM386N 声频功率放大器LM3914N 十段点线显示驱动LM393N 低功耗低失调双比拟器LM399H 精细基准源(6.9)LM723CN 可调正式负稳压器LM733CN 视频放大器LM741J 单运放LM741CN 双运放NENE521 高速双差分比拟器NE5532 双运放NE5534 双运放NE555N 单运放NE555J 时基电路军品极NE556 双级型双时基电路NE564 锁相环NE565 锁相环NE567 音调译码器NE592 视频放大器OPOP07 低噪声运放OP27 超低噪声精细运放OP37 超低噪声精细运放光电耦合4N25 晶体管输出4N25MC 晶体管输出4N26 晶体管输出4N27 晶体管输出4N28 晶体管输出4N29 达林顿输出4N30 达林顿输出4N31 达林顿输出4N32 达林顿输出4N33 达林顿输出4N33MC 达林顿输出4N35 达林顿输出4N36 晶体管输出4N37 晶体管输出4N38 晶体管输出4N39 可控硅输出6N135 高速光耦晶体管输出6N136 高速光耦晶体管输出6N137 高速光耦晶体管输出6N138 达林顿输出6N139 达林顿输出MOC3020 可控硅驱动输出MOC3021 可控硅驱动输出MOC3023 可控硅驱动输出MOC3030 可控硅驱动输出MOC3040 过零触发可控硅输出MOC3041 过零触发可控硅输出MOC3061 过零触发可控硅输出MOC3081 过零触发可控硅输出TLP521-1 单光耦TLP521-2 双光耦TLP521-4 四光耦TLP621 四光耦TIL113 达林顿输出TIL117 TLL逻辑输出PC814 单光耦PC817 单光耦H11A2 晶体管输出H11D1 高压晶体管输出H11G2 电阻达林顿输出LFLF347N 宽带JFET输入四运放LF351N 宽带JFET输入运放LF353N JFET输入宽带运放LF355N JFET输入运放LF357N JFET宽带非全裣运放LF398N 采样/保持电路LF412N 低偏向飘移输入运放MCMC1377 彩色电视编码器MC1403 精细电压基准源(2.5)MC1413 周边七段驱动阵列MC1416 周边七段驱动陈列MC14409 二进制脉冲拨号器MC14433 3位半A/D转换器MC14489 多字符LED显示驱动器MC145026 编码器VD5026 编码器MC145027 译码器VD5027 译码器MC145028 译码器MC145030 编码译码器MC145106 频率合成器MC145146 4位数据总线TLTL062 低功耗JEFT输入双运放TL072 低噪声JEFTTL082TL084TL431TL494ULNULN2003 周边七段驱动陈列ULN2004 周边七段驱动陈列ULN2803 周边八段驱动陈列ULN2804 周边八段驱动陈列ICLICL7106 3位ADC/驱动LCDICL7107 3位半ADC/驱动LEDICL7109 4位半ADC/驱动LEDICL7129 4位半ADC/LCD驱动ICL7135 ADC/LCD驱动BCD输出ICL7136 3位半CMOSADC/LCD驱动ICL7218 CMOS低功耗运算放大器ICL7650 整零运放斩波ICL7652 整零运放斩波ICL7660 CMOS直流-直流转换器ICL8038 函数信号发生器ICL8049 反对数放大器CACA3140 单BIMOS运行CA3240 单BIMOS运行UCUC3842 WM电流型控制器UC3845 PWM电流型控制器DSDS12887 非易失实时时钟芯片L3845 中继接口电路SGSG3524 PWM解调调制器SG3525 PWM解调调制器20216 前置放大器MTMT8814 8x12模拟交换矩阵MT8816 8x模拟交换矩阵MT8870 综合DTMF接收器MT8870 综合DTMF接收器MT8880 综合DTMF发生接收器MIC24LC01 128x8串行EEPROM24LC02 256x8串行EEPROM24LC04 512x8串行EEPROM24LC16 2Kx8串行EEPROM93LC46 64x16串行EEPROM93LC56 256x16串行EEPROM93LC66 512x8 256x16 EEPROMPIC16C52 384x12 单片机PIC16C54 512x12 单片机PCI16C56 512x12 单片机PIC16C57 2048x12 单片机ATAT24C01 128x8串行EEPROMAT24C02 256x8串行EEPROMAT24C04 512x8串行EEPROMAT24C16 2Kx8串行EEPROMAT93C46 64x16串行EEPROMAT93C56 256x16串行EEPROMATF16V8 FLASH200门ATF20V8 FLASH300门高速ATF22V10 FLASH500门高速低电流AT28C16 2Kx8CMOS并行EEPROMAT28C17 2Kx8CMOS并行EEPROMAT28C64 8Kx8并行EEPROMAT28C256 32Kx8并行EEPROMAT28F010 128Kx8并行EEPROMA29C040 512Kx8 FLASH EEPROMHM6116 2Kx8 CMOS 静态PAMHY6264 8Kx8 CMOS 静态RAMHM6264 8Kx8 CMOS 静态RAMIS62C64 8Kx8 高速CMOS 静态RAMHY62256 32Kx8 CMOS 静态RAMHM62256 32Kx8 CMOS 静态RAMHM628128 128Kx8 CMOS 静态RAMHM628256 256Kx8 CMOS 静态RAMHM628512 512Kx8 CMOS 静态RAMHM628512 512Kx8 CMOS 静态RAM TCMTCM5087 双音调发生器MM5832 实时钟电路TCTC14433 3位半A/D转换器TC232 并行/串行接口电路TC7106 3位半ADC/LCD驱动TC7107 3位半ADC/LED驱动TC7116 3位半ADC/LCD驱动带保TC7129 4位半ADC/LCDTC7135 4位半ADC/LCD,BCD输出TC7650 整零运放斩波7575107 四差分线驱动器75174 四差分线驱动器75175 三态四差分接收器75176 差分总线接收器75188 四线驱动器75189 四线驱动器75451 双外围驱动器75452 双外围驱动器集成电路英文代码及中文对照〔二〕我的文摘2021-11-21 11:37:11 阅读191 评论0 字号:大中小订阅。
8位数码管计数器
C:\Documents and Settings\Administrator\桌面\new\1.c/* 单片机52系列,功能描述:8位数码管显示0~0-9~9 加1计数,数码管使用共阴极,数码管通过2片74HC573接到P0口,P2^6段选择,P2^7位选择*/#include< reg52.H>#define uchar unsigned char //宏定义uchar 为无符号字符#define N 1 //宏定义N=1,用于动态显示位uchar code duan[]={ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,0x07,0x7f, 0x6f/* 0x77,0x7c,0x39,0x5e,0x79,0x71*/ }; //共阴段码表uchar code wei[]={ 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //8个位的开通表ucharge=0,shi=0,bai=0,qian=0,wan=0,swan=0,bwan=0,qwan=0,num=0; //定义变量及初始化sbit dula= P2^6; //段变量定义sbit wela= P2^7; //位变量定义void delayxms(uchar x); //延时子函数声明void main() //主函数Page: 1C:\Documents and Settings\Administrator\桌面\new\1.c{P0=duan[0]; // 装载初值dula=1;dula=0;P0=wei[0]; // 装载初值wela=1;wela=0;/* 中断设置*/EA=1; //中断总允许ET0=1; //定时器0中断允许TMOD= 0x01; // 定时器器0工作方式1TH0=-10000/256;// 定时10000高8位,可以直接写成TH0=-10000/256TL0=-10000%256;// 定时10000低8位,可以直接写成TL0=-10000%256TR0=1; // 启动定时器0/* 程序跳转去执行定时中断程序,然后返回此处*/ while(1) //大循环{P0=duan[qwan]; //送千万位段码if(qwan==0) // 如果千万位等于0,关闭段选、位选{wela=0;Page: 2C:\Documents and Settings\Administrator\桌面\new\1.c }else{dula=1;dula=0;P0=wei[7];wela=1;wela=0;delayxms(N);}P0=duan[bwan]; //送百万位段码if(qwan==0&&bwan==0){dula=0;wela=0;}else{dula=0;P0=wei[6];wela=1;wela=0;delayxms(N);}Page: 3C:\Documents and Settings\Administrator\桌面\new\1.c P0=duan[swan]; //送十万位段码if(qwan==0&&bwan==0&&swan==0){dula=0;wela=0;}else{dula=1;dula=0;P0=wei[5];wela=1;wela=0;delayxms(N);}P0=duan[wan]; //送万位段码if(qwan==0&&bwan==0&&swan==0&&wan==0){dula=0;wela=0;}else{Page: 4C:\Documents and Settings\Administrator\桌面\new\1.c dula=1;dula=0;P0=wei[4];wela=1;wela=0;delayxms(N);}P0=duan[qian]; // 送千位段码if(qwan==0&&bwan==0&&swan==0&&wan==0&&qian==0) {dula=0;wela=0;}else // 千位不为0,则送段码{dula=1;dula=0;P0=wei[3]; // 选通千位wela=1;wela=0;delayxms(N);}P0=duan[bai]; // 百位if(qwan==0&&bwan==0&&swan==0&&wan==0&&qian==0&&bai== 0)Page: 5C:\Documents and Settings\Administrator\桌面\new\1.c{dula=0;wela=0;}else{dula=1;dula=0;P0=wei[2];wela=1;wela=0;delayxms(N);}P0=duan[shi]; // 十位if(qwan==0&&bwan==0&&swan==0&&wan==0&&qian==0&&bai== 0&&shi==0){dula=0;wela=0;}else{dula=1;dula=0;P0=wei[1];wela=1;Page: 6C:\Documents and Settings\Administrator\桌面\new\1.c wela=0;delayxms(N);}P0=duan[ge]; // 个位dula=1;dula=0;P0=wei[0];wela=1;wela=0;delayxms(N);}}/* 定时中断程序*/void timer0() interrupt 1{TH0=-10000/256; //重载高位初值TL0=-10000%256; //重载低位初值num++; // 计数if(num==20) // 计20次,个位值加1{ge++;if(ge==10) // 个位值满10,进位到十位{Page: 7C:\Documents and Settings\Administrator\桌面\new\1.c shi++;if(shi==10) // 十位值满10,进位到百位{bai++;if(bai==10) //百位值满10,进位到千位{qian++;if(qian==10) /* 千位值满10,进位到万位*/{wan++;if(wan==10)/*往左移动书写位置*/{swan++;if(swan==10){bwan++;if(bwan==10){qwan++;if(qwan==10) /* 千万位值满10,清空各位*/{ qwan=0; }bwan=0;}swan=0;Page: 8C:\Documents and Settings\Administrator\桌面\new\1.c }wan=0;}qian=0;}bai=0;}shi=0;}ge=0;}num=0;} /* 为了不出错,清0 阶段最好由后面一级级往上写*/}void delayxms(uchar x) //延时子函数定义{uchar i,j,k;for(i=x;i>0;i--)for(k=4;k>0;k--)for(j=198;j>0;j--);}Page: 9。
- 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; // 红灯亮}}}。