每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。8 屏显示后,完成“| ”左移。

include unsigned char code tab[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,}; //列选通控制,0有效 unsigned char tab1[4][8]= {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //

1、并不是字真在移动,只是每次显示的图像不一样的,连续显示16次出来就是移动。比如上下移动,有个函数能显示一个字模数组。把“西”的整个字的字模放到这个数组显示的是西字,把“安”放进去就是安字。把西字16行的

显示汉字的话。要想所有汉字都能显示。估计8*8的点阵你要用四个。这样才能显示的更加完美一点。至于左右上下滚动这都不难。建议你先将一个点阵学好。看你后面的补充感觉又像是用的128*64的中文液晶,不知道你究竟要用什么

液晶显示屏是不停闪烁的,而且一次只能显示一个图案。显示屏上显示12345也是每次在一个位置上显示一个数字,不停的显示五次,由于计算速度快,及人眼暂留现象,使人感觉上显示的是12345。现在,你如果需要动画效果,需要从底层做起

单片机51,LED点阵如何使点阵上显示的字会左右移动,或上下移动?

;其实很简单,都不用判断键值,有键按下暂停2S程序如下:ORG 0000H LJMP STA ORG 000BH LJMP T0ISR ORG 0030H STA:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB ET0 SETB EA MOV 30,#0FEH MOV R2,#

rt++) ;}void InitialCPU(void){ P0=0xFF; P1=0x0F; P2=0xFF; P3=0xFF;}unsigned char leddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //"0-9"unsigned char ledbai(unsigned

步骤如下:1、将4x4矩阵键盘连接到单片机上,并将数码管连接到单片机上。2、编写程序以实现键盘扫描和数码管显示。3、使用行扫描法识别键盘输入。将行线设置为高电平,然后逐行扫描列线。4、使用两位数码管显示0-16的数值。

NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2 MOV KEYBUF,#1 ;否者判断为1号键 AJMP DK ;转DK2查表程序NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3 MOV KEYBUF,#2 ;否者判断为2号键 AJ

uchar kbscan(void){unsigned char sccode,recode;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f) //有键按下{delay(20); //延时去抖动if ((P3&0x0f)!= 0x0f){sccode = 0xef;

PANDUAN: MOV P1,#0FFH CLR P1.4 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ SW1 LCALL DELAY10MS JZ SW1//确认有键按下,但不知道哪个,此时可以之间让蜂鸣器叫 MOV P3.0,#1//蜂鸣器发声(赋1还是赋0取决你用

