74ls164动态驱动多位数码管.docx
- 文档编号:27778073
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:16
- 大小:427.50KB
74ls164动态驱动多位数码管.docx
《74ls164动态驱动多位数码管.docx》由会员分享,可在线阅读,更多相关《74ls164动态驱动多位数码管.docx(16页珍藏版)》请在冰豆网上搜索。
74ls164动态驱动多位数码管
74ls164能否动态驱动多位数码管voiddisplay()//数码显示{
SCON=0;//初始化串行口方式
SBUF=dispcode[ge];
while(!
TI);
TI=0;
led4=0;
delay
(2);
led4=1;
SBUF=dispcode[shi];
while(!
TI);
TI=0;
led3=0;
delay
(2);
led3=1;
SBUF=dispcode[bai];
while(!
TI);
TI=0;
led2=0;
delay
(2);
led2=1;
SBUF二dispcode[qian];
while(!
TI);
TI=O;
led仁0;
delay
(2);
led1=1;
SBUF=dispcode[wan];
while(!
TI);
TI=0;
led0=0;
delay
(2);
led0=1;
}
74ls164数码管驱动(第二个程序)
#defineclockPORTD.1
#definedatePORTD.0
#defineclock_enDDRD.1
#definedate_enDDRD.0
unsignedcharlab[2][10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x02,0x9E,0x24,0x0C,0x98,0x48,0x40,0x1E,0x00,0x08};
voidsend(unsignedcharw)
{
unsignedchari;
for(i=0;i<8;i++)
{
clock=0;
date=w&1;
clock=1;
w=w>>1;
}
return;
}
voidxianshi(longw,unsignedcharweishu)
{
unsignedchari,j;
bitflag=0;
clock_en=1;
date_en=1;
if(w<0){flag=1;w=-w;}
for(i=0;i<8;i++)//8次循环
{
if(w!
=0)
{
if(i!
=weishu){j=lab[0][w%10];}
else{j=lab[1][w%10];}
}
if(w==0)
{if(i==0)j=0x03;//当数值直接是0
if(i<=weishu)
{
if(i } else { if(flag)j=0xdf;//show负号else{if(i! =0)j=0xff;}//oxff就不显示flag=0; } } send(j); w=w/10;//每显示一位,除10 } return; } 51单片机接74ls164驱动数码管的C程序 #include sbitsclk=P2A0; sbitsda=P2A1; sbitslck=P2A2; inttab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voiddelay() { inti,j; for(i=0;i<255;i++) for(j=0;j<80;j++); } voidbit_dat(biti) {sclk=0; sda=i; sclk=1; } voiddat(chari) { slck=0; bit_dat((bit)(tab[i]&0x80)); bit_dat((bit)(tab[i]&0x40)); bit_dat((bit)(tab[i]&0x20)); bit_dat((bit)(tab[i]&0x10)); bit_dat((bit)(tab[i]&0x08)); bit_dat((bit)(tab[i]&0x04)); bit_dat((bit)(tab[i]&0x02)); bit_dat((bit)(tab[i]&0x01)); slck=1; } main() {inti; while (1) { for(i=0;i<10;i++) {dat(i); delay(); } i=0; } P0O/^DO F■匚丄卩ry PL.MU2 IAAALM PC5心 PC.6/AD6 PC7/AD7 程序如下: /**************************************/ /*74LS164数码管动态显示*/ 库函数声明,管脚定义 /**************************************/ //■ #inelude sbita0=ACCA0; unsignedcharcodedis_code[11]={0x28,0x7E,0xa2,0x62,//查表显示0,1、、90x74,0x61,0x21,0x7A,0x20,0x60,0x01}; ucharnumer,temp; ucharge,shi; // //• voidout_simuseri(uchardata_buf){ uchari; i=8; ACC=data_buf; do { simuseri_CLK=0; simuseri_DATA=a0; simuseri_CLK=1; ACC=ACC>>1; } while(--i! =0); } /************************************/ voiddelay(ucharms)//延时程序 { uchari; while(ms--) { for(i=0;i<125;i++); }} /***********************************/ voidmain() { ucharm; while (1) { for(temp=0;temp<99;temp++) { ge=temp/10; shi=temp%10; for(m=0;m<20;m++)//显示频率200ms加1次{ P2_0=0;//位段码numer=dis_code[ge];out_simuseri(numer);//个位移位显示delay(5); P2_0=1; P2_1=0; numer=dis_code[shi];//十位移位out_simuseri(numer); delay(5); P2_1=1; }m=0; } } } /****************************************/ ******************************************************************************* 第二个程序 74HC164是个移位寄存器,以下程序是我用过的,绝对没问题: 其中ShowData为164数据脚,ShowClck为164时钟脚; voidShow_164(unsignedchar_ShowValue){ unsignedcharCountO; for(Count0=0;Count0<=7;CountO++){ if((_ShowValue&0x80)==0x80)ShowData=1; else ShowData=0; _ShowValue<<=1; ShowClck=0; _nop_(); _nop_(); ShowClck=1; } ABCDEFGDP12 R3 10k. R4. 10k• R2 ・1K・・ R1 花・・ Q2・ PN4250 : loaHinjK—一 a^iCd rkix— ••二•川. O LD££dOUTCdUNKc£dOlNI^ed■SujrtdaxdA)£d 51WZtd0呦CdeiwsidiwmnwecdOlMfZZdevrrsdB^rDCd zavjrod96阳Odsavjsod CGVXOdcCNJZOd ICNH'OdOiJVJOOd : 昭娱邈 £畫竦纟越 基于51单片机的简易数字频率计 要求使用定时/计数器1作定时用,定时1s;定时/计数器0作计数器用,被计数的外部脉冲从P3.4(T0)接入。 单片机将在1s内对脉冲计数并送四位数码管显示,最大计数显示值为0FFFFH求程序。 悬赏分: 30-解决时间: 2010-6-2722: 26 最佳答案: 这是个简易频率计,程序如下 ORG0000H JMPSTART ORG000BH JMPT0_INT START: MOVTMOD,#51H;/*01010001T1计数,T0定时*/ MOVTH0,#HIGH(65536-50000);50ms@12MHz MOVTL0,#LOW(65536-50000) MOVTH1,#0 MOVTL1,#0 SETBTR0 SETBTR1 SETBET0 SETBEA MOVR7,#20 SJMP$ T0_INT: ;50ms执行一次 MOVTL0,#LOW(65536-50000);重新写入初始值 MOVTH0,#HIGH(65536-50000);50ms@12MHz DJNZR7,T0_END MOVR7,#20 MOVP1,TL1 MOVP2,TH1 MOVTL1,#0 MOVTH1,#0 T0_END: RETI END 外接74系列驱动电路就行,比如74LS164或74LS138。 动态扫描就是给各个数码管依次显示,任意时间只有一个数码管亮,但闪烁的太快了,人眼分 辨不出,给人的感觉就是每个数码管都在亮。 一般过程就是赋值,开显示,延时,关显示,这是我以前写过的程序 #include main() {unsignedinti; while (1) {P0=0x3f;〃个位赋值 P1_0=0;〃开显示 for(i=0;i<2;i++);〃延时 P1_0=1;〃关显示 P0=0x6;〃十位 P1_l=0; for(i=0;i<2;i++); P1_1=1; P0=0x5b;〃百位 P1_2=0; for(i=0;i<2;i++); P1_2=1; P0=0x4f;〃千位 P1_3=0; for(i=0;i<2;i++); P1_3=1;} } 这个是4位数码管,P0口接赋值端,P1口低四位接4个数码管的选通端,你要八个的话就把P1口的高四位再接到另外四个数码管的片选端,程序仿照就可以了 以下是共阳数码管简单程序; p0口接abcdefg,P2口接s0,s1,s2s7; 软件靠自己啦 如: main: movr1,#8; movr0,#00h; movr2,#0feh; loop: movp0,r0;送显示数据 incr0; movp2,r2;选通要显示的数码管 lcalldelay; mova,r2; rla; movr2,a; djnzr1,loop; ajmpmain; delay: movr7,#245;延时大约1msdjnzr7,$; ret
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 74 ls164 动态 驱动 数码管