74hc164驱动控制8个数码管程序
74HC164设备概述
8 位串入、并出移位寄存器
74HC16474HC164、74HCT164 是高速硅门 CMOS 器件,与低功耗肖特基型 TTL (LSTTL) 器件的引脚兼容。74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA 和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
数码管
数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色。
数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
八只74HC164控制八只数码管程序
ORG0000H
JMPMAIN
ORG0013H
AJMPBreak_2
MAIN: ;主程序
MOVSP,#60H;设定堆栈指针
MOVTCON,04H
MOVIE,84H
MOVSCON,#00H;设定串口为0方式,同步移位寄存器,波特率Fosc/12,0:单机对单机,接收控制禁止
START:;
JNBP3.2,DISPLAY_09
CALLDISPLAY_0;调用显示子程序
CALLDELAY;调用延时子程序
DISPLAY_0:;显示子程序
MOVR7,#2
MOVR6,#2
MOVR5,#2
L0:
MOVA,#0;先发送十位数的LED数码管段选码
MOVDPTR,#TABLE;十位数的LED数码管段选码表地址送数据寄存器指针DPTR
MOVCA,@A+DPTR;选择十位数计数器COUNT2,第二个LED数码管段选码送A
MOVSBUF,A;发送选择十位数计数器COUNT2,第二个LED数码管段选码
L0_1:
JBCTI,L0_2;发送控制位TI=1,发送完毕跳转到DATA1,并将TI清0
JMPL0_1;发送控制位TI=0,未发送完毕跳转到LOOPD0,继续检测TI位
L0_2:
DJNZR7,L0
MOVR7,#2
MOVA,#0;先发送十位数的LED数码管段选码
MOVDPTR,#TABLE_1;十位数的LED数码管段选码表地址送数据寄存器指针DPTR
MOVCA,@A+DPTR;选择十位数计数器COUNT2,第二个LED数码管段选码送A
MOVSBUF,A;发送选择十位数计数器COUNT2,第二个LED数码管段选码
L0_3:
JBCTI,L0_4;发送控制位TI=1,发送完毕跳转到DATA1,并将TI清0
JMPL0_3;发送控制位TI=0,未发送完毕跳转到LOOPD0,继续检测TI位
L0_4:DJNZR6,L0
L0_5:
MOVA,#0;先发送十位数的LED数码管段选码
MOVDPTR,#TABLE;十位数的LED数码管段选码表地址送数据寄存器指针DPTR
MOVCA,@A+DPTR;选择十位数计数器COUNT2,第二个LED数码管段选码送A
MOVSBUF,A;发送选择十位数计数器COUNT2,第二个LED数码管段选码
L0_6:
JBCTI,L0_7;发送控制位TI=1,发送完毕跳转到DATA1,并将TI清0
JMPL0_6;发送控制位TI=0,未发送完毕跳转到LOOPD0,继续检测TI位
L0_7:
DJNZR5,L0_5
RET
DISPLAY_09:
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVCOUNT2,#0;十位数计数器COUNT2置2
MOVCOUNT3,#0;百位数计数器COUNT3置8
MOVCOUNT4,#0;百位数计数器COUNT3置8
MOVCOUNT5,#0;百位数计数器COUNT3置8
MOVCOUNT6,#0;百位数计数器COUNT3置8
MOVCOUNT7,#0;百位数计数器COUNT3置8
MOVCOUNT8,#0;百位数计数器COUNT3置8
START_09:
CALLDISPLAY;调用显示子程序
CALLDELAY;调用延时子程序
W1:
INCCOUNT1;个位数计数器COUNT1加1
MOVA,COUNT1
CJNEA,#10,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始显示处START
W10:
INCCOUNT2;十位数计数器COUNT2加1
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT2;
CJNEA,#6,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W100:
INCCOUNT3;百位数计数器COUNT3加1
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT3;
CJNEA,#1,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W1000:
INCCOUNT4;千位数计数器COUNT4加1
MOVCOUNT3,#0;百位数计数器COUNT3置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT4;
CJNEA,#10,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W10000:
INCCOUNT5;万位数计数器COUNT5加1
MOVCOUNT4,#0;千位数计数器COUNT4置0
MOVCOUNT3,#0;百位数计数器COUNT3置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT5;
CJNEA,#6,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W100000:
INCCOUNT6;十万位数计数器COUNT6加1
MOVCOUNT5,#0;千位数计数器COUNT5置0
MOVCOUNT4,#0;千位数计数器COUNT4置0
MOVCOUNT3,#0;百位数计数器COUNT3置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT6;
CJNEA,#1,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W1000000:
INCCOUNT7;百万位数计数器COUNT7加1
MOVCOUNT6,#0;千位数计数器COUNT6置0
MOVCOUNT4,#0;千位数计数器COUNT4置0
MOVCOUNT3,#0;百位数计数器COUNT3置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT7;
CJNEA,#10,START_09;检测个位数是否变化10次,如果不够10次,跳转到程序开始处
W10000000:
INCCOUNT8;万万位数计数器COUNT7加1
MOVCOUNT7,#0;万位数计数器COUNT7加1
MOVCOUNT6,#0;千位数计数器COUNT6置0
MOVCOUNT4,#0;千位数计数器COUNT4置0
MOVCOUNT3,#0;百位数计数器COUNT3置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVA,COUNT8;
CJNEA,#10,L1;检测个位数是否变化10次,如果不够10次,跳转到程序开始处AJMPW0
L1:AJMPSTART
W0:
MOVCOUNT1,#0;个位数计数器COUNT1置0
MOVCOUNT2,#0;十位数计数器COUNT2置0
MOVCOUNT3,#0;百位数计数器COUNT3置0