找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 251|回复: 6
收起左侧

求教单片机怎么和16*64的点阵屏连接

[复制链接]
回帖奖励 300 黑币 回复本帖可获得 150 黑币奖励! 每人限 1 次
ID:1122046 发表于 2024-5-23 22:02 | 显示全部楼层 |阅读模式
在用单片机做一个数字电子钟,学校实验室拿的16*64的点阵屏,但是不会用
51hei图片_20240523215620.jpg
51hei图片_20240523215633.jpg
回复

使用道具 举报

ID:1064915 发表于 2024-5-24 10:37 | 显示全部楼层
配套资料发上来
回复

使用道具 举报

ID:1122046 发表于 2024-5-24 10:38 | 显示全部楼层
  1. #include <REGX52.H>
  2. #include "STC12C5A60S2"
  3. #include "intrins.h"

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar l_tmpDate[]={0,0,0,1,1,1,13};//秒分时日月周年08-05-15 12:00:00

  7. uchar l_tmpdisplay[15];   
  8. code uchar Write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位  
  9. code uchar Read_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};  
  10. sbit SCK = P1^3; //DS1302时钟;  
  11. sbit SDA = P1^4; //DS1302数据;  
  12. sbit RST = P1^5;// DS1302复位;   
  13. uchar set=0; //按键选择标志位;
  14. char key_flag=0;//按键加减标志位;
  15. uchar menue=0; //菜单选择标志位;
  16. uchar ok=0;  //确认标志位;  
  17. char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
  18. /////////////DS1302写一个字节/////
  19. void Write_Ds1302_Byte(uchar temp)  
  20. {   
  21.         uchar i;   
  22.         for (i=0;i<8;i++)      //循环8次 写入数据  
  23.         {     
  24.                  SCK=0;      
  25.                 SDA=temp&0x01;     //每次传输低字节      
  26.                 temp>>=1;   //右移一位      
  27.                 SCK=1;   
  28.         }
  29. }
  30. /*****************/ /*                  
  31. 写入DS1302                                    
  32. */ /************************/
  33. void Write_Ds1302(uchar address,uchar dat )      
  34. {   
  35.         RST=0;  _nop_();   
  36.         SCK=0;  _nop_();   
  37.         RST=1;       _nop_();                    //启动   
  38.         Write_Ds1302_Byte(address); //发送地址   
  39.         Write_Ds1302_Byte(dat);  //发送数据   
  40.         RST=0;                //恢复
  41. }
  42. /***************/ /*                  
  43. 读出DS1302数据                              
  44. */ /*********************/
  45. uchar Read_Ds1302 ( uchar address )
  46. {     
  47.         uchar i,temp=0x00;     
  48.         RST=0;  _nop_();  _nop_();   
  49.         SCK=0;  _nop_();  _nop_();   
  50.         RST=1;  _nop_();
  51.         _nop_();   
  52.         Write_Ds1302_Byte(address);     
  53.         for (i=0;i<8;i++)   //循环8次 读取数据   
  54.         {      
  55.                 if(SDA)   
  56.                 {   
  57.                         temp|=0x80;   
  58.                 }   //每次传输低字节   
  59.                 temp>>=1;   //右移一位   
  60.                 SCK=1;     _nop_();     _nop_();   
  61.                 SCK=0;   
  62.         }
  63.         RST=0;  _nop_();            
  64. //以下为DS1302复位的稳定时间   
  65.         _nop_();  
  66.         RST=0;  
  67.         SCK=0;  _nop_();  _nop_();  _nop_();  _nop_();  
  68.         SCK=1;  _nop_();  _nop_();  
  69.         SDA=0;  _nop_();  _nop_();  
  70.         SDA=1;  _nop_();  _nop_();  
  71.         return (temp);   //返回
  72. }
  73. /**************************/ /*                  
  74. 读时钟数据                                   
  75. */ /***********************/
  76. void Read_RTC(void)         //读取 日历
  77. {   
  78.         uchar i,*p;   
  79.         p=Read_RTC_address;      //地址传递  
  80.         for(i=0;i<7;i++)      //分7次读取 秒分时日月周年
  81.         {   
  82.                 l_tmpDate[i]=Read_Ds1302(*p);   
  83.                 p++;  
  84.         }   
  85. }
  86. /***************************/ /*                  
  87. 设定时钟数据                                 
  88. */ /************************/
  89. void Set_RTC(void)      //设定 日历
  90. {  
  91.         uchar i,*p,tmp;  
  92.         for(i=0;i<7;i++)         
  93.         {           //BCD处理   
  94.                 tmp=l_tmpDate[i]/10;   
  95.                 l_tmpDate[i]=l_tmpDate[i]%10;   
  96.                 l_tmpDate[i]=l_tmpDate[i]+tmp*16;   
  97.         }      
  98.         Write_Ds1302(0x8E,0X00); //关闭写保护;      
  99.         p=Write_rtc_address; //传地址   
  100.         for(i=0;i<7;i++)  //7次写入 秒分时日月周年   
  101.         {     
  102.                 Write_Ds1302(*p,l_tmpDate[i]);      
  103.                 p++;   
  104.         }   
  105.         Write_Ds1302(0x8E,0x80); //打开写保护;  
  106. }
  107. /*********8x16字模 ****************************/
  108. //取模方式:逐行式 逆向 阴码  宽x高=8x16
  109. uchar code table[]={
  110. /*--  文字:  0  --*/  /*--  宋体12;  
  111. 此字体下对应的点阵为:宽x高=8x16   --*/  
  112. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
  113. 0x24,0x18,0x00,0x00,
  114. /*--  文字:  1  --*/  /*--  宋体12;  
  115. 此字体下对应的点阵为:宽x高=8x16   --*/  
  116. 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
  117. 0x08,0x3E,0x00,0x00,   
  118. /*--  文字:  2  --*/  /*--  宋体12;  
  119. 此字体下对应的点阵为:宽x高=8x16   --*/  
  120. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,
  121. 0x42,0x7E,0x00,0x00,   
  122. /*--  文字:  3  --*/  /*--  宋体12;  
  123. 此字体下对应的点阵为:宽x高=8x16   --*/  
  124. 0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,
  125. 0x22,0x1C,0x00,0x00,   
  126. /*--  文字:  4  --*/  /*--  宋体12;  
  127. 此字体下对应的点阵为:宽x高=8x16   --*/  
  128. 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,
  129. 0x20,0x78,0x00,0x00,   
  130. /*--  文字:  5  --*/  /*--  宋体12;  
  131. 此字体下对应的点阵为:宽x高=8x16   --*/  
  132. 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,
  133. 0x22,0x1C,0x00,0x00,
  134. /*--  文字:  6  --*/  /*--  宋体12;  
  135. 此字体下对应的点阵为:宽x高=8x16   --*/  
  136. 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,
  137. 0x24,0x18,0x00,0x00,   
  138. /*--  文字:  7  --*/  /*--  宋体12;  
  139. 此字体下对应的点阵为:宽x高=8x16   --*/  
  140. 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,
  141. 0x08,0x08,0x00,0x00,   
  142. /*--  文字:  8  --*/  /*--  宋体12;  
  143. 此字体下对应的点阵为:宽x高=8x16   --*/  
  144. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,
  145. 0x42,0x3C,0x00,0x00,   
  146. /*--  文字:  9  --*/  /*--  宋体12;  
  147. 此字体下对应的点阵为:宽x高=8x16   --*/  
  148. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,
  149. 0x24,0x1C,0x00,0x00,   
  150. /*--  文字:  -  --*///10;  /*--  宋体12;  
  151. //此字体下对应的点阵为:宽x高=8x16   --*/  
  152. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,
  153. 0x00,0x00,0x00,0x00,




  154. /*--  文字:  :  --*///11;  /*--  宋体12;  
  155. //此字体下对应的点阵为:宽x高=8x16   --*/  
  156. ////0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
  157. //0x18,0x18,0x00,0x00,0x00,0x00,

  158. 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
  159. 0x18,0x18,0x00,0x00,
  160. /*--  文字:  _  --*///12  /*--  宋体12;  
  161. //此字体下对应的点阵为:宽x高=8x16   --*/  
  162. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  163. 0x00,0x00,0x00,0xFF,   
  164. /****************空格****13*****************/
  165. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  0x00,0x00,0x00,
  166. 0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  167. //////////////C//14//////////////
  168. //取模方式:逐行式 逆向 阴码  宽x高=8x16
  169. 0x00,0x00,0x3C,0x3E,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
  170. 0x02,0x3E,0x3C,0x00,

  171. //14   'a'-83;  
  172. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  0x42,0x78,0x44,
  173. 0x42,0x42,0xFC,0x00,0x00,/*"a",0*/   
  174. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,  
  175. 0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00,/*"b",1*/   
  176. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,  
  177. 0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00,/*"c",2*/   
  178. 0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,  
  179. 0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00,/*"d",3*/   
  180. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  
  181. 0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00,/*"e",4*/   
  182. 0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,  
  183. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"f",5*/   
  184. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,  
  185. 0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C,/*"g",6*/
  186. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,  
  187. 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",7*/   
  188. 0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,  
  189. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"i",8*/   
  190. 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,  
  191. 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E,/*"j",9*/   
  192. 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,  
  193. 0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00,/*"k",10*/   
  194. 0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,  
  195. 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"l",11*/
  196. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,  
  197. 0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00,/*"m",12*/   
  198. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,  
  199. 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"n",13*/   
  200. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,  
  201. 0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",14*/   
  202. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,  
  203. 0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,/*"p",15*/   
  204. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,  
  205. 0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,/*"q",16*/   
  206. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,  
  207. 0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,/*"r",17*/   
  208. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,  
  209. 0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00,/*"s",18*/
  210. 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,  
  211. 0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00,/*"t",19*/   
  212. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,  
  213. 0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00,/*"u",20*/   
  214. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,  
  215. 0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00,/*"v",21*/   
  216. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,  
  217. 0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00,/*"w",22*/   
  218. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,  
  219. 0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00,/*"x",23*/   
  220. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,  
  221. 0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07,/*"y",24*/   
  222. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,  
  223. 0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00,/*"z",25*/
  224. };
  225. /************16x16 字模 ***************/
  226. //取模方式:逐行式 逆向 阴码  宽x高=16x16
  227. uchar code table1[]={   
  228. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  229. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,
  230. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  231. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",0*/

  232. 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
  233. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  234. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  235. 0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"二",1*/
  236.   
  237. 0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,
  238. 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
  239. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  240. 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"三",2*/
  241.   
  242. 0x00,0x00,0x00,0x00,0xFE,0x3F,0x22,0x22,
  243. 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
  244. 0x12,0x22,0x12,0x3C,0x0A,0x20,0x06,0x20,  
  245. 0x02,0x20,0xFE,0x3F,0x02,0x20,0x00,0x00,/*"四",3*/   
  246. 0x00,0x00,0xFE,0x3F,0x40,0x00,0x40,0x00,
  247. 0x40,0x00,0x40,0x00,0xFC,0x0F,0x20,0x08,
  248. 0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,  
  249. 0x10,0x08,0x10,0x08,0xFF,0x7F,0x00,0x00,/*"五",4*/
  250. 0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x01,
  251. 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,
  252. 0x20,0x02,0x20,0x04,0x10,0x08,0x10,0x10,  
  253. 0x08,0x10,0x04,0x20,0x02,0x20,0x00,0x00,/*"六",5*/   
  254. 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,
  255. 0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
  256. 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,  
  257. 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"日",6*/   
  258. 0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,
  259. 0x08,0x08,0xF8,0x0F,0x80,0x00,0x88,0x00,
  260. 0xF8,0x1F,0x84,0x00,0x82,0x00,0xF8,0x0F,
  261. 0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00,/*"星",7*/   
  262. 0x44,0x00,0x44,0x3E,0xFE,0x22,0x44,0x22,
  263. 0x44,0x22,0x7C,0x3E,0x44,0x22,0x44,0x22,
  264. 0x7C,0x22,0x44,0x3E,0x44,0x22,0xFF,0x22,  
  265. 0x20,0x21,0x44,0x21,0x82,0x28,0x41,0x10,/*"期",8*/

  266. 0x00,0x00,0xE0,0x0F,0x62,0x0C,0xE6,0x0F,0x6C,0x0C,
  267. 0xEA,0x0F,0x06,0x00,0xF4,0x1F,0x3C,0x18,0xB0,0x1A,
  268. 0xBC,0x1A,0xB4,0x1A,0xB2,0x1A,0xFB,0x3F,0xF9,0x3F,
  269. 0x00,0x00,  /////////////////////温////9//

  270. 0x00,0x00,0xC0,0x00,0x80,0x00,0xFC,0x0F,0x0C,0x00,
  271. 0x6C,0x03,0xFC,0x0F,0x6C,0x03,0xEC,0x03,0x0C,0x00,
  272. 0xEC,0x07,0x6C,0x06,0xCC,0x03,0x66,0x06,0x33,0x0C,
  273. 0x00,0x00,/////////////////度、、、、、、10//

  274. 0x00,0x00,0x0C,0x00,0xFC,0x1F,0x0C,0x00,0xF6,0x07,
  275. 0xB0,0x01,0xB0,0x01,0xB0,0x01,0xFC,0x0F,0x80,0x01,
  276. 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,
  277. 0x00,0x00,///////////年、、、、、、、、、11//

  278. 0x00,0x00,0xF8,0x0F,0x18,0x0C,0x18,0x0C,0x18,0x0C,
  279. 0xF8,0x0D,0x18,0x0C,0x18,0x0C,0xF8,0x0D,0x18,0x0C,
  280. 0x18,0x0C,0x1C,0x0C,0x1C,0x0C,0x0E,0x0F,0x06,0x06,
  281. 0x00,0x00,///////////月////////////12///

  282. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  283. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   
  284. //9; //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  285. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  
  286. };
  287. /***********************************************************
  288.         功   能:16x64点阵屏加DS1302显示时间
  289.         单片机:STC12C5A60S2
  290.         晶  振:22.1184M
  291.         作  者:苏义江改编自网络
  292.         时  间:2016-6-18日
  293. ***********************************************************/
  294. #include <STC12C5A60S2.h>
  295. #include "macroandconst.h"
  296. #include  <intrins.h>
  297. #define uchar unsigned char
  298. #define uint unsigned int


  299. sbit R =P2^6; //上半屏数据
  300. sbit R1=P2^7; //下半屏数据
  301. sbit CLK=P2^4;   //74HC595的移位时钟 SHCP
  302. sbit STB=P2^3;   //输出锁存  STCP 595锁存信号

  303. //行扫描
  304. sbit A1   =P2^0;
  305. sbit B1   =P2^1;
  306. sbit C1   =P2^2;
  307. sbit OE   =P2^5;    //74HC138的使能

  308. sbit fmq  =P1^7;//蜂鸣器
  309. //按键
  310. sbit keymenue =P0^2; //功能
  311. sbit keyup    =P0^3; //加
  312. sbit keydown  =P0^4; //减
  313. sbit keyswitch=P0^5; //调整移位
  314. sbit keyok    =P0^6; //确认

  315. sbit DQ  =P1^6; //DS18B20的数据输入/输出脚DQ,根据情况设定
  316. //sbit wei =P2^7;//数码管位选573使能
  317. //sbit duan=P2^6;//数码管段选573使能
  318. uchar code smg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
  319.                                                 0x82,0xF8,0x80,0x90,0xBF}; //显示段码


  320. extern uchar code table[];
  321. extern uchar code table1[];  
  322. extern uchar set; //按键选择标志位;
  323. extern char key_flag;//按键加减标志位;
  324. extern uchar menue; //菜单选择标志位;
  325. extern uchar ok;  //确认标志位;

  326. uint sdata;//测量到的温度的整数部分
  327. uchar xiaoshu1;//小数第一位
  328. uchar xiaoshu2;//小数第二位
  329. uchar xiaoshu;//两位小数
  330. bit  fg=1; //温度正负标志

  331. uint temp;              //温度值


  332. extern char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
  333. extern uchar l_tmpDate[];//秒分时日月周年08-05-15 12:00:00
  334. extern uchar l_tmpdisplay[];   
  335. extern void Write_Ds1302(uchar address,uchar dat );
  336. extern void Read_RTC(void);
  337. void data_change();
  338. uint num;

  339. void Delay10ms()  //@11.0592MHz
  340. {  
  341.         uchar i, j;   
  342.         i = 108;  
  343.         j = 145;  
  344.         do  
  345.         {   
  346.         while (--j);  
  347.         }
  348.         while (--i);
  349. }
  350. //STC12C5A单片机定时1us DS18B20延时
  351. void  delay_b20(uchar n)
  352. {   
  353.         while(n--)
  354.           {
  355.                   _nop_();      
  356.           }   
  357. }

  358. bit Init_DS18B20(void) //发送复位
  359. {                              
  360.         bit flag;         //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在   
  361.         DQ = 1;           //先将数据线拉高   
  362.         delay_b20(1); //略微延时约6微秒      ;  
  363.         DQ = 0;           //再将数据线从高拉低,要求保持480~960us  
  364.         delay_b20(500); //略微延时约600微秒       ;         
  365. //以向DS18B20发出一持续480~960us的低电平复位脉冲   
  366.         DQ = 1;           //释放数据线(将数据线拉高)   
  367.         delay_b20(60);   //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)  
  368.         flag=DQ;          //让单片机检测是否输出了存在脉冲(DQ=0表示存在)        
  369.         delay_b20(500); //延时足够长时间,等待存在脉冲输出完毕       ;   
  370.         return flag;    //返回检测成功标志
  371. }               
  372. uchar ReadOneChar(void)  
  373. {   
  374.         uchar i=0;   
  375.         uchar dat;  //储存读出的一个字节数据   
  376.         for (i=0;i<8;i++)   
  377.         {           
  378.                 DQ =1;       // 先将数据线拉高      
  379.                 delay_b20(1);     //等待一个机器周期        
  380.                 DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序      
  381.                 delay_b20(1);     //等待一个机器周期         
  382.                 DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备     
  383.                 delay_b20(1);               ;      //延时约6us,使主机在15us内采样      
  384.                 dat>>=1;      
  385.                 if(DQ==1)         
  386.                 dat|=0x80;  //如果读到的数据是1,则将1存入dat   
  387.                 else     
  388.                 dat|=0x00;//如果读到的数据是0,则将0存入dat        //将单片机检测到的电平信号DQ存入r[i]      
  389.                 delay_b20(60);         ;              //延时3us,两个读时序之间必须有大于1us的恢复期      
  390.         }                        
  391.         return(dat);    //返回读出的十六进制数据
  392. }

  393. void WriteOneChar(uchar dat)
  394. {  
  395.         uchar i=0;  
  396.         for (i=0; i<8; i++)   
  397.         {     
  398.                 DQ =1;         // 先将数据线拉高     
  399.                 delay_b20(1);      //等待一个机器周期      
  400.                 DQ=0;          //将数据线从高拉低时即启动写时序           
  401.                 DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,      
  402.                   //并将其送到数据线上等待DS18B20采样     
  403.                 delay_b20(60);         ;
  404. //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样     
  405.                 DQ=1;          //释放数据线           
  406.                 delay_b20(60);
  407.                 dat>>=1;       //将dat中的各二进制位数据右移1位   
  408.         }   
  409.         delay_b20(1);
  410. }
  411. void ReadyReadTemp(void)
  412. {        
  413.         Init_DS18B20();     //将DS18B20初始化   
  414.         WriteOneChar(0xCC); // 跳过读序号列号的操作  
  415.         WriteOneChar(0x44); // 启动温度转换         
  416.         delay_b20(200); //转换一次需要延时一段时间      
  417.         Init_DS18B20();     //将DS18B20初始化   
  418.         WriteOneChar(0xCC); //跳过读序号列号的操作   
  419.         WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位  
  420. }


  421. uchar doe[4];
  422. uint wendu_duzhuanhuan()
  423. {
  424.         uint a,b,t;
  425.         Init_DS18B20();     //将DS18B20初始化   
  426.         WriteOneChar(0xCC); // 跳过读序号列号的操作  
  427.         WriteOneChar(0x44); // 启动温度转换         
  428.         delay_b20(200); //转换一次需要延时一段时间      
  429.         Init_DS18B20();     //将DS18B20初始化   
  430.         WriteOneChar(0xCC); //跳过读序号列号的操作   
  431.         WriteOneChar(0xBE); //读取温度寄存器,前两个?
  432.         a=ReadOneChar();
  433.         b=ReadOneChar();
  434.         t=b;
  435.         t<<=8;
  436.         t=t|a;
  437.         t=t*0.6250+0.5;
  438.         return t;
  439. }
  440. void wenduzhuan()
  441. {
  442.         uint tp;
  443.         tp=wendu_duzhuanhuan();
  444.         doe[0]=tp/1000;
  445.         doe[1]=tp%1000/100;
  446.         doe[2]=tp%100/10;
  447.         doe[3]=tp%10;
  448. }

  449. void key()
  450. {     
  451. /*判断选择按键是否按下;如果按下了当松开的时候让背光打开;set++;*/   
  452.         if(keyswitch==0)   
  453.         {      
  454.                 Delay10ms();     
  455.                 if(keyswitch==0)      
  456.                 {      
  457.                          Delay10ms();     
  458.                         while(keyswitch==0);         
  459.                         set++;     //功能变量
  460.                         if(set>9)
  461.                         {set=0;menue=0;}         
  462.                 }   
  463.         }

  464. /*up和down按键的检测;加减标志位*/   
  465.         if(keyup==0)   
  466.         {
  467.                 Delay10ms();   
  468.                 if(keyup==0)     
  469.                 {            
  470.                         Delay10ms();   
  471.                         while(keyup==0);            
  472.                         key_flag++;  //加减标志位  
  473.                 }   
  474.         }
  475.         if(keydown==0)   
  476.         {
  477.                 Delay10ms();   
  478.                 if(keydown==0)   
  479.                 {         
  480.                         Delay10ms();   
  481.                         while(keydown==0);        
  482.                         key_flag--; //加减标志位   
  483.                 }
  484.         }   
  485.         if(keymenue==0)   
  486.         {   
  487.                 Delay10ms();   
  488.                 if(keymenue==0)   //菜单选择标志位;   
  489.                 {               
  490.                         Delay10ms();   
  491.                         while(keymenue==0);         
  492.                         menue++;     //菜单变量  
  493.                         if(menue>4)menue=0;         
  494.                 }   
  495.         }
  496.         if(keyok==0)   
  497.         {     
  498.                 Delay10ms();     
  499.                 if(keyok==0)    //确认标志位;     
  500.                 {
  501.                         Delay10ms();           
  502.                         while(keyok==0);     
  503.                         ok++;     
  504.                         if(ok>1)     
  505.                         {     
  506.                                 ok=0;   
  507.                                  menue=0;     
  508.                                 set=0;     
  509.                         }     
  510.                 }     
  511.         }     
  512. }
  513. //行扫描
  514. void hangsao(uchar num)
  515. {
  516.         switch(num)
  517.         {
  518.                 case 0:C1=0;B1=0;A1=0;break;
  519.                 case 1:C1=0;B1=0;A1=1;break;
  520.                 case 2:C1=0;B1=1;A1=0;break;
  521.                 case 3:C1=0;B1=1;A1=1;break;
  522.                 case 4:C1=1;B1=0;A1=0;break;
  523.                 case 5:C1=1;B1=0;A1=1;break;
  524.                 case 6:C1=1;B1=1;A1=0;break;
  525.                 case 7:C1=1;B1=1;A1=1;break;
  526.                 default:break;
  527.         }
  528. }
  529. /*****595写数据部分****************/

  530. void WriteByte(uchar DataR1,uchar DataR2)
  531. {
  532.         uchar i;
  533.         for(i = 0; i < 8; i++)//循环8次,把编码传给锁存器
  534.         {
  535.                   R=DataR1& 0x01;  //上屏数据  先送低位
  536.                   R1=DataR2 & 0x01;//下屏数据  先送低位
  537.                   CLK = 0;
  538.                 _nop_();
  539.                   CLK = 1;
  540.                   DataR1>>= 1;
  541.                   DataR2>>= 1;      
  542.         }
  543. }

  544. /*void WriteByte(uchar dat)   
  545. {  
  546.         uchar i;  
  547.         for (i=0;i<8;i++)   //循环8次,把编码传给锁存器  
  548.         {   
  549.                 dat=dat>>1;    //右移一位,取出该字节的最低位   
  550.                 R=CY;     //将该字节的最低位传给R   
  551.                 CLK=0;     //上升沿将数据移入595   
  552.                 CLK=1;  
  553.         }
  554. }
  555. */
  556. void writebyteshuzi(uchar n)//显示数字函数
  557. {  
  558.         WriteByte(~table[num+n*16],~table[num+n*16+8]);
  559. }
  560. void writebytehanzi(uchar n) //显示汉字函数
  561. {  
  562.         WriteByte(~table1[2*num+n*32+0],~table1[2*num+n*32+16]);
  563.         WriteByte(~table1[2*num+n*32+1],~table1[2*num+n*32+16+1]);
  564. }

  565. /******调时部分*************************/
  566. void set_date_time()
  567. {  
  568.         if(set==2)
  569.         {        
  570.                 menue=0;   //秒调整
  571.                 miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];   
  572.                 miao=miao+key_flag;   
  573.                 if((key_flag<0)&(miao==0))miao=59;   
  574.                 if(miao>59)miao=0;   
  575.                 miao=miao%10+(miao/10)*16;   
  576.                 Write_Ds1302(0x8E,0x00);   
  577.                 Write_Ds1302(0x80,miao);   
  578.                 Write_Ds1302(0x8E,0x80);      
  579.         }
  580.         if(set==3)
  581.         {      
  582.                 menue=0;  //分调整
  583.                 fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];  
  584.                 fen=fen+key_flag;  
  585.                 if(fen>59)  
  586.                 {  fen=0;  }   
  587.                 if((key_flag<0)&&(fen<0))
  588.                 {  fen=59;  }     
  589.                         fen=fen%10+(fen/10)*16;   
  590.                         Write_Ds1302(0x8E,0x00);  
  591.                         Write_Ds1302(0x82,fen);  
  592.                         Write_Ds1302(0x8E,0x80);   
  593.                 }
  594.         if(set==4)
  595.         {
  596.                 menue=0;  //时调整
  597.                 shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];  
  598.                 shi=shi+key_flag;  
  599.                 if(shi>23)shi=0;  
  600.                 if((key_flag<0)&&(shi<0))shi=23;     
  601.                 shi=shi%10+(shi/10)*16;   
  602.                 Write_Ds1302(0x8E,0x00);  
  603.                 Write_Ds1302(0x84,shi);  
  604.                 Write_Ds1302(0x8E,0x80);   
  605.         }
  606.         if(set==5)
  607.         {     
  608.                 menue=1;  //日调整   
  609.                 ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];  
  610.                 ri=ri+key_flag;  
  611.                 if(ri>31)ri=1;  
  612.                 if((key_flag<0)&&(ri<1))ri=31;  
  613.                 ri=ri%10+(ri/10)*16;   
  614.                 Write_Ds1302(0x8E,0x00);  
  615.                 Write_Ds1302(0x86,ri);  
  616.                 Write_Ds1302(0x8E,0x80);   
  617.                 zhou=l_tmpdisplay[12];  //周调整
  618.                 zhou=zhou+key_flag;  
  619.                 if(zhou>7)zhou=1;
  620.                 if((key_flag<0)&&(zhou<1))zhou=7;  
  621.                 zhou=zhou%10+(zhou/10)*16;   
  622.                 Write_Ds1302(0x8E,0x00);  
  623.                 Write_Ds1302(0x8A,zhou);  
  624.                 Write_Ds1302(0x8E,0x80);   
  625.         }
  626.         if(set==6)
  627.         {   
  628.                 menue=1;  //月调整   
  629.                 yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];  
  630.                 yue=yue+key_flag;  
  631.                 if(yue>12)yue=1;  
  632.                 if((key_flag<0)&&(yue<1))yue=12;  
  633.                 yue=yue%10+(yue/10)*16;   
  634.                 Write_Ds1302(0x8E,0x00);  
  635.                 Write_Ds1302(0x88,yue);  
  636.                 Write_Ds1302(0x8E,0x80);   
  637.         }
  638.         if(set==7)            
  639.         {  
  640.                 menue=1;  //年调整
  641.                 nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;  
  642.                 if(nian>79)nian=0;  
  643.                 if((key_flag<0)&&(nian<0))nian=79;   
  644.                 nian=nian%10+(nian/10)*16;   
  645.                 Write_Ds1302(0x8E,0x00);  
  646.                 Write_Ds1302(0x8C,nian);  
  647.                 Write_Ds1302(0x8E,0x80);   
  648.          
  649.         }
  650.       
  651.         if(set==8)
  652.         {   
  653.                 menue=2; //周调整  
  654.                 zhou=l_tmpdisplay[12];
  655.                 zhou=zhou+key_flag;  
  656.                 if(zhou>7)zhou=1;  
  657.                 if((key_flag<0)&&(zhou<1))zhou=7;  
  658.                 zhou=zhou%10+(zhou/10)*16;   
  659.                 Write_Ds1302(0x8E,0x00);  
  660.                 Write_Ds1302(0x8A,zhou);  
  661.                 Write_Ds1302(0x8E,0x80);      
  662.         }
  663.         if(set==9)
  664.         {   
  665.                 menue=3;   //温度调整
  666.                
  667.                 sdata=l_tmpdisplay[13]/10;
  668.                 sdata=l_tmpdisplay[14]%10;
  669.                 sdata=sdata+key_flag;                  
  670.                 sdata=sdata%10+(sdata/10)*16;                        
  671.         }   
  672.         key_flag=0;         
  673. }
  674. /******日期、时间、星期数据的转化****************/
  675. void data_change()
  676. {     
  677.         l_tmpdisplay[0]=l_tmpDate[6]/16;   
  678.         l_tmpdisplay[1]=l_tmpDate[6]%16;//年;     
  679.         l_tmpdisplay[2]=l_tmpDate[4]/16;   
  680.         l_tmpdisplay[3]=l_tmpDate[4]%16;//月;     
  681.         l_tmpdisplay[4]=l_tmpDate[3]/16;   
  682.         l_tmpdisplay[5]=l_tmpDate[3]%16;//日;     
  683.         l_tmpdisplay[6]=l_tmpDate[2]/16;   
  684.         l_tmpdisplay[7]=l_tmpDate[2]%16;//小时;     
  685.         l_tmpdisplay[8]=l_tmpDate[1]/16;   
  686.         l_tmpdisplay[9]=l_tmpDate[1]%16;//分钟;      
  687.         l_tmpdisplay[10]=l_tmpDate[0]/16;   
  688.         l_tmpdisplay[11]=l_tmpDate[0]%16;//秒钟;
  689.         l_tmpdisplay[12]=l_tmpDate[5]%16;//显示当前星期;
  690.       
  691.         l_tmpdisplay[13]=doe[1]/16;//温度十位;
  692.         l_tmpdisplay[14]=doe[2]%16;//温度个位;

  693. }

  694. /*******星期显示处理*******************/
  695. void week()
  696. {  
  697.         if(l_tmpdisplay[12]==1)  
  698.         {  
  699.                 writebyteshuzi(13);   
  700.                 writebytehanzi(7);  
  701.                 writebytehanzi(8);  
  702.                 writebytehanzi(0);   
  703.                 writebyteshuzi(13);   
  704.         }  
  705.         if(l_tmpdisplay[12]==2)  
  706.         {  
  707.                 writebyteshuzi(13);   
  708.                 writebytehanzi(7);  
  709.                 writebytehanzi(8);  
  710.                 writebytehanzi(1);
  711.                 writebyteshuzi(13);   
  712.         }   
  713.         if(l_tmpdisplay[12]==3)  
  714.         {   
  715.                 writebyteshuzi(13);   
  716.                 writebytehanzi(7);  
  717.                 writebytehanzi(8);  
  718.                 writebytehanzi(2);   
  719.                 writebyteshuzi(13);   
  720.         }
  721.         if(l_tmpdisplay[12]==4)  
  722.         {   
  723.                 writebyteshuzi(13);   
  724.                 writebytehanzi(7);  
  725.                 writebytehanzi(8);  
  726.                 writebytehanzi(3);
  727.                 writebyteshuzi(13);   
  728.         }   
  729.         if(l_tmpdisplay[12]==5)  
  730.         {   
  731.                 writebyteshuzi(13);   
  732.                 writebytehanzi(7);  
  733.                 writebytehanzi(8);  
  734.                 writebytehanzi(4);   
  735.                 writebyteshuzi(13);   
  736.         }
  737.         if(l_tmpdisplay[12]==6)  
  738.         {   
  739.                 writebyteshuzi(13);   
  740.                 writebytehanzi(7);  
  741.                 writebytehanzi(8);  
  742.                 writebytehanzi(5);   
  743.                 writebyteshuzi(13);  
  744.         }   
  745.         if(l_tmpdisplay[12]==7)  
  746.         {  
  747.                 writebyteshuzi(13);   
  748.                 writebytehanzi(7);  
  749.                 writebytehanzi(8);
  750.                 writebytehanzi(6);   
  751.                 writebyteshuzi(13);   
  752.         }
  753. }
  754. void shijian()
  755. {            
  756.         writebyteshuzi(l_tmpdisplay[6]); //时;     
  757.         writebyteshuzi(l_tmpdisplay[7]);
  758.         writebyteshuzi(11);   //显示分号  
  759.         writebyteshuzi(l_tmpdisplay[8]);     
  760.         writebyteshuzi(l_tmpdisplay[9]); //分;     
  761.         writebyteshuzi(11); //显示分号     
  762.         writebyteshuzi(l_tmpdisplay[10]);     
  763.         writebyteshuzi(l_tmpdisplay[11]);//秒;
  764. }
  765. void riqi()
  766. {   
  767.         writebyteshuzi(l_tmpdisplay[0]);   
  768.         writebyteshuzi(l_tmpdisplay[1]); //年;   
  769.         writebyteshuzi(10);    //显示横杠
  770.       
  771.         writebyteshuzi(l_tmpdisplay[2]);   
  772.         writebyteshuzi(l_tmpdisplay[3]); //月;   
  773.         writebyteshuzi(10);//显示横杠   
  774.         writebyteshuzi(l_tmpdisplay[4]);   
  775.         writebyteshuzi(l_tmpdisplay[5]); //日;
  776. }
  777. void wendu()
  778. {
  779.         writebyteshuzi(13);
  780.         writebytehanzi(9);  
  781.         writebytehanzi(10);
  782.         writebyteshuzi(11);

  783.         writebyteshuzi(l_tmpdisplay[13]); //温度
  784.         writebyteshuzi(l_tmpdisplay[14]);   

  785. }
  786. void main()
  787. {  
  788. //         Set_RTC();//对时(有备用电源对时一次就行)
  789.         ReadyReadTemp();//温度转换
  790.         wenduzhuan();      
  791.         menue=0;  
  792.         Write_Ds1302(0x8E,0x00);  
  793.         Write_Ds1302(0x90,0x80);  
  794.         Write_Ds1302(0x8E,0x80);  
  795.         while(1)  
  796.         {
  797.                 ReadyReadTemp();//温度转换
  798.                 wenduzhuan();
  799.                 key();   
  800.         //        for(num=0;num<16;num++)
  801.                 for(num=0;num<8;num++)   
  802.                 {   
  803.                        
  804.                         Read_RTC();//读取时钟   
  805.                         data_change();//时钟数据处理   
  806.                         set_date_time(); /////调时部分
  807.                        
  808.                         
  809.                         if(menue==0)   
  810.                         {
  811.                                 if(set==2)//调整标志位;     
  812.                                 {      
  813.                                 writebyteshuzi(l_tmpdisplay[6]); //时;      
  814.                                 writebyteshuzi(l_tmpdisplay[7]);
  815.                                 writebyteshuzi(11);   //数字数组的第11位置,是":"
  816.                                 writebyteshuzi(l_tmpdisplay[8]);      
  817.                                 writebyteshuzi(l_tmpdisplay[9]); //分;      
  818.                                 writebyteshuzi(11);      
  819.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16+8]));         
  820.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16+8]));     
  821.                                 }
  822.                                 else
  823.                                 if(set==3)     
  824.                                 {     
  825.                         //        writebyteshuzi(l_tmpdisplay[6]); //时;     
  826.                         //        writebyteshuzi(l_tmpdisplay[7]);     
  827.                         //        writebyteshuzi(11);     
  828.                         //        WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16+8]));     
  829.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16+8]));     
  830.                                 writebyteshuzi(11);     
  831.                                 writebyteshuzi(l_tmpdisplay[10]);     
  832.                                 writebyteshuzi(l_tmpdisplay[11]);//秒;     
  833.                                 }
  834.                         /*        else
  835.                                 if(set==4)     
  836.                                 {     
  837.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16+8]));     
  838.                                 WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16+8]));     
  839.                                 writebyteshuzi(11);     
  840.                                 writebyteshuzi(l_tmpdisplay[8]);     
  841.                                 writebyteshuzi(l_tmpdisplay[9]);//分;     
  842.                                 writebyteshuzi(11);     
  843.                                 writebyteshuzi(l_tmpdisplay[10]);     
  844.                                 writebyteshuzi(l_tmpdisplay[11]);//秒;     
  845.                                 } */   
  846.                                 else shijian();      
  847.                                 }
  848.                                 else
  849.                                 if(menue==1)     
  850.                                 {     
  851.                                         if(set==5) //日期调整标志位;     
  852.                                         {        
  853.                                         writebyteshuzi(l_tmpdisplay[0]); //年;      
  854.                                         writebyteshuzi(l_tmpdisplay[1]);      
  855.                                         writebyteshuzi(10);      
  856.                                         writebyteshuzi(l_tmpdisplay[2]);      
  857.                                         writebyteshuzi(l_tmpdisplay[3]); //月;
  858.                                         writebyteshuzi(10);      
  859.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16+8]));         
  860.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16+8])); //日;     
  861.                                         }     
  862.                                         else
  863.                                         if(set==6)     
  864.                                         {
  865.                         //                writebyteshuzi(l_tmpdisplay[0]); //年;   
  866.                         //                writebyteshuzi(l_tmpdisplay[1]);     
  867.                         //                writebyteshuzi(10);     
  868.                         //                WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16+8]));     
  869.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16+8]));//月;     
  870.                                         writebyteshuzi(10);     
  871.                                         writebyteshuzi(l_tmpdisplay[4]);     
  872.                                         writebyteshuzi(l_tmpdisplay[5]);//日;     
  873.                                         }     
  874.                                 /*        else
  875.                                         if(set==7)     
  876.                                         {
  877.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16+8]));     
  878.                                         WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16+8]));//年;     
  879.                                         writebyteshuzi(10);     
  880.                                         writebyteshuzi(l_tmpdisplay[2]);     
  881.                                         writebyteshuzi(l_tmpdisplay[3]);//月;     
  882.                                         writebyteshuzi(10);     
  883.                                         writebyteshuzi(l_tmpdisplay[4]);     
  884.                                         writebyteshuzi(l_tmpdisplay[5]);//日;      
  885.                                         }    */
  886.                                         else riqi();   
  887.                                 }   
  888.                                 else
  889.                                 if(menue==2)   
  890.                                 {     
  891.                                         week();   
  892.                                 }
  893.                                 else  
  894.                                 if(menue==3)   
  895.                                 {     
  896.                                            writebyteshuzi(13);
  897.                                         writebytehanzi(9);//温;                                 
  898.                                         writebytehanzi(10);//度?
  899.                                         writebyteshuzi(11);
  900.                                         writebyteshuzi(l_tmpdisplay[13]);
  901.                                         writebyteshuzi(l_tmpdisplay[14]);  
  902.                                        
  903.                                 }
  904.                               
  905.                               
  906.                                 else menue=0;   
  907.                                 if ((set<2)&&(menue==0))   
  908.                                 {     
  909.                                         if  ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>11)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<14))riqi();     
  910.                                         else
  911.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>26)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<29))week();
  912.                                         else
  913.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>41)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<44))riqi();     
  914.                                         else
  915.                                         if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>55)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<59))wendu();     
  916.                                         else shijian();        
  917.                                 }
  918.                                          
  919.                         //        P0=num;
  920.                                 OE=0;
  921.                                    STB=0;     //输出锁存
  922.                                 _nop_();      
  923.                                 STB=1;
  924.                                 OE=1;  
  925.                                 hangsao(num);
  926.                 }      
  927.         }
  928. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2024-5-24 14:51 | 显示全部楼层
先读通屏的使用手册,而后在依手册规则写程序,就可以了。
回复

使用道具 举报

ID:788390 发表于 2024-5-29 16:13 | 显示全部楼层
可以参考P10的驱动方法,实际也是595驱动点灯
回复

使用道具 举报

ID:619259 发表于 2024-5-30 22:41 | 显示全部楼层
LED点阵,数据传送一般为SPI总线方式和IIC总线方式,或专用芯片如MAX7221等。看电路上用的是什么芯片,按芯片时序编写相应的驱动程序,单片机IO口再传送数据就可以了。
回复

使用道具 举报

ID:619694 发表于 2024-6-2 12:38 | 显示全部楼层
就是跟8*8点阵屏幕一样用,就是这些锁存器有级联的情况,搞清楚原理图之后,写程序控制与单片机直接相连的锁存器,向下面的锁存器传数据就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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