一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
楼主: syj1975

请教大家一个数码管问题

  [复制链接]
发表于 2012-3-3 23:05 | 显示全部楼层

刚开了“LED照明技术交流区”版块

共阴的,数码之家发过,程序在这
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit led=P2^0;
  5. sbit CLK=P2^5;
  6. sbit IO=P2^6;
  7. sbit RST=P2^7;
  8. sbit ACC0=ACC^0;
  9. sbit ACC7=ACC^7;
  10. sbit key1=P2^1;
  11. sbit key2=P2^2;
  12. sbit gnd=P2^3;

  13. static uchar mode=0, set=0;
  14. unsigned char hour,sec,min,add,count,count1;
  15. bit flag;
  16. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0,0x76};
  17. void delay(unsigned int z)
  18. {
  19. unsigned int x,y;
  20. for(x=z;x>0;x--)
  21. for(y=125;y>0;y--);
  22. }
  23. void timer_init()
  24. {
  25. TMOD=0x11;
  26. TH0 =(65536-5000)/256;
  27. TL0=(65536-5000)%256;
  28. TH1=(65536-50000)/256;
  29. TL1=(65536-50000)%256;
  30. TH1 =0;
  31. TL1=0;
  32. EA=1;
  33. ET1=1;
  34. ET0=1;
  35. TR0=1;
  36. }

  37. void dis(unsigned char x,y)
  38. {
  39. static unsigned char i;
  40. unsigned char qian,bai,shi,ge;
  41. qian=x/16;
  42. bai=x%16;
  43. shi=y/16;
  44. ge=y%16;
  45. switch(i)
  46. {
  47. case 0: if(qian){P0=tab[qian]; P1=0xfe;}else{P0=tab[10];P1=0xfe;} break;
  48. case 1: P0=tab[bai]; P1=0xfd; break;
  49. case 2: P0=tab[shi]; P1=0xfb; break;
  50. case 3: P0=tab[ge]; P1=0xf7; break;
  51. }
  52. i++;
  53. if(i==4)i=0;

  54. }

  55. void inputbyte(uchar ucDa)
  56. {
  57. uchar i;
  58. ACC = ucDa;
  59. for(i=8; i>0; i--)
  60. {
  61. IO = ACC0; //相当于汇编中的 RRC
  62. CLK = 1;
  63. CLK = 0;
  64. ACC = ACC >> 1;
  65. }
  66. }
  67. /********************************************************************
  68. *
  69. * 名称: uchar uc_RToutputbyte
  70. * 说明:
  71. * 功能: 从DS1302读取1Byte数据
  72. * 调用:
  73. * 输入:
  74. * 返回值: ACC
  75. ***********************************************************************/
  76. uchar outputbyte(void)
  77. {
  78. uchar i;
  79. for(i=8; i>0; i--)
  80. {
  81. ACC = ACC >>1; //相当于汇编中的 RRC
  82. ACC7 = IO;
  83. CLK = 1;
  84. CLK = 0;
  85. }
  86. return(ACC);
  87. }
  88. /********************************************************************
  89. *
  90. * 名称: v_W1302
  91. * 说明: 先写地址,后写命令/数据
  92. * 功能: 往DS1302写入数据
  93. * 调用: v_RTinputbyte()
  94. * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
  95. * 返回值: 无
  96. ***********************************************************************/
  97. void write(uchar ucAddr, uchar ucDa)
  98. {
  99. RST = 0;
  100. CLK = 0;
  101. RST = 1;
  102. inputbyte(ucAddr); //地址,命令
  103. inputbyte(ucDa); //写1Byte数据
  104. CLK = 1;
  105. RST =0;
  106. }
  107. /********************************************************************
  108. *
  109. * 名称: uc_R1302
  110. * 说明: 先写地址,后读命令/数据
  111. * 功能: 读取DS1302某地址的数据
  112. * 调用: v_RTinputbyte() , uc_RToutputbyte()
  113. * 输入: ucAddr: DS1302地址
  114. * 返回值: ucDa :读取的数据
  115. ***********************************************************************/
  116. uchar read(uchar ucAddr)
  117. {
  118. uchar ucDa;
  119. RST = 0;
  120. CLK = 0;
  121. RST = 1;
  122. inputbyte(ucAddr); //地址,命令
  123. ucDa = outputbyte(); //读1Byte数据
  124. CLK = 1;
  125. RST =0;
  126. return(ucDa);
  127. }

  128. void DS1302_init()
  129. {
  130. if(read(0xc1)!=0x88) //2011/12/15 13:58:08
  131. {
  132. write(0x8e,0x00);//关闭写保护
  133. write(0x80,0x08); //设置秒
  134. write(0x82,0x58);//设置分钟
  135. write(0x84,0x13); // 小时
  136. write(0x8c,0x11);//年
  137. write(0x88,0x12);//月
  138. write(0x86,0x15);//日
  139. write(0x90,0xa5);//涓流充电
  140. write(0xc0,0x88);//标志位
  141. write(0x8e,0x80);//打开写保护
  142. }
  143. }
  144. void keyscan()
  145. {
  146. if(!key1||!key2)
  147. {
  148. delay(15);
  149. if(!key1)
  150. {
  151. delay(15);
  152. while(!key1);
  153. if(mode)write(0x8e,0x00);//关闭写保护
  154. switch(mode)
  155. {
  156. case 0:set++;if(set==3) set=0;break;
  157. case 1:add=(read(0x8d))/16*10+read(0x8d)%16; // 年
  158. add++;if(add==21)add=11,set=0;
  159. write(0x8c,(add/10)*16+add%10);break;
  160. case 2:add=(read(0x89)/16)*10+read(0x89)%16; //月
  161. add++;if(add==13)add=1;
  162. write(0x88,(add/10)*16+add%10);break;
  163. case 3:add=(read(0x87)/16)*10+read(0x87)%16; //日
  164. add++;if(add==32)add=1;
  165. write(0x86,(add/10)*16+add%10);break;
  166. case 4:add=(read(0x85)/16)*10+read(0x85)%16; //时
  167. add++;if(add>=24)add=0;
  168. write(0x84,(add/10)*16+add%10);break;
  169. case 5:add=(read(0x83)/16)*10+read(0x83)%16; //分
  170. add++;if(add==60)add=0;
  171. write(0x82,(add/10)*16+add%10);break;

  172. }
  173. write(0x8e,0x80);//打开写保护
  174. }

  175. if(!key2)
  176. {
  177. delay(15);
  178. while(!key2);
  179. if(set==2)
  180. {
  181. write(0x8e,0x00);//关闭写保护
  182. write(0x80,0x00);
  183. write(0x8e,0x80);//打开写保护
  184. }
  185. else{mode++; if(mode==6) mode=0;}
  186. }

  187. }


  188. }
  189. void key_init()
  190. {
  191. gnd=0;
  192. key1=1;
  193. key2=1;
  194. }
  195. void main()
  196. {

  197. timer_init();
  198. DS1302_init();
  199. key_init();
  200. while(1)
  201. {

  202. if(flag)
  203. {
  204. flag=0;
  205. switch(mode)
  206. {
  207. case 0:
  208. switch(set)
  209. {
  210. case 0: dis(read(0x85),read(0x83));
  211. if(count>=100){count=0;count1=0;TR1=0;led=!led;}
  212. break;
  213. case 1: dis(read(0x89),read(0x87));
  214. led=1;
  215. TR1=1;
  216. if(count1>=60) set=0;
  217. break;
  218. case 2: dis(0xaa,read(0x81));
  219. led=0;
  220. count1=0;TR1=0;
  221. break;
  222. }
  223. break;
  224. case 1:dis(0x20,read(0x8d));led=1;break;
  225. case 2:dis(read(0x89),0xaa);led=1;break;
  226. case 3:dis(0xaa,read(0x87));led=1;break;
  227. case 4:dis(read(0x85),0xab);led=0;break;
  228. case 5:dis(0xaa,read(0x83));led=0;break;
  229. }


  230. }
  231. keyscan();
  232. }
  233. }

  234. void timer() interrupt 1
  235. {
  236. TH0=(65536-5000)/256;
  237. TL0=(65536-5000)%256;
  238. flag=1;
  239. count++;

  240. }
  241. void timer1() interrupt 3
  242. {
  243. TH1=(65536-50000)/256;
  244. TL1=(65536-50000)%256;
  245. count1++;
  246. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2012-3-3 23:07 | 显示全部楼层
明白了,谢谢楼上
回复

使用道具 举报

发表于 2012-3-3 23:18 | 显示全部楼层
位选没有驱动,51的灌电流可以点亮LED,所以位选是低电平点亮,应该是共阴的!
回复

使用道具 举报

发表于 2012-3-3 23:19 | 显示全部楼层
回复 12# syj1975


   端口好象我改过,你要重新对号入座
回复

使用道具 举报

 楼主| 发表于 2012-3-3 23:21 | 显示全部楼层
端口好象我改过,你要重新对号入座
mydei 发表于 2012-3-3 23:19 https://www.yleee.com.cn/images/common/back.gif[/quote]
好的,谢谢提醒
回复

使用道具 举报

 楼主| 发表于 2012-3-4 10:32 | 显示全部楼层
共阴的,数码之家发过,程序在这
mydei 发表于 2012-3-3 23:05 https://www.yleee.com.cn/images/common/back.gif



请帮忙,我有一个4位共阳数码管,能不能将此程序改为驱动共阳数码管的,谢谢
回复

使用道具 举报

发表于 2012-3-4 14:28 | 显示全部楼层
回复 16# syj1975


    全论坛最不会程序的人是我,找高手去了,我只会改改端口,找高手吧
回复

使用道具 举报

 楼主| 发表于 2012-3-4 15:29 | 显示全部楼层
高手帮忙改改吧,最近对此非常有兴趣!!
回复

使用道具 举报

发表于 2012-3-4 15:59 | 显示全部楼层
想改共阳的话需要改电路,加一极三极管驱动,然后段码取反。
回复

使用道具 举报

发表于 2012-3-4 20:58 | 显示全部楼层
请帮忙,我有一个4位共阳数码管,能不能将此程序改为驱动共阳数码管的,谢谢
syj1975 发表于 2012-3-4 10:32 https://www.yleee.com.cn/images/common/back.gif



    如果非要用共阳数码管,段输出要用8只9014三极管反相驱动,位输出用4只9012驱动,其他部分不用动。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-15 14:52 , Processed in 0.030739 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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