找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6792|回复: 13
打印 上一主题 下一主题
收起左侧

用pcf8563做时钟有代码protues仿真 亲测可以用

  [复制链接]
跳转到指定楼层
楼主
亲测可以用,Proteus7.8打开



51单片机源程序:
  1. //---库函数声明及相关定义---//
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit SDA=P3^1; //数据
  7. sbit SCL=P3^0; //时钟

  8. #define     LCDIO      P1  //1602数据口
  9. sbit rs=P2^0;  //1602数据命令选择引脚
  10. sbit rd=P2^1;        //读写选择抖?
  11. sbit lcden=P2^2;        //1602选通引脚

  12. uchar code table[]={" 2010-11-29 MON"};
  13. uchar code table1[]={" 15:45:00       "};
  14. uchar code table2[]= "SUNMONTUEWESTHUFRISAT";

  15. uchar g8563_Store[8]; /*时间交换区,全局变量声明*/
  16. uchar code c8563_Store[8]={0x50,0x59,0x23,0x31,0x05,0x07,0x88,0x20}; /*写入时间初值:世纪,08年 7月 星期一 13日 07:59:00*/

  17. sbit menu=P0^0;//菜单
  18. sbit add=P0^1;//加一
  19. sbit dec=P0^2;//减一

  20. uchar second,minute,hour,day,month,year,week,count=0;  


  21. void delay1602(uint z)
  22. {
  23.         uint x,y;
  24.         for(x=z;x>0;x--)
  25.         for(y=110;y>0;y--);
  26. }
  27. void write_com(uchar com)//1602写命令子程序
  28. {
  29.         rs=0;//RS是数据命令选择短,高电平写数据,低电平写命令
  30.         rd=0;//RD是读写选择短,高电平读,低电平写
  31.         lcden=0;//1602选通端,高电平选通,低电平禁止
  32.         P1=com;
  33.         delay1602(5);
  34.         lcden=1;
  35.         delay1602(5);
  36.         lcden=0;        
  37. }

  38. void write_date(uchar date)//1602写数据子程序
  39. {
  40.         rs=1;        //RS是数据命令选择短,高电平写数据,低电平写命令
  41.         rd=0;        //RD是读写选择短,高电平读,低电平写
  42.         lcden=0;        //1602选通端,高电平选通,低电平禁止
  43.         P1=date;
  44.         delay1602(5);
  45.         lcden=1;
  46.         delay1602(5);
  47.         lcden=0;        
  48. }

  49. void init()
  50. {
  51.         uchar num;
  52.         lcden=0;
  53.         write_com(0x38);        //0011 1000B,功能模式设置,设置为8为数据口,两行显示,5*7点阵
  54.         write_com(0x0c);        //0000 1011B,显示开及光标设置,关显示,显示光标,光标闪烁
  55.         write_com(0x06);        //0000 0110B,显示光标移动设置,读或写一个字符,地址指针减一且光标减一,写一个字符屏幕显示不移动
  56.         write_com(0x01);        //0000 0001B,显示清屏,数据指针和所有显示清屏
  57.         write_com(0x80);        //1000 000B,关闭显示
  58.         delay1602(5);
  59.         write_com(0x80);        //1000 000B,设置为2行显示,写入第一行字符的地址,第一行地址是00-2F
  60.         for(num=0;num<15;num++)
  61.         {
  62.                 write_date(table[num]);        //写入第一行数据
  63.                 delay1602(5);
  64.         }
  65.         write_com(0x80+0x40);        //1100 0000B,设置为2行显示,写入第二行字符的地址,第而行地址是40-67
  66.         for(num=0;num<15;num++)        //写入第二行数据
  67.         {
  68.                 write_date(table1[num]);//写入第二行数据
  69.                 delay1602(5);
  70.         }
  71. }



  72. /********************************************
  73. 内部函数,延时1
  74. ********************************************/
  75. void Delay()
  76. {
  77.    // {P10=1;_nop_();P10=0;}
  78.     _nop_();
  79.    _nop_(); /*根据晶振频率制定延时时间*/
  80. }
  81. /********************************************
  82. 内部函数,I2C开始
  83. ********************************************/
  84. void Start()
  85. {  EA=0;
  86.    SDA=1;
  87.    SCL=1;
  88.    Delay();
  89.    SDA=0;
  90.    Delay();
  91.    SCL=0;
  92. }
  93. /********************************************
  94. 内部函数,I2C结束
  95. ********************************************/
  96. void Stop()
  97. {
  98.    SDA=0;
  99.    SCL=0;
  100.    Delay();
  101.    SCL=1;
  102.    Delay();
  103.    SDA=1;
  104.    Delay();
  105.    EA=1;
  106. }
  107. /********************************************
  108. 内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1;
  109. ********************************************/
  110. void WriteACK(uchar ack)
  111. {
  112.    SDA=ack;
  113.    Delay();
  114.    SCL=1;
  115.    Delay();
  116.    SCL=0;
  117. }
  118. /********************************************
  119. 内部函数,等待ACK
  120. ********************************************/
  121. void WaitACK()
  122. {  uchar errtime=20;
  123.    SDA=1;
  124.    Delay(); /*读ACK*/
  125.    SCL=1;
  126.    Delay();
  127.    while(SDA)
  128.    {  errtime--;
  129.       if(!errtime) Stop();
  130.    }
  131.    SCL=0;
  132.    Delay();
  133. }
  134. /********************************************
  135. 内部函数.输出数据字节
  136. 入口:B=数据
  137. ********************************************/
  138. void writebyte(uchar wdata)
  139. {
  140.    uchar i;
  141.    for(i=0;i<8;i++)
  142.    {
  143.        if(wdata&0x80) SDA=1;
  144.        else SDA=0;
  145.        wdata<<=1;
  146.        SCL=1;
  147.        Delay();
  148.        SCL=0;
  149.    }
  150.    WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
  151. }
  152. /********************************************
  153. 内部函数.输入数据
  154. 出口:B
  155. ********************************************/
  156. uchar Readbyte()
  157. {
  158.    uchar i,bytedata;
  159.    SDA=1;
  160.    for(i=0;i<8;i++)
  161.    {
  162.       SCL=1;
  163.       bytedata<<=1;
  164.       bytedata|=SDA;
  165.       SCL=0;
  166.       Delay();
  167.    }
  168.    return(bytedata);
  169. }
  170. /********************************************
  171. 输出数据->pcf8563
  172. ********************************************/
  173. void writeData(uchar address,uchar mdata)
  174. {
  175.    Start();
  176.    writebyte(0xa2); /*写命令*/
  177.    writebyte(address); /*写地址*/
  178.    writebyte(mdata); /*写数据*/
  179.    Stop();
  180. }
  181. /********************************************
  182. 输入数据<-pcf8563
  183. ********************************************/
  184. uchar ReadData(uchar address) /*单字节*/
  185. {  uchar rdata;
  186.    Start();
  187.    writebyte(0xa2); /*写命令*/
  188.    writebyte(address); /*写地址*/
  189.    Start();
  190.    writebyte(0xa3); /*读命令*/
  191.    rdata=Readbyte();
  192.    WriteACK(1);
  193.    Stop();
  194.    return(rdata);
  195. }
  196. void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
  197. {  uchar i;
  198.    Start();
  199.    writebyte(0xa2); /*写命令*/
  200.    writebyte(address); /*写地址*/
  201.    Start();
  202.    writebyte(0xa3); /*读命令*/
  203.    for(i=0;i<count;i++)
  204.    {
  205.         buff[i]=Readbyte();
  206.         if(i<count-1) WriteACK(0);
  207.    }
  208.   WriteACK(1);
  209.    Stop();
  210. }
  211. /********************************************
  212. 内部函数,读入时间到内部缓冲区
  213. ********************************************/
  214. void P8563_Read()
  215. {   uchar time[7],century;
  216.         ReadData1(0x02,0x07,time);
  217.         century=time[5];
  218.         g8563_Store[0]=time[0]&0x7f; /*秒*/
  219.         g8563_Store[1]=time[1]&0x7f; /*分*/
  220.         g8563_Store[2]=time[2]&0x3f; /*小时*/
  221.         g8563_Store[3]=time[3]&0x3f; /*日*/
  222.         g8563_Store[4]=time[4]&0x07; /*星期*/
  223.         g8563_Store[5]=time[5]&0x1f; /*月*/
  224.         g8563_Store[6]=time[6]&0xff; /*年*/
  225.         g8563_Store[7]=century&0x80; /*去世纪,00为2000,80为1900*/
  226.         if(g8563_Store[7]==0x00)g8563_Store[7]=20;
  227.         if(g8563_Store[7]==0x80)g8563_Store[7]=19;
  228. }
  229. /********************************************
  230. 读入时间到内部缓冲区----外部调用
  231. ********************************************/
  232. void P8563_gettime()
  233. {
  234.     P8563_Read();
  235.     if(g8563_Store[0]==0)
  236.       P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
  237. }
  238. /********************************************
  239. 写时间修改值
  240. ********************************************/
  241. void P8563_settime()
  242. {

  243.         
  244.         writeData(2,g8563_Store[0]);//秒
  245.         writeData(3,g8563_Store[1]);//分
  246.         writeData(4,g8563_Store[2]);//时
  247.         writeData(5,g8563_Store[3]);//日
  248.         writeData(6,g8563_Store[4]);//星期
  249.         if(g8563_Store[7]==0x20)g8563_Store[5]=(g8563_Store[5]&0x3F);//判断世纪
  250.         if(g8563_Store[7]==0x19)g8563_Store[5]=(g8563_Store[5]|0x80);//判断世纪
  251.         writeData(7,g8563_Store[5]);//月
  252.         writeData(8,g8563_Store[6]);//年


  253. }
  254. /********************************************
  255. P8563的初始化
  256. ********************************************/
  257. void P8563_init()
  258. {
  259.     uchar i;
  260.     if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启动,是则初始化时间*/
  261.     {
  262.         for(i=0;i<8;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
  263.                   P8563_settime();
  264.         writeData(0x0,0x00);
  265.         writeData(0xa,0x8); /*8:00报警*/
  266.         writeData(0x1,0x12); /*报警有效*/
  267.         writeData(0xd,0xf0);
  268.     }
  269. }


  270. void DisplaySecond(uchar x)        //写入1602秒
  271. {
  272.         uchar i,j;   
  273.         i=x/10;
  274.         j=x%10;
  275.         write_com(0xc7);   //写1602的命令字,设置秒的数据地址为47H
  276.         write_date(0x30+i); //写入秒的低位  
  277.         write_date(0x30+j); //写入秒的高位      
  278. }

  279. void DisplayMinute(uchar x)         //写入1602分
  280. {
  281.         uchar i,j;   
  282.         i=x/10;
  283.         j=x%10;
  284.         write_com(0xc4);   
  285.         write_date(0x30+i);  
  286.         write_date(0x30+j);        
  287. }

  288. void DisplayHour(uchar x)         //写入1602小时
  289. {
  290.         uchar i,j;   
  291.         i=x/10;
  292.         j=x%10;
  293.         write_com(0xc1);   
  294.         write_date(0x30+i);  
  295.         write_date(0x30+j);        
  296. }

  297. void DisplayDay(uchar x)         //写入1602天
  298. {
  299.         uchar i,j;   
  300.         i=x/10;
  301.         j=x%10;   
  302.         write_com(0x89);   
  303.         write_date(0x30+i);  
  304.         write_date(0x30+j);      
  305. }

  306. void DisplayMonth(uchar x)         //写入1602月
  307. {
  308.         uchar i,j;     
  309.         i=x/10;
  310.         j=x%10;  
  311.         write_com(0x86);   
  312.         write_date(0x30+i);  
  313.         write_date(0x30+j);  
  314. }

  315. void DisplayYear(uchar x)         //写入1602年
  316. {
  317.         uchar i,j;  
  318.         i=x/10;
  319.         j=x%10;
  320.         write_com(0x83);   
  321.         write_date(0x30+i);
  322.         write_date(0x30+j);  
  323. }   

  324. void DisplayWeek(uchar x)        //写入星期
  325. {
  326.         uchar i;
  327.         x=(x)*3;
  328.         write_com(0x8c);   
  329.         for(i=0;i<3;i++)
  330.         {
  331.                 write_date(table2[x]);
  332.                 x++;  
  333.         }
  334. }  


  335. void DisplayCentury(uchar x)         //写入世纪
  336. {
  337.         uchar i,j;  
  338.         i=x/10;
  339.         j=x%10;
  340.         write_com(0x81);   
  341.         write_date(0x30+i);
  342.         write_date(0x30+j);  
  343. }   


  344.         

  345. //---BCD转换16函数---//
  346. void BCD_16( )
  347. {
  348. uchar i,ucData1,ucData2;
  349.         for(i=0;i<7;i++)
  350.         {
  351.                 ucData1=g8563_Store[i]/16; //BCD码转十六进制
  352.                 ucData2=g8563_Store[i]%16;
  353.                 g8563_Store[i]=ucData1*10+ucData2;
  354.                 }
  355. }

  356. void display(void)
  357. {

  358.         DisplaySecond(g8563_Store[0]);           
  359.         DisplayMinute(g8563_Store[1]);        
  360.         DisplayHour(g8563_Store[2]);            
  361.         DisplayDay(g8563_Store[3]);               
  362.         DisplayMonth(g8563_Store[5]);            
  363.         DisplayYear(g8563_Store[6]);         
  364.         DisplayWeek(g8563_Store[4]);
  365.          DisplayCentury(g8563_Store[7]);


  366. }



  367. void turn_val(uchar newval,uchar flag,uchar  newaddr,uchar s1num)        
  368. //newval是时间日期值,flag是时间日期增减标识,newaddr是读取数据的地址,s1num是年月日时分秒星期的数字标识
  369. {
  370. uchar ucData1,ucData2;
  371.         newval=ReadData(newaddr);
  372. //        century=newval;
  373.         switch(newaddr)
  374.                 {
  375.                 case 0x02:newval=(newval&0x7f); /*秒*/
  376.                 break;
  377.                 case 0x03:newval=(newval&0x7f); /*秒*/
  378.                 break;
  379.                 case 0x04:newval=(newval&0x3f);/*小时*/
  380.                 break;
  381.                 case 0x05:newval=(newval&0x3f); /*日*/
  382.                 break;
  383.                 case 0x06:newval=(newval&0x07); /*星期*/
  384.                 break;
  385.                 case 0x07:newval=(newval&0x1f);/*月*/
  386.                 break;
  387.                 case 0x08:newval=(newval&0xff);/*年*/
  388.                 }

  389.                 ucData1=newval/16; //BCD码转十六进制
  390.                 ucData2=newval%16;
  391.                 newval=ucData1*10+ucData2;

  392.         if(flag)                                                                  //判断是加一还是减一
  393.         {
  394.                 newval++;
  395.                 switch(s1num)
  396.                 {
  397.                         case 1: if(newval>99) newval=0;
  398.                         DisplayYear(newval);      
  399.                         break;
  400.                         case 2: if(newval>12) newval=1;
  401.                         DisplayMonth(newval);
  402.                         break;
  403.                         case 3: if(newval>31) newval=1;
  404.                         DisplayDay(newval);  
  405.                         break;
  406.                         case 4: if(newval>6) newval=0;
  407.                         DisplayWeek(newval);
  408.                         break;
  409.                         case 5: if(newval>23) newval=0;
  410.                         DisplayHour(newval);
  411.                         break;
  412.                         case 6: if(newval>59) newval=0;
  413.                         DisplayMinute(newval);
  414.                         break;
  415.                         case 7: if(newval>59) newval=0;
  416.                         DisplaySecond(newval);
  417.                         break;
  418.                         default:break;
  419.                 }
  420.         }   
  421.         else
  422.         {
  423.                 newval--;
  424.                 switch(s1num)
  425.                 {
  426.                         case 1: if(newval==0XFF) newval=99;
  427.                         DisplayYear(newval);
  428.                         break;
  429.                         case 2: if(newval==0) newval=12;
  430.                         DisplayMonth(newval);
  431.                         break;
  432.                         case 3: if(newval==0) newval=31;
  433.                         DisplayDay(newval);
  434.                         break;
  435.                         case 4: if(newval==0xff) newval=6;
  436.                         DisplayWeek(newval);
  437.                         break;
  438.                         case 5: if(newval==0xff) newval=23;
  439.                         DisplayHour(newval);
  440.                         break;
  441.                         case 6: if(newval==0xff) newval=59;
  442.                         DisplayMinute(newval);
  443.                         break;
  444.                         case 7: if(newval==0xff) newval=59;
  445.                         DisplaySecond(newval);
  446.                         break;
  447.                         default:break;
  448.                 }
  449.         }

  450.                 ucData1=newval/10; //BCD码转十六进制
  451.                 ucData2=newval%10;
  452.                 newval=ucData1*16+ucData2;


  453. writeData(newaddr,newval);


  454. }   
  455. void delay(uint z)
  456. {
  457.         uint x,y;
  458.         for(x=z;x>0;x--)
  459.         for(y=110;y>0;y--);
  460. }
  461. //键盘扫描程序
  462. void key_scan(void)
  463. {
  464.         uchar s1num=0;                        //s1num记录光标的位置的编号
  465.         if(menu==0)
  466.         {
  467.                 delay(5);
  468.                 if(menu==0)
  469.                 {
  470.                         while(!menu);          //menum测试到由0到1的变化,也就是按下松开的变化,s1num加1
  471.                         s1num++;
  472.                         while(1)
  473.                         {
  474.                                 if(menu==0)
  475.                                 {
  476.                                 delay(5);
  477.                                 if(menu==0)
  478.                                 {
  479.                                 while(!menu);
  480.                                 s1num++;        //menum测试到由0到1的变化,也就是按下松开的变化,s1num再加1
  481.                                 }
  482.                                 }


  483.         writeData(0x0,0x20);;//停止计时,开始相关设置。



  484.                                 write_com(0x0f);//光标闪射,0X0F是1602的命令字,显示开,光标开,光标闪烁
  485.                         
  486.                                 if(s1num==1)
  487.                                 {
  488.                                         year=ReadData(0x08);        //读取年的数据。         
  489.                                         write_com(0x80+4);        //年光标,0X80+地址码,设置数据地址指针
  490.                                         if(add==0)
  491.                                         {
  492.                                                 delay(3);
  493.                                                 if(add==0)
  494.                                                 {
  495.                                                 while(!add);
  496.                                                 turn_val(year,1,0x08,1);               
  497.                                                 }
  498.                                         }
  499.                                         if(dec==0)
  500.                                         {
  501.                                                 delay(3);
  502.                                                 if(dec==0)
  503.                                                 {
  504.                                                 while(!dec);
  505.                                                 turn_val(year,0,0x08,1);//读取当前年值,根据减小年值,并写入1302                              
  506.                                                 }
  507.                                         }
  508.                                 }
  509.                         
  510.                                 if(s1num==2)
  511.                                 {
  512.                                         month=ReadData(0x07);
  513.                                         write_com(0x80+7);        //月光标
  514.                                         if(add==0)
  515.                                         {
  516.                                                 delay(3);
  517.                                                 if(add==0)
  518.                                                 {
  519.                                                         while(!add);
  520.                                                         turn_val(month,1,0x07,2);
  521.                                                 }
  522.                                         }
  523.                                         if(dec==0)
  524.                                         {
  525.                                                 delay(3);
  526.                                                 if(dec==0)
  527.                                                 {
  528.                                                         while(!dec);
  529.                                                         turn_val(month,0,0x07,2);
  530.                                                 }
  531.                                         }
  532.                                 }
  533.                         
  534.                                 if(s1num==3)
  535.                                 {
  536.                                         day=ReadData(0x05);
  537.                                         write_com(0x80+10);//日光标
  538.                                         if(add==0)
  539.                                         {
  540.                                                 delay(3);
  541.                                                 if(add==0)
  542.                                                 {
  543.                                                         while(!add);
  544.                                                         turn_val(day,1,0x05,3);
  545.                                                 }
  546.                                         }
  547.                                         if(dec==0)
  548.                                         {
  549.                                                 delay(3);
  550.                                                 if(dec==0)
  551.                                                 {
  552.                                                         while(!dec);
  553.                                                         turn_val(day,0,0x05,3);        //写入日寄存器
  554.                                                 }
  555.                                         }
  556.                                 }
  557.                                 
  558.                                 if(s1num==4)
  559.                                 {
  560.                                         week=ReadData(0x06);
  561.                                         write_com(0x80+14);        //星期光标
  562.                                         if(add==0)
  563.                                         {
  564.                                                 delay(3);
  565.                                                 if(add==0)
  566.                                                 {
  567.                                                         while(!add);
  568.                                                         turn_val(week,1,0x06,4);
  569.                                                 }
  570.                                         }
  571.                                         if(dec==0)
  572.                                         {
  573.                                                 delay(3);
  574.                                                 if(dec==0)
  575.                                                 {
  576.                                                         while(!dec);
  577.                                                         turn_val(week,0,0x06,4);
  578.                                                 }
  579.                                         }
  580.                                 }
  581.                                 
  582.                                 if(s1num==5)
  583.                                 {
  584.                                         hour=ReadData(0x04);
  585.                                         write_com(0x80+0x40+2);        //时光标,因为是第二行的地址从0X40开始,所以加0X40。
  586.                                         if(add==0)
  587.                                         {
  588.                                                 delay(3);
  589.                                                 if(add==0)
  590.                                                 {
  591.                                                         while(!add);
  592.                                                         turn_val(hour,1,0x04,5);
  593.                                                 }
  594.                                         }
  595.                                         if(dec==0)
  596.                                         {
  597.                                                 delay(3);
  598.                                                 if(dec==0)
  599.                                                 {
  600.                                                         while(!dec);
  601.                                                         turn_val(hour,0,0x04,5);
  602.                                                 }
  603.                                         }
  604.                                 }
  605.                                 
  606.                                 if(s1num==6)//调时间分
  607.                                 {
  608.                                         minute=ReadData(0x03);
  609.                                         write_com(0x80+0x40+5);
  610.                                         if(add==0)
  611.                                         {
  612.                                                 delay(5);
  613.                                                 if(add==0)
  614.                                                 {
  615.                                                         while(!add);
  616.                                                         turn_val(minute,1,0x03,6);                                //写入分寄存器   
  617.                                                 }
  618.                                         }
  619.                                         if(dec==0)
  620.                                         {
  621.                                                 delay(3);
  622.                                                 if(dec==0)
  623.                                                 {
  624.                                                         while(!dec);
  625.                                                         turn_val(minute,0,0x03,6);                                //写入分寄存器
  626.                                                 }
  627.                                         }
  628.                                 }
  629.                                 
  630.                                 if(s1num==7)//调时间秒
  631.                                 {
  632.                                         second=ReadData(0x02);
  633.                                         write_com(0x80+0x40+8);//秒光标
  634.                                         if(add==0)
  635.                                         {
  636.                                                 delay(3);
  637.                                                 if(add==0)
  638.                                                 {
  639.                                                 while(!add);
  640.                                                 if(second==0x60)
  641.                                                 second=0x00;
  642.                                                 turn_val(second,1,0x02,7);        
  643.                                                 }
  644.                                         }
  645.                                         if(dec==0)
  646.                                         {
  647.                                                 delay(3);
  648.                                                 if(dec==0)
  649.                                                 {
  650.                                                         while(!dec);
  651.                                                         turn_val(second,0,0x02,7);                                
  652.                                                 }
  653.                                         }
  654.                                 }
  655.                                 
  656.                                 if(s1num==8)
  657.                                 {
  658.           writeData(0x0,0x00);//设置结束,开始计时

  659.                                 s1num=0;//s1num清零//
  660.                                         write_com(0x0c);//光标不闪烁//
  661.                                         break;
  662.                                 }
  663.                         }
  664.                 }
  665.         }
  666. }


  667. //---主函数---//
  668. void main()
  669. {
  670. P8563_init();        
  671. init();
  672.         
  673.         while(1)
  674.         {

  675.                 P8563_gettime();
  676.                 BCD_16( );

  677. …………限于本文篇幅 余下代码请从51hei电子下载附件…………
复制代码



下载(Proteus7.8打开,其他版本都不行):
PCF8563.rar (64.6 KB, 下载次数: 293)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩1
回复

使用道具 举报

沙发
ID:207690 发表于 2017-6-4 15:23 | 只看该作者
好啊,楼主能下载么
回复

使用道具 举报

板凳
ID:105206 发表于 2017-7-4 10:47 | 只看该作者
看看,学习下,谢谢分享。
回复

使用道具 举报

地板
ID:105206 发表于 2017-10-20 09:02 | 只看该作者
学习了,谢谢分享。
回复

使用道具 举报

5#
ID:142614 发表于 2017-11-8 21:14 | 只看该作者
感谢楼主分享
回复

使用道具 举报

6#
ID:323998 发表于 2018-5-7 23:32 | 只看该作者
学习了
感谢楼主分享
回复

使用道具 举报

7#
ID:426889 发表于 2018-11-18 20:56 | 只看该作者
LCD 没有显示任何数据啊
回复

使用道具 举报

8#
ID:158013 发表于 2019-1-21 17:35 | 只看该作者
感谢楼主的分享!
回复

使用道具 举报

9#
ID:552564 发表于 2019-6-11 22:09 | 只看该作者
非常感谢分享!
回复

使用道具 举报

10#
ID:644774 发表于 2019-11-21 09:43 | 只看该作者
为什么我仿真的时候不能调数值呢?而且LCD上面没有显示D:\图片1
回复

使用道具 举报

11#
ID:410680 发表于 2020-2-21 20:13 | 只看该作者

看看,学习下,谢谢分享
回复

使用道具 举报

12#
ID:872135 发表于 2021-1-2 17:27 | 只看该作者
LCD根本没显示
回复

使用道具 举报

13#
ID:328014 发表于 2021-1-9 17:26 | 只看该作者

楼主说了,必须要Proteus7.8打开,,其他版本都不行
回复

使用道具 举报

14#
ID:795427 发表于 2022-1-2 17:06 | 只看该作者
在8.9版本上显示,IIC写数据函数
  1. void writebyte(uchar wdata)
  2. {
  3.    uchar i;
  4.    for(i=0;i<8;i++)
  5.    {
  6.        if(wdata&0x80) SDA=1;
  7.        else SDA=0;
  8.        wdata<<=1;
  9.                  _nop_();
  10.         _nop_();
  11.        SCL=1;
  12.       _nop_();
  13.         _nop_();_nop_();
  14.         _nop_();_nop_();
  15.        SCL=0;
  16.    }
  17. //  WaitACK();     //I2C器件或通讯出错,将会退出I2C通讯
  18. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表