a4=b%10;/*取b的个位*/ if(k==0){shu4=1;shu1=0;shu2=0;shu3=0;P0=yima[a1];} else if(k==1){shu4=0;shu1=1;shu2=0;shu3=0;P0=yima[a4];} else if(k==2){shu4=0;shu1=0;shu2=1;

急求一个由89C51单片机的代码!要求用4*4矩阵键盘控制LED矩阵输出0~9的数字!

中只有八分之一的时间在真亮,可因人眼的延时我们看到是在全亮的,可亮度也当然有所下降.如只显固定少数的几个字符号就只做一个相应的码表,查表可是51机的强项了如要想随意都显可就要做字库,这在编程时也要先想好,

用51单片机8×8点阵显示字母,是要用proteus仿真吧,先画出仿真图,再用取模软件画出字母X Q J,然后按行取模,每一个字母的字模是8个字节。显示时,依次取出每行的字模,按行扫描显示即可。下图是一个仿真图。

LED点阵的核心原理跟4位LED数码管一样,都是需要行列扫描的。仔细查一下点阵的管脚,不是顺序排列,把字体做成数组,直接把数组一个一个字节的发送到端口上(你没有说明P0和P2那个是行,那个是列,其中一个直接发,一个

如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是

做51单片机点阵LED滚动屏,如8×8的,我要显示一个L,那是不是要把L在滚动过程中的每个状态做出数据表

这个就是在你的数码管显示语句中,任意加入一个即可 像你说的在小时和分钟之间加一个小数点,那么就加一个小时个位数显示的语句 只是这个增加的语句不是显示数字,是单独显示那个小点而已 循环中,不断的依次点亮四个数字和

一、求51单片机电子时钟设计。用6个数码管显示出时分秒。;=== ;程序完成一个电子钟的设计    ;=== ;定义程序入口地址  ORG ORG000BH AJMPT0INT  ;=== ;定义内部REQU30H SECEQU40H

用89C51设计LED电子钟6个数码管显示时分秒,要求通过键盘输入初值,打上开关K1时允许设定时间,按下开关K1时开始运行显示时间,K2用做选择是24小时制还是12小时制答得正确又快的可以获 用89C51设计LED电子钟 6个数码管显示时分秒,要求

设计一个数字电子钟,要求可以进行时、分、秒显示,最大显示时间为23:59:59,并且可以通过按键进行时、分调整。画出硬件连接电路图,说明各个控制信号的作用。᠑  设计一个数字电子钟,要求可以进行时、分、秒显示,最大

1、硬件连接:需要将88点阵LED与51单片机连接起来。将点阵的每个引脚与单片机的I/O口连接。具体的连接方式会因硬件设计和使用的点阵型号而有所不同。2、点阵字符库:为了显示数字0到9,需要一个点阵字符库,库需要包含0到9

数字时钟 这段程序是在PRTUES上完全好使 你可以根据 程序自己在PROTUES上画图 include define uint unsigned int char code tab[]=;char code table[]=;sbit duan=P2^5;sbit wei=P2^6;sbit button1=P1^0

51单片机多功能LED点阵显示数字时钟

一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-

首先你要搞清楚点阵显示原理。8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。

中只有八分之一的时间在真亮,可因人眼的延时我们看到是在全亮的,可亮度也当然有所下降.如只显固定少数的几个字符号就只做一个相应的码表,查表可是51机的强项了如要想随意都显可就要做字库,这在编程时也要先想好,

用51单片机8×8点阵显示字母,是要用proteus仿真吧,先画出仿真图,再用取模软件画出字母X Q J,然后按行取模,每一个字母的字模是8个字节。显示时,依次取出每行的字模,按行扫描显示即可。下图是一个仿真图。

LED点阵的核心原理跟4位LED数码管一样,都是需要行列扫描的。仔细查一下点阵的管脚,不是顺序排列,把字体做成数组,直接把数组一个一个字节的发送到端口上(你没有说明P0和P2那个是行,那个是列,其中一个直接发,一个

如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是

做51单片机点阵LED滚动屏,如8×8的,我要显示一个L,那是不是要把L在滚动过程中的每个状态做出数据表

不用的,你可以让它的位置相对移动就行了。没必要把所有状态都做出来。那样太浪费存储空间了。只需要用代码来控制实现就行了。
写了没用啊,因为你的点阵屏要你自己用万用表去检测,然后看你点阵怎么和单片机相连(不是用到PB和PD口,而是要具体的电路),所以程序的灵活性很大,学习的话可以给你发一份也是用8X8点阵显示的表情,但用的是51
KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 39HCLK EQU 77HSEC EQU 78HMIN EQU 79HHOUR EQU 7AHPAUSE BIT 00HDOT BIT 01HORG 0000HLJMP MAINORG 000BHLJMP T0ISR ;50ms定时ORG 001BHLJMP T1ISR ;扫描显示ORG 0030HMAIN: MOV SP,#5FH MOV TMOD,#11H MOV TH0,#03CH MOV TL0,#0B0H MOV TH1,#0ECH MOV TL1,#078H MOV KEYVAL,#0 MOV SCANLED,#0 MOV 33H,#10H MOV 34H,#10H MOV 35H,#10H MOV 36H,#10H MOV 37H,#10H MOV 38H,#10H MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0 MOV CLK,#0 CLR PAUSE SETB EA SETB ET1 SETB TR1LOOP: LCALL KEYSEL MOV A,KEYVAL CJNE A,#0FFH,LOOP1 SJMP LOOPLOOP1: CJNE A,#10,LOOP2 ;“ON”启动 SETB TR0 SETB ET0 SETB PAUSE SJMP LOOPLOOP2: CJNE A,#11,LOOP3 ;“=”清零 MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0 LCALL DISCHG SJMP LOOPLOOP3: CJNE A,#15,LOOP4 ;“+”暂停 CLR TR0 CLR ET0 CLR PAUSE SJMP LOOPLOOP4: CJNE A,#14,LOOP5 ;“-”清显示暂停 MOV 33H,#10H MOV 34H,#10H MOV 35H,#10H MOV 36H,#10H MOV 37H,#10H MOV 38H,#10H CLR TR0 CLR ET0 CLR PAUSE SJMP LOOPLOOP5: CJNE A,#10,LOOP6 ;数字键LOOP6: JC LOOP7 LJMP LOOPLOOP7: JNB PAUSE,LOOP8 ;暂停状态可以输入数字键 LJMP LOOPLOOP8: MOV 33H,34H MOV 34H,35H MOV 35H,36H MOV 36H,37H MOV 37H,38H MOV 38H,KEYVAL MOV A,33H SWAP A ORL A,34H LCALL BCDH MOV HOUR,A MOV A,35H SWAP A ORL A,36H LCALL BCDH MOV MIN,A MOV A,37H SWAP A ORL A,38H LCALL BCDH MOV SEC,A LJMP LOOP;------------------;BCD转换为十六进制BCDH: MOV B,#10H DIV AB MOV R7,B MOV B,#10 MUL AB ADD A,R7 RET ;------------------;十六进制转换为BCDHBCD: MOV B,#10 DIV AB SWAP A ORL A,B RET ;------------------KEYSEL: MOV KEYVAL,#0 MOV KEYSCAN,#0EFH LCALL GETKEY MOV A,KEYTM JZ KEYS1 MOV KEYVAL,A SJMP KEYRTNKEYS1: MOV KEYSCAN,#0DFH LCALL GETKEY MOV A,KEYTM JZ KEYS2 CLR C ADD A,#4 MOV KEYVAL,A SJMP KEYRTNKEYS2: MOV KEYSCAN,#0BFH LCALL GETKEY MOV A,KEYTM JZ KEYS3 CLR C ADD A,#8 MOV KEYVAL,A SJMP KEYRTNKEYS3: MOV KEYSCAN,#7FH LCALL GETKEY MOV A,KEYTM JZ KEYRTN CLR C ADD A,#12 MOV KEYVAL,AKEYRTN: LCALL CHGKEY RET;--------------------GETKEY: MOV KEYTM,#0 MOV A,KEYSCAN MOV P3,A NOP MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY MOV R2,#10 LCALL DELAY MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY MOV A,P3 ANL A,#0FH MOV R7,ASF: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ SF MOV A,R7 CJNE A,#0EH,NK1 MOV KEYTM,#1 SJMP NOKEYNK1: CJNE A,#0DH,NK2 MOV KEYTM,#2 SJMP NOKEYNK2: CJNE A,#0BH,NK3 MOV KEYTM,#3 SJMP NOKEYNK3: CJNE A,#07H,NOKEY MOV KEYTM,#4NOKEY: RET;--------------------DELAY: MOV R3,#50DELAY1: MOV R4,#100 DJNZ R4,$ DJNZ R3,DELAY1 DJNZ R2,DELAY RET;--------------------T0ISR: PUSH ACC CLR TR0 MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 INC CLK MOV A,CLK CJNE A,#20,T0ISRE MOV CLK,#0 INC SEC MOV A,SEC CJNE A,#60,T0ISRE MOV SEC,#0 INC MIN MOV A,MIN CJNE A,#60,T0ISRE MOV MIN,#0 INC HOUR MOV A,HOUR CJNE A,#24,T0ISRE MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0T0ISRE: LCALL DISCHG POP ACC RETI;--------------------DISCHG: MOV A,HOUR LCALL HBCD PUSH ACC ANL A,#0FH MOV 34H,A POP ACC ANL A,#0F0H SWAP A MOV 33H,A MOV A,MIN LCALL HBCD PUSH ACC ANL A,#0FH MOV 36H,A POP ACC ANL A,#0F0H SWAP A MOV 35H,A MOV A,SEC LCALL HBCD PUSH ACC ANL A,#0FH MOV 38H,A POP ACC ANL A,#0F0H SWAP A MOV 37H,A RET;--------------------T1ISR: PUSH ACC CLR TR1 MOV TH1,#0ECH MOV TL1,#78H SETB TR1 MOV DPTR,#LEDTABT100: MOV R0,#DAT MOV A,SCANLED ADD A,R0 MOV R0,A MOV A,SCANLED JNZ T101 MOV P2,#01H CLR DOT SJMP T1DIST101: DEC A JNZ T102 MOV P2,#02H SETB DOT SJMP T1DIST102: DEC A JNZ T103 MOV P2,#04H CLR DOT SJMP T1DIST103: DEC A JNZ T104 MOV P2,#08H SETB DOT SJMP T1DIST104: DEC A JNZ T105 MOV P2,#10H CLR DOT SJMP T1DIST105: MOV P2,#20H CLR DOTT1DIS: MOV A,@R0 MOVC A,@A+DPTR JNB DOT,T1DIS1 ORL A,#01HT1DIS1: CPL A MOV P0,A INC SCANLED MOV A,SCANLED CJNE A,#6,T1END MOV SCANLED,#0T1END: POP ACC RETI;--------------------CHGKEY: MOV A,KEYVAL JZ KV16 DEC A JNZ KV01 MOV KEYVAL,#7 RETKV01: DEC A JNZ KV02 MOV KEYVAL,#4 RETKV02: DEC A JNZ KV03 MOV KEYVAL,#1 RETKV03: DEC A JNZ KV04 MOV KEYVAL,#10 RETKV04: DEC A JNZ KV05 MOV KEYVAL,#8 RETKV05: DEC A JNZ KV06 MOV KEYVAL,#5 RETKV06: DEC A JNZ KV07 MOV KEYVAL,#2 RETKV07: DEC A JNZ KV08 MOV KEYVAL,#0 RETKV08: DEC A JNZ KV09 MOV KEYVAL,#9 RETKV09: DEC A JNZ KV10 MOV KEYVAL,#6 RETKV10: DEC A JNZ KV11 MOV KEYVAL,#3 RETKV11: DEC A JNZ KV12 MOV KEYVAL,#11 RETKV12: DEC A JNZ KV13 MOV KEYVAL,#12 RETKV13: DEC A JNZ KV14 MOV KEYVAL,#13 RETKV14: DEC A JNZ KV15 MOV KEYVAL,#14 RETKV15: DEC A JNZ KV16 MOV KEYVAL,#15 RETKV16: MOV KEYVAL,#0FFH RET;--------------------LEDTAB: DB 0FCH ;"0" 00H DB 60H ;"1" 01H DB 0DAH ;"2" 02H DB 0F2H ;"3" 03H DB 66H ;"4" 04H DB 0B6H ;"5" 05H DB 0BEH ;"6" 06H DB 0E0H ;"7" 07H DB 0FEH ;"8" 08H DB 0F6H ;"9" 09H DB 0EEH ;"A" 0AH DB 3EH ;"B" 0BH DB 9CH ;"C" 0CH DB 7AH ;"D" 0DH DB 9EH ;"E" 0EH DB 8EH ;"F" 0FH DB 00H ;" " 10H;--------------------END
你好!四个数码管,怎么来实现时分秒的显示,至少也要6个数码管吧 程序什么时间要?原理图确定了吗
1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 00h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 0 0 0 0 0 20h 0 0 1 1 1 1 0 0 3ch 0 0 0 0 0 0 0 0 00h 00 00 7e 02 02 02 00 00 你取模是按行取,你可以尝试按列取 取成00h,00h,7eh,02h,02h,02h,00h,00h 当显示一静态"L"时, 假设由左向右扫描输出的话指针顺序是1,2,3,4,5,6,7,8。 如果你要"L"向左移,那下一帧就从2开始2,3,4,5,6,7,8,(程序设定超过8时为00h,简单点就是如果你点阵“屏”是8*8的,那你在后面加补8个00h,16*16就补32个,这样你移动N*8(或N*16)的字幕都是向左“消失”,因为最后那8(或32)个00,刚好能填满你的屏(消失)) 再下一帧就从3开始,如比类推。 当然还可以设成循环模式如 1,2,3,4,5,6,7,8 2,3,4,5,6,7,8,1 3,4,5,6,7,8,1,2 4,5,6,7,8,1,2,3 ...................... 程序我就不给你写了,你自己好好想想咯,外加我是用C的。。汇编不熟。希望能帮到你。
不用的,你可以让它的位置相对移动就行了。没必要把所有状态都做出来。那样太浪费存储空间了。只需要用代码来控制实现就行了。
#define LCD1602_FLAG#define LCD1602_PORT P0#include#include#define uchar unsigned char sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7; uchar str[]="This is Key Test";uchar keyval,keystr[16]; void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);} /************************************** 函数名称:lcd1602_CheckBusy()* 函数功能:状态查询*************************************/ void lcd1602_CheckBusy(){do{lcd1602_busy=1;lcd1602_rs=0;lcd1602_rw=1;lcd1602_e=0;lcd1602_e=1;}while(lcd1602_busy);} /***************************************** 函数名称: lcd1602_WriteCmd()* 函数功能:写命令* 入口参数:命令字* 出口参数:无****************************************/ void lcd1602_WriteCmd(const uchar cmd){lcd1602_CheckBusy();lcd1602_rs=0;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=cmd;lcd1602_e=0;} /********************************************* 函数名称:lcd1602_WriteData()* 函数功能:写数据* 入口参数:c--待写数据* 出口参数:无**********************************************/ void lcd1602_WriteData(const uchar c){lcd1602_CheckBusy();lcd1602_rs=1;lcd1602_rw=0;lcd1602_e=1;LCD1602_PORT=c;lcd1602_e=0;} /************************************************* 函数名称:lcd1602_Init()* 函数功能:初始化LCD* 入口参数:无* 出口参数:无************************************************/ void lcd1602_Init(){lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵lcd1602_WriteCmd(0x0c); //display enable,flag enable,flash enable,lcd1602_WriteCmd(0x06); //flag move to right,screen don't movelcd1602_WriteCmd(0x01); //clear screen} /************************************************** 函数名称:lcd1602_Display()* 函数功能: 字符显示* 入口参数:ptr--字符或字符串指针* 出口参数:无* 说 明:用户可通过以下方式来调用:* 1)lcd1602_Display("Hello,world!");* 2) INT8U 存储类型 txt[]="要显示的字符串";* 或者 INT8U 存储类型 txt[]={'t','x','t',..,'\0'};* INT8U *ptr;* ptr=&txt;* lcd1602_Display(ptr);* 或 lcd1602_Display(txt);* 或 lcd1602_Display(&txt);*************************************************/ void lcd1602_Display(const uchar *ptr,uchar line){uchar data i=0;uchar *data q; q=ptr;switch(line){case 0:lcd1602_WriteCmd(0x80);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;case 1:lcd1602_WriteCmd(0xc0);while(q!=NULL && (*q!='\0') && i<16){lcd1602_WriteData(*q);q++;i++;}break;}} uchar kbscan(void){unsigned char sccode,recode;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f) //有键按下{delay(20); //延时去抖动if ((P3&0x0f)!= 0x0f){sccode = 0xef; //逐行扫描初值while((sccode&0x01)!=0){P3=sccode;if((P3&0x0f)!=0x0f){recode=(P3&0x0f)|0xf0;while((P3&0x0f)!=0x0f);//等待键抬起return((~sccode)+(~recode));}elsesccode=(sccode<<1)|0x01;}}}return 0; //无键按下,返回0}uchar getkey(void){uchar key;key=kbscan();if(key==0){keyval=0xff;return(0);}switch(key){case 0x11:keyval=7;break;case 0x12:keyval=4;break;case 0x14:keyval=1;break;case 0x18:keyval=10;break;case 0x21:keyval=8;break;case 0x22:keyval=5;break;case 0x24:keyval=2;break;case 0x28:keyval=0;break;case 0x41:keyval=9;break;case 0x42:keyval=6;break;case 0x44:keyval=3;break;case 0x48:keyval=11;break;case 0x81:keyval=12;break;case 0x82:keyval=13;break;case 0x84:keyval=14;break;case 0x88:keyval=15;break;default:keyval=0xff;break;}if(keyval!=0xff)return(1);else return(0);} main(){uchar num;lcd1602_Init();lcd1602_Display(str,0);while(1){if(getkey()){keystr[num]=keyval+0x30;lcd1602_Display(keystr,1);num++;num%=16;} }}
用4×4矩阵键盘画计算器仿真图,用LCD1602显示的,proteus中有一个现成的计算器用的4×4键盘,见下图。
void rxd_data(void) //串行发送数据 { char s; uchar inc,tempyid,temp; if(yid<8) inc=1; //左移=0,右移时=1 else inc=0; //左移=1,右移时=0 for(s=0+inc;s<13+inc;s++) //发送8字节数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF[s]>(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。 //Yanglomng 左移右移之分!改> // temp=255-temp; TXD_data(temp); //SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。 //while(!TI);TI=0; //等待发送中断 } }
你这个单片机是带I2C接口的 那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442 你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去 我给你一个模拟的看看 #include<reg51.h> #include <Intrins.h> #define uchar unsigned char #define uint unsigned int sbit pcf8563_scl=P0^5;//时钟频率 sbit pcf8563_sda=P0^4;//串行数据传输脚 bit busy=0; uchar sg;//时高位 uchar sd;//时低位 uchar fg;//分高位 uchar fd;//分低位 uchar mg;//秒高位 uchar md;//秒低位 uchar hou=0; uchar min=0; uchar sec=0; uchar subadd;//地址 uchar dat;//数据 uchar number; void start_pcf8563();//开始数据 void send_pcf8563_byte();//发送 void stop_pcf8563();//结束数据 void receive_pcf8563_byte();//接收 void spit_time();//分别计算时、分、秒的各位数字 void spit_time()//分别计算时、分、秒的各位数字 { sg=(int)hou/10; sd=(int)hou%10; fg=(int)min/10; fd=(int)min%10; mg=(int)sec/10; md=(int)sec%10; } void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节 { uchar aa; pcf8563_scl=0; for(aa=0;aa<8;aa++) { if((bb&0x80)==0x80) { pcf8563_sda=1; } else { pcf8563_sda=0; } pcf8563_scl=1; pcf8563_scl=0; bb=bb<<1; } _nop_(); _nop_(); pcf8563_sda=1; pcf8563_scl=1; busy=0; if(pcf8563_sda) { busy=1; } else { _nop_(); _nop_(); pcf8563_scl=0; busy=0; } } void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(!busy) { Send_pcf8563_byte(subadd); if(!busy) { Send_pcf8563_byte(dat); } } stop_pcf8563(); } void read_pcf8563() //读当时的时,分,钞 { start_pcf8563(); Send_pcf8563_byte(0xa2); if(!busy) { Send_pcf8563_byte(0x02); if(!busy) { start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); sec=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); min=number&0x7f; start_pcf8563(); Send_pcf8563_byte(0xa3); receive_pcf8563_byte(); hou=number&0x3f; } } stop_pcf8563(); } void receive_pcf8563_byte() //从PCF8563接受一个字节 {uchar cc; pcf8563_sda=1; number=0; for(cc=0;cc<8;cc++) { number<<=1; pcf8563_scl=0; pcf8563_scl=1; _nop_(); _nop_(); number= number|pcf8563_sda; } pcf8563_scl=0; _nop_(); _nop_(); } void start_pcf8563() //开启PCF8563IIC { pcf8563_sda=1; pcf8563_scl=1; pcf8563_sda=0;//SCL为高,SDA执行一个下跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } void stop_pcf8563() //关闭PCF8563IIC { pcf8563_sda=0; pcf8563_scl=1; pcf8563_sda=1;//SCL为高,SDA执行一个上跳 pcf8563_scl=0;//SCL为低,嵌住数据线 } void main(void) { write_pcf8563(0x02,sec); //写钞 write_pcf8563(0x03,min); //写分 write_pcf8563(0x04,hou); //写时 while(1) { read_pcf8563();//读当前时间 spit_time(); //切换时间,为显示做准备 } } 如果还是不行,你把你的代码给我看看,看我能不能看出来