[求助] stm8

chaolei0922   2015-7-4 10:42 楼主
悬赏 10 分 芯积分未解决

回复评论 (5)

stm8s003f3 对DS1302 读取总是85  已加上拉电阻10K  求指导
点赞  2015-7-4 10:44
/* MAIN.C file  *   * Copyright (c) 2002-2005 STMicroelectronics  */ #include // - - 定义函数 #define BIAS   0x52            //0b1000 0101 0010  1/3duty 4com #define SYSDIS 0X00           //0b1000 0000 0000  关振系统荡器和LCD偏压发生器 #define SYSEN  0X02           //0b1000 0000 0010 打开系统振荡器 #define LCDOFF 0X04           //0b1000 0000 0100  关LCD偏压 #define LCDON  0X06           //0b1000 0000 0110  打开LCD偏压 #define XTAL   0x28           //0b1000 0010 1000 外部接时钟 #define RC256  0X30           //0b1000 0011 0000  内部时钟 #define TONEON  0X12           //0b1000 0001 0010  打开声音输出 #define TONEOFF 0X10           //0b1000 0001 0000 关闭声音输出 #define WDTDIS  0X0A        //0b1000 0000 1010  禁止看门狗 #define WDTDIS  0X0A  unsigned int b,v,v1,i,miao,fen,shi,e,f,yu; unsigned char m,n,m1,n1,miaodian; unsigned int flag,year,month,day,hour,min,a,keytime,set; unsigned char  Ht1621wTab[]={0x0b,0x00,0x07,0x05,0x0c,0x0d,0x0f,0x00,0x0f,0x0d};        //seg 16 unsigned char  Ht1621cTab[]={0x0f,0x07,0x0d,0x0f,0x07,0x0b,0x0b,0x0f,0x0f,0x0f};  //seg 17 unsigned char  Ht1621dTab[]={0x0e,0x06,0x0c,0x0e,0x06,0x0a,0x0a,0x0e,0x0e,0x0e};  //seg 17   unsigned char  Ht1621eTab[]={0x00,0x0a,0x0d,0x0e};   _Bool CS @PC_ODR:5; _Bool WR @PC_ODR:6; _Bool DAT @PC_ODR:7; _Bool SCLK @PD_ODR:4; _Bool SDA @PD_ODR:5; _Bool RST @PD_ODR:6; _Bool k1 @PB_IDR:4; _Bool k2 @PC_IDR:3; _Bool k3 @PC_IDR:4; //HT1621控制位(液晶模块接口定义,根据自已的需要更改) #define CLS_HT_WR      WR = 0   //拉低 #define SET_HT_WR      WR = 1   //拉高 #define CLS_HT_CS      CS = 0   //拉低 #define SET_HT_CS      CS = 1   //拉高   #define SET_HT_DAT     DAT= 1   //数据位 #define CLS_HT_DAT     DAT = 0   //数据位 //GPIO口设置 void port_init(void) { PB_DDR |= 0x20; PB_CR1 |= 0x20; PB_CR2 |= 0x00; PD_DDR |= 0x74; PD_CR1 |= 0x04; PD_CR2 |= 0x00; PC_DDR |= 0xe0; PC_CR1 |= 0xe0; PC_CR2 |= 0x00; }  void Init(void) {  //  CLK_ICKR |= 0x01;                 //打开内部高速RC    //CLK_CKDIVR = 0x10;                //HSI--4MHZ          CLK_CKDIVR = 0x00; } //----------------------------------------------------------------------------------------- //函数名称:Delay() //功 能:延时子程序 //----------------------------------------------------------------------------------------- void Delay(char us) //5,7,9  {  while(--us);  }  //----------------------------------------------------------------------------------------- //函数名称:DelayMS() //功 能:延时子程序 //----------------------------------------------------------------------------------------- void DelayMS(int iMs)  {  int i,j;  for(i=0;i>=1;                         } } void write(unsigned char adress,unsigned char dat) {                 RST=0;                 SCLK=0;                  RST=1;                 Delay(20);                  writebyb(adress);                 writebyb(dat);                 SCLK=1;                 RST=0; } unsigned char readbybe(void) {         unsigned i,dat;         Delay(2);         for(i=0;i<8;i++)                 {                         dat>>=1;                         if(SDA==1)                         {                         dat|=0x80;                 }                 else         {                 dat&=0x7f;         }                         SCLK=1;                         Delay(5);                         SCLK=0;                         Delay(5);                 }                 return dat; } unsigned char read(unsigned char adress) {         unsigned char temp;         RST=0;         SCLK=0;         RST=1;         Delay(1);          writebyb(adress);         temp=readbybe();                 SCLK=1;                 RST=0;                 SDA=0;                 return temp; } void ds1302(void) {         write(0x8e,0x00);         write(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值         write(0x82,((0/10)<<4|(0%10)));   //根据写分寄存器命令字,写入分的初始值         write(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值         write(0x86,((16/10)<<4|(16%10))); //根据写日寄存器命令字,写入日的初始值         write(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值         write(0x8c,((8/10)<<4|(8%10)));   //根据写小时寄存器命令字,写入小时的初始值         write(0x8e,0x80); } void settime(void) {                 unsigned char ReadValue;          ReadValue = read(0x81);   //从秒寄存器读数据      miao=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化            ReadValue = read(0x83);  //从分寄存器读      min=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化      ReadValue = read(0x85);  //从分寄存器读      hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化      ReadValue = read(0x87);  //从分寄存器读      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化    ReadValue = read(0x89);  //从分寄存器读      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化    ReadValue = read(0x8d);  //从分寄存器读      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化 } //----------------------------------------------------------------------------------------- //函数名称:Ht1621Wr_Data()  //功 能:写数据函数,cnt为传送数据位数,数据传送为低位在前  //----------------------------------------------------------------------------------------- void Ht1621Wr_Data(char Data,char cnt)  {  char i;  for (i=0;i
点赞  2015-7-4 10:44
  1. /* MAIN.C file
  2. *
  3. * Copyright (c) 2002-2005 STMicroelectronics
  4. */
  5. #include <stm8s003f3.h>
  6. // - - 定义函数
  7. #define BIAS   0x52            //0b1000 0101 0010  1/3duty 4com
  8. #define SYSDIS 0X00           //0b1000 0000 0000  关振系统荡器和LCD偏压发生器
  9. #define SYSEN  0X02           //0b1000 0000 0010 打开系统振荡器
  10. #define LCDOFF 0X04           //0b1000 0000 0100  关LCD偏压
  11. #define LCDON  0X06           //0b1000 0000 0110  打开LCD偏压
  12. #define XTAL   0x28           //0b1000 0010 1000 外部接时钟
  13. #define RC256  0X30           //0b1000 0011 0000  内部时钟
  14. #define TONEON  0X12           //0b1000 0001 0010  打开声音输出
  15. #define TONEOFF 0X10           //0b1000 0001 0000 关闭声音输出
  16. #define WDTDIS  0X0A        //0b1000 0000 1010  禁止看门狗
  17. #define WDTDIS  0X0A
  18. unsigned int b,v,v1,i,miao,fen,shi,e,f,yu;
  19. unsigned char m,n,m1,n1,miaodian;
  20. unsigned int flag,year,month,day,hour,min,a,keytime,set;
  21. unsigned char
  22. Ht1621wTab[]={0x0b,0x00,0x07,0x05,0x0c,0x0d,0x0f,0x00,0x0f,0x0d};        //seg 16
  23. unsigned char
  24. Ht1621cTab[]={0x0f,0x07,0x0d,0x0f,0x07,0x0b,0x0b,0x0f,0x0f,0x0f};  //seg 17
  25. unsigned char
  26. Ht1621dTab[]={0x0e,0x06,0x0c,0x0e,0x06,0x0a,0x0a,0x0e,0x0e,0x0e};  //seg 17  
  27. unsigned char
  28. Ht1621eTab[]={0x00,0x0a,0x0d,0x0e};

  29. _Bool CS @PC_ODR:5;
  30. _Bool WR @PC_ODR:6;
  31. _Bool DAT @PC_ODR:7;
  32. _Bool SCLK @PD_ODR:4;
  33. _Bool SDA @PD_ODR:5;
  34. _Bool RST @PD_ODR:6;
  35. _Bool k1 @PB_IDR:4;
  36. _Bool k2 @PC_IDR:3;
  37. _Bool k3 @PC_IDR:4;
  38. //HT1621控制位(液晶模块接口定义,根据自已的需要更改)
  39. #define CLS_HT_WR      WR = 0   //拉低
  40. #define SET_HT_WR      WR = 1   //拉高
  41. #define CLS_HT_CS      CS = 0   //拉低
  42. #define SET_HT_CS      CS = 1   //拉高  
  43. #define SET_HT_DAT     DAT= 1   //数据位
  44. #define CLS_HT_DAT     DAT = 0   //数据位
  45. //GPIO口设置
  46. void port_init(void)
  47. {
  48. PB_DDR |= 0x20;
  49. PB_CR1 |= 0x20;
  50. PB_CR2 |= 0x00;
  51. PD_DDR |= 0x74;
  52. PD_CR1 |= 0x04;
  53. PD_CR2 |= 0x00;
  54. PC_DDR |= 0xe0;
  55. PC_CR1 |= 0xe0;
  56. PC_CR2 |= 0x00;
  57. }

  58. void Init(void)
  59. {
  60. //  CLK_ICKR |= 0x01;                 //打开内部高速RC
  61.    //CLK_CKDIVR = 0x10;                //HSI--4MHZ
  62.          CLK_CKDIVR = 0x00;
  63. }
  64. //-----------------------------------------------------------------------------------------
  65. //函数名称:Delay()
  66. //功 能:延时子程序
  67. //-----------------------------------------------------------------------------------------
  68. void Delay(char us) //5,7,9
  69. {
  70. while(--us);
  71. }
  72. //-----------------------------------------------------------------------------------------
  73. //函数名称:DelayMS()
  74. //功 能:延时子程序
  75. //-----------------------------------------------------------------------------------------
  76. void DelayMS(int iMs)
  77. {
  78. int i,j;
  79. for(i=0;i<iMs;i++)
  80. for(j=0;j<65;j++)
  81. {
  82. Delay(1);
  83. }
  84. }
  85. void writebyb(unsigned char temp)
  86. {
  87.                 unsigned char i;
  88.                 SCLK=0;
  89.                 Delay(20);
  90.                 for(i=0;i<8;i++)
  91.                         {
  92.                                 SDA=temp&0x01;
  93.                                 Delay(5);
  94.                                 SCLK=1;
  95.                                 Delay(5);
  96.                                 SCLK=0;
  97.                                 temp>>=1;
  98.                         }
  99. }
  100. void write(unsigned char adress,unsigned char dat)
  101. {
  102.                 RST=0;
  103.                 SCLK=0;
  104.                 RST=1;
  105.                 Delay(20);
  106.                 writebyb(adress);
  107.                 writebyb(dat);
  108.                 SCLK=1;
  109.                 RST=0;
  110. }
  111. unsigned char readbybe(void)
  112. {
  113.         unsigned i,dat;
  114.         Delay(2);
  115.         for(i=0;i<8;i++)
  116.                 {
  117.                         dat>>=1;
  118.                         if(SDA==1)
  119.                         {
  120.                         dat|=0x80;
  121.                 }
  122.                 else
  123.         {
  124.                 dat&=0x7f;
  125.         }
  126.                         SCLK=1;
  127.                         Delay(5);
  128.                         SCLK=0;
  129.                         Delay(5);
  130.                 }
  131.                 return dat;
  132. }
  133. unsigned char read(unsigned char adress)
  134. {
  135.         unsigned char temp;
  136.         RST=0;
  137.         SCLK=0;
  138.         RST=1;
  139.         Delay(1);
  140.         writebyb(adress);
  141.         temp=readbybe();
  142.                 SCLK=1;
  143.                 RST=0;
  144.                 SDA=0;
  145.                 return temp;
  146. }
  147. void ds1302(void)
  148. {
  149.         write(0x8e,0x00);
  150.         write(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
  151.         write(0x82,((0/10)<<4|(0%10)));   //根据写分寄存器命令字,写入分的初始值
  152.         write(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值
  153.         write(0x86,((16/10)<<4|(16%10))); //根据写日寄存器命令字,写入日的初始值
  154.         write(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值
  155.         write(0x8c,((8/10)<<4|(8%10)));   //根据写小时寄存器命令字,写入小时的初始值
  156.         write(0x8e,0x80);
  157. }
  158. void settime(void)
  159. {
  160.                 unsigned char ReadValue;
  161.          ReadValue = read(0x81);   //从秒寄存器读数据
  162.      miao=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化        
  163.    ReadValue = read(0x83);  //从分寄存器读
  164.      min=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  165.      ReadValue = read(0x85);  //从分寄存器读
  166.      hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  167.      ReadValue = read(0x87);  //从分寄存器读
  168.      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  169.    ReadValue = read(0x89);  //从分寄存器读
  170.      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  171.    ReadValue = read(0x8d);  //从分寄存器读
  172.      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  173. }
  174. //-----------------------------------------------------------------------------------------
  175. //函数名称:Ht1621Wr_Data()
  176. //功 能:写数据函数,cnt为传送数据位数,数据传送为低位在前
  177. //-----------------------------------------------------------------------------------------
  178. void Ht1621Wr_Data(char Data,char cnt)
  179. {
  180. char i;
  181. for (i=0;i<cnt;i++)
  182. {
  183. CLS_HT_WR; //HT1621_WR=0;
  184. Delay(1);
  185. if((Data & 0x80)==0x80)
  186. {
  187. SET_HT_DAT; //HT1621_DAT=1;
  188. }
  189. else
  190. {
  191. CLS_HT_DAT; //HT1621_DAT=0;
  192. }
  193. SET_HT_WR; //HT1621_WR=1;
  194. Delay(1);
  195. Data<<=1;
  196. }
  197. }
  198. //----------------------------------------------------------
  199. //函数名称:void Ht1621WrOneData(uchar Addr,uchar Data)
  200. //功能描述: HT1621在指定地址写入数据函数
  201. //参数说明:Addr为写入初始地址,Data为写入数据
  202. //说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后
  203. //----------------------------------------------------------
  204. void Ht1621WrOneData(char Addr,char Data)
  205. {
  206. CLS_HT_CS; //HT1621_CS=0;
  207. Ht1621Wr_Data(0xa0,3); //写入数据标志101
  208. Ht1621Wr_Data(Addr<<2,6); //写入地址数据
  209. Ht1621Wr_Data(Data<<4,4); //写入数据
  210. SET_HT_CS;//HT1621_CS=1;
  211. }
  212. //-----------------------------------------------------------------------------------------
  213. //函数名称:void Ht1621WrAllData()
  214. //功能描述: HT1621连续写入方式函数
  215. //说 明:HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算
  216. //-----------------------------------------------------------------------------------------
  217. void Ht1621WrAllData(void)
  218. {
  219. char i;
  220. CLS_HT_CS;//HT1621_CS=0;
  221. Ht1621Wr_Data(0xa0,3); //写入数据标志101
  222. Ht1621Wr_Data(0x00<<2,6); //写入地址数据
  223. for (i=0;i<16;i++)
  224. {
  225. Ht1621Wr_Data(0x00,8); //写入数据
  226. }
  227. SET_HT_CS;//HT1621_CS=1;
  228. }
  229. //-----------------------------------------------------------------------------------------
  230. //函数名称:void Ht1621WrCmd(uchar Cmd)
  231. //功能描述: HT1621命令写入函数
  232. //参数说明:Cmd为写入命令数据
  233. //说 明:写入命令标识位100
  234. //-----------------------------------------------------------------------------------------
  235. void Ht1621WrCmd(char Cmd)
  236. {
  237. CLS_HT_CS;//HT1621_CS=0;
  238. Delay(1);
  239. Ht1621Wr_Data(0x80,4); //写入命令标志100
  240. Ht1621Wr_Data(Cmd,8); //写入命令数据
  241. SET_HT_CS;//HT1621_CS=1;
  242. }
  243. //-----------------------------------------------------------------------------------------
  244. //函数名称:void Ht1621_Init(void)
  245. //功能描述: HT1621初始化
  246. //说 明:初始化后,液晶屏所有字段均显示
  247. //-----------------------------------------------------------------------------------------
  248. void Ht1621_Init(void)
  249. {
  250. SET_HT_CS;//HT1621_CS=1;
  251. SET_HT_WR;//HT1621_WR=1;
  252. SET_HT_DAT;//HT1621_DAT=1;
  253. DelayMS(20); //延时使LCD工作电压稳定
  254. Ht1621WrCmd(BIAS);
  255. Ht1621WrCmd(RC256); //使用内部振荡器
  256. Ht1621WrCmd(SYSDIS);
  257. Ht1621WrCmd(WDTDIS);
  258. Ht1621WrCmd(SYSEN);
  259. Ht1621WrCmd(LCDON);
  260. Ht1621WrCmd(TONEON);
  261. Ht1621WrCmd(TONEOFF);
  262. }
  263. void dispaytemp(int a)
  264. {
  265.         int ge,shi,bai;
  266.         bai=a/100;
  267.         shi=(a-bai*100)/10;
  268.         ge=a%10;
  269.         Ht1621WrOneData(0x16,Ht1621wTab[bai]);
  270.         Ht1621WrOneData(0x15,Ht1621cTab[bai]);
  271.         Ht1621WrOneData(0x14,Ht1621wTab[shi]);
  272.         Ht1621WrOneData(0x13,Ht1621cTab[shi]);
  273.         Ht1621WrOneData(0x12,Ht1621wTab[ge]);
  274.         Ht1621WrOneData(0x11,Ht1621cTab[ge]);
  275. }
  276. void dispaytime(int b)
  277. {
  278.         int fge,fshi,sge,sshi;
  279.         fshi=b/10;
  280.         fge=b%10;
  281.         Ht1621WrOneData(0x08,Ht1621cTab[fge]);
  282.         Ht1621WrOneData(0x09,Ht1621wTab[fge]);
  283.         Ht1621WrOneData(0x0a,Ht1621dTab[fshi]);
  284.         Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
  285. }
  286. void dispaytime2(int c,int d)
  287. {
  288.         int fge,fshi,sge,sshi;
  289.         fshi=d/10;
  290.         fge=d%10;
  291.         sshi=c/10;
  292.         sge=c%10;
  293.         Ht1621WrOneData(0x08,Ht1621cTab[fge]);
  294.         Ht1621WrOneData(0x09,Ht1621wTab[fge]);
  295.         Ht1621WrOneData(0x0a,Ht1621cTab[fshi]);
  296.         Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
  297.         Ht1621WrOneData(0x0c,Ht1621cTab[sge]);
  298.         Ht1621WrOneData(0x0d,Ht1621wTab[sge]);
  299.         Ht1621WrOneData(0x0e,Ht1621eTab[sshi]);
  300. }
  301. void dispaynian(int nian,int yue,int ri)
  302. {
  303.         int niange,nianshi,rige,rishi,yueshi,yuege;
  304.         nianshi=nian/10;
  305.         niange=nian%10;
  306.         yueshi=yue/10;
  307.         yuege=yue%10;
  308.         rishi=ri/10;
  309.         rige=ri%10;
  310.         Ht1621WrOneData(0x1e,Ht1621cTab[nianshi]);
  311.         Ht1621WrOneData(0x1f,Ht1621wTab[nianshi]);
  312.         Ht1621WrOneData(0x1c,Ht1621cTab[niange]);
  313.         Ht1621WrOneData(0x1d,Ht1621wTab[niange]);
  314.         Ht1621WrOneData(0x19,Ht1621eTab[rishi]);
  315.         Ht1621WrOneData(0x17,Ht1621cTab[rige]);
  316.         Ht1621WrOneData(0x18,Ht1621wTab[rige]);
  317.         if(yueshi==1)
  318.         {
  319.                         Ht1621WrOneData(0x1a,Ht1621cTab[yuege]);
  320.                         Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
  321.         }
  322.         else
  323.         {
  324.                         Ht1621WrOneData(0x1a,Ht1621dTab[yuege]);
  325.                         Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
  326.         }
  327. }
  328. void CLK_Init(void)
  329. {
  330.         CLK_CKDIVR = 0x00;
  331. }
  332. void di(void)//蜂鸣器
  333. {
  334.         Ht1621WrCmd(TONEON);
  335.         DelayMS(2000);
  336.         Ht1621WrCmd(TONEOFF);
  337. }
  338. void TIM1_Init(void)
  339. {
  340.         TIM1_CR1 = 0x00;  //向上的计数方向,中断计数不停
  341.         TIM1_IER = 0x01;
  342.         TIM1_PSCRH = 0x3e;  //进行16000分频
  343.         TIM1_PSCRL = 0x80;
  344.         TIM1_ARRH = 0x01;
  345.         TIM1_ARRL = 0xf4;
  346.         TIM1_CR1 |=0x01;
  347. }
  348. /*void TIM2_Init(void)
  349. {
  350.   TIM2_IER  = 0x00;  //禁止中断
  351.   TIM2_EGR  =0x01;   //允许产生更新标志
  352.   TIM2_PSCR =0x01;   //设置时钟分频 2M/2=1MHz---1us
  353.   TIM2_ARRH = 0x00;  //0x32=50;  周期=50次,每50us复位一次定时器2
  354.   TIM2_ARRL = 0x32;  //ARR自动装载值,每1us递减1         
  355.   TIM2_CNTRH=0x00;   //初值
  356.   TIM2_CNTRL=0x00;
  357.   TIM2_CR1 |= 0x81;  //开启定时器
  358.   TIM2_IER |= 0x01;  //允许中断
  359. }*/
  360. void ADC_Init(void)
  361. {
  362.         ADC_CSR|= 0x04;
  363.         ADC_CR1 = 0x00;
  364.         ADC_CR2 = 0x30;
  365. }
  366. void ht1621d(void)
  367. {
  368.         /*        if(yu==0)
  369.                 {
  370.                 Ht1621WrOneData(0x07,0x03);
  371.                 Ht1621WrOneData(0x10,0x01);
  372.                 Ht1621WrOneData(0x0f,0x01);
  373.         }*/
  374.                         if(yu==2)
  375.                 {
  376.                 Ht1621WrOneData(0x07,0x07);
  377.                 Ht1621WrOneData(0x10,0x01);
  378.                 Ht1621WrOneData(0x0f,0x01);
  379.         }
  380.         /*                if(yu==4)
  381.                 {
  382.                 Ht1621WrOneData(0x07,0x0f);
  383.                 Ht1621WrOneData(0x10,0x01);
  384.                 Ht1621WrOneData(0x0f,0x01);
  385.         }*/
  386.                         if(yu==4)
  387.                 {
  388.                 Ht1621WrOneData(0x07,0x0f);
  389.                 Ht1621WrOneData(0x10,0x01);
  390.                 Ht1621WrOneData(0x0f,0x09);
  391.         }
  392.                 /*        if(yu==8)
  393.                 {
  394.                 Ht1621WrOneData(0x07,0x0f);
  395.                 Ht1621WrOneData(0x10,0x01);
  396.                 Ht1621WrOneData(0x0f,0x0d);
  397.         }*/
  398.                         if(yu==6)
  399.                 {
  400.                 Ht1621WrOneData(0x07,0x0f);
  401.                 Ht1621WrOneData(0x10,0x01);
  402.                 Ht1621WrOneData(0x0f,0x0f);
  403.         }
  404.         /*                if(yu==12)
  405.                 {
  406.                 Ht1621WrOneData(0x07,0x0f);
  407.                 Ht1621WrOneData(0x10,0x05);
  408.                 Ht1621WrOneData(0x0f,0x0f);
  409.         }
  410.                         if(yu==14)
  411.                 {
  412.                 Ht1621WrOneData(0x07,0x0f);
  413.                 Ht1621WrOneData(0x10,0x0d);
  414.                 Ht1621WrOneData(0x0f,0x0f);
  415.         }*/
  416.                         if(yu==8)
  417.                 {
  418.                 Ht1621WrOneData(0x07,0x0f);
  419.                 Ht1621WrOneData(0x10,0x0f);
  420.                 Ht1621WrOneData(0x0f,0x0f);
  421.         }
  422.         }
  423. unsigned int monday(unsigned year1,unsigned month1)  
  424.         {
  425.                 switch(month1)//根据月年计算日子
  426.                         {
  427.                                 case 1:
  428.                                 case 3:
  429.                                 case 5:
  430.                                 case 7:
  431.                                 case 8:
  432.                                 case 10:
  433.                                 case 12:return 31;
  434.                                 case 4:
  435.                                 case 6:
  436.                                 case 9:
  437.                                 case 11:return 30;
  438.                                 case 2:if(year%4==0&&year%100!=0||year%400==0)
  439.                                                                 return 29;
  440.                                                                 else
  441.                                                                 return 28;
  442.                                                                 default:
  443.                                                                 return 0;
  444.                         }
  445.         }
  446. void key(void)
  447. {
  448.         if(k3==0)
  449.                 DelayMS(10);
  450.                 if(k3==0)
  451.                 {       
  452.                         di();
  453.                 //        while(!k3);
  454.                         flag++;
  455.                         keytime=0;
  456.                         if(flag==7)
  457.                 {
  458.                         flag=1;
  459.                 }
  460.                 }
  461.                         switch(flag)
  462.                         {
  463.                                 case 1:if(set==0)
  464.                         {
  465.                         Ht1621WrOneData(0x1e,0x01);
  466.                         Ht1621WrOneData(0x1f,0x00);
  467.                         Ht1621WrOneData(0x1c,0x01);
  468.                         Ht1621WrOneData(0x1d,0x00);
  469.                                         if(keytime==20)
  470.                                                 {
  471.                                                         flag=6;
  472.                                                 }
  473.                         }
  474.                                 if(k1==0)
  475.                                 {
  476.                                         DelayMS(10);
  477.                                         if(k1==0)
  478.                                         {
  479.                                                 di();
  480.                                                 keytime=0;
  481.                         //                        while(!k1);
  482.                                                 year++;

  483.                                                 if(year==99)
  484.                                                 {
  485.                                                         year=0;
  486.                                                
  487.                                                 }
  488.                                         }
  489.                                 }
  490.                                 if(k2==0)
  491.                                 {
  492.                                         DelayMS(10);
  493.                                         if(k2==0)
  494.                                         {
  495.                                                 di();
  496.                                                 keytime=0;
  497.                                 //                while(!k2);
  498.                                                 year--;
  499.                                        
  500.                                        
  501.                                        
  502.                                                 if(year==0)
  503.                                                 {
  504.                                                         year=99;
  505.                                                        
  506.                                                        
  507.                                        
  508.                                                 }
  509.                                         }
  510.                                 }
  511.                                 break;
  512.                                 case 2:if(set==0)
  513.                         {
  514.                         Ht1621WrOneData(0x1a,0x00);
  515.                         Ht1621WrOneData(0x1b,0x00);
  516.                                                                 if(keytime==20)
  517.                                                 {
  518.                                                         flag=6;
  519.                                                 }
  520.                         }
  521.                                 if(k1==0)
  522.                                 {
  523.                                         DelayMS(10);
  524.                                         if(k1==0)
  525.                                         {
  526.                                                 di();
  527.                                                 keytime=0;
  528.                                 //                while(!k1);
  529.                                                 month++;
  530.                                        
  531.                                                 if(month==13)
  532.                                                 {
  533.                                                         month=1;
  534.                                                
  535.                                                 }
  536.                                         }
  537.                                 }
  538.                                 if(k2==0)
  539.                                 {
  540.                                         DelayMS(10);
  541.                                         if(k2==0)
  542.                                         {
  543.                                                 di();
  544.                                                 keytime=0;
  545.                                         //        while(!k2);
  546.                                                 month--;
  547.                                        
  548.                                                 if(month==0)
  549.                                                 {
  550.                                                         month=12;
  551.                                                        
  552.                                                 }
  553.                                         }
  554.                                 }
  555.                                 break;
  556.                                 case 3:if(set==0)
  557.                         {
  558.                                 Ht1621WrOneData(0x19,0x00);
  559.                                 Ht1621WrOneData(0x17,0x00);
  560.                                 Ht1621WrOneData(0x18,0x00);
  561.                                                                         if(keytime==20)
  562.                                                 {
  563.                                                         flag=6;
  564.                                                 }
  565.                         }
  566.                                 if(k1==0)
  567.                                 {
  568.                                         DelayMS(10);
  569.                                         if(k1==0)
  570.                                         {
  571.                                                 di();
  572.                                                 keytime=0;
  573.                                         //        while(!k1);
  574.                                                 a=monday(year,month);
  575.                                                 a=a+1;
  576.                                                 day++;
  577.                                
  578.                                                 if(day==a)
  579.                                                 {
  580.                                                         day=1;
  581.                                
  582.                                                 }
  583.                                         }
  584.                                 }
  585.                                 if(k2==0)
  586.                                 {
  587.                                         DelayMS(10);
  588.                                         if(k2==0)
  589.                                         {
  590.                                                 di();
  591.                                                 keytime=0;
  592.                                         //        while(!k2);
  593.                                                 a=monday(year,month);
  594.                                                 day--;
  595.                                                
  596.                                                 if(day==0)
  597.                                                 {
  598.                                                         day=a;
  599.                                                        
  600.                                                 }
  601.                                         }
  602.                                 }
  603.                                 break;
  604.                                 case 4:if(set==0)
  605.                         {
  606.         Ht1621WrOneData(0x0c,0x01);
  607.         Ht1621WrOneData(0x0d,0x00);
  608.         Ht1621WrOneData(0x0e,0x00);
  609.                                                 if(keytime==20)
  610.                                                 {
  611.                                                         flag=6;
  612.                                                 }
  613.                         }if(k1==0)
  614.                                 {
  615.                                         DelayMS(10);
  616.                                         if(k1==0)
  617.                                         {
  618.                                                 di();
  619.                                                 keytime=0;
  620.                                         //        while(!k1);
  621.                                                 hour++;
  622.                                        
  623.                                                 if(hour==24)
  624.                                                 {
  625.                                                         hour=0;
  626.                                
  627.                                                 }
  628.                                         }
  629.                                 }
  630.                                 if(k2==0)
  631.                                 {
  632.                                         DelayMS(10);
  633.                                         if(k2==0)
  634.                                         {
  635.                                                 di();
  636.                                                 keytime=0;
  637.                                 //                while(!k2);
  638.                                                 hour--;
  639.                                
  640.                                                 if(hour==0)
  641.                                                 {
  642.                                                         hour=23;
  643.                
  644.                                                 }
  645.                                         }
  646.                                 }
  647.                                 break;
  648.                                 case 5:if(set==0)
  649.                         {
  650.                                 Ht1621WrOneData(0x08,0x00);
  651.                                 Ht1621WrOneData(0x09,0x00);
  652.                                 Ht1621WrOneData(0x0a,0x01);
  653.                                 Ht1621WrOneData(0x0b,0x00);
  654.                                                                         if(keytime==20)
  655.                                                 {
  656.                                                         flag=6;
  657.                                                 }
  658.                         }
  659.                                 if(k1==0)
  660.                                 {
  661.                                         DelayMS(10);
  662.                                         if(k1==0)
  663.                                         {
  664.                                                 di();
  665.                                                 keytime=0;
  666.                                         //        while(!k1);
  667.                                                 min++;
  668.                        
  669.                                                 if(min==60)
  670.                                                 {
  671.                                                         min=0;
  672.        
  673.                                                 }
  674.                                         }
  675.                                 }
  676.                                 if(k2==0)
  677.                                 {
  678.                                         DelayMS(10);
  679.                                         if(k2==0)
  680.                                         {
  681.                                                 di();
  682.                                                 keytime=0;
  683.                                                 //while(!k2);
  684.                                                 min--;

  685.                                                 if(min==0)
  686.                                                 {
  687.                                                         min=59;

  688.                                                 }
  689.                                         }
  690.                                 }
  691.                                 break;
  692.                                 case 6:        DelayMS(10);
  693.                                 break;
  694.                         }
  695.                                         ht1621d();
  696.                                                         if(set==1)
  697.                         {
  698.                                
  699.                                         dispaytime2(hour,min);
  700.                                         dispaynian(year,month,day);
  701.                         }
  702.                         if(set==2)
  703.                         {                       
  704.                                         set=0;
  705.                                         if(flag==6)
  706.                                                 {
  707.                                                         dispaytime(min);
  708.                                                 }
  709.                                         else
  710.                                                 {
  711.                                                         dispaytime2(hour,min);
  712.                                                 }
  713.                         }
  714. }
  715. void main( void )
  716. {
  717.         ADC_Init();
  718.         ADC_CR1|=0x01;
  719.         _asm("sim");
  720.         CLK_Init();
  721.         TIM1_Init();
  722.         _asm("rim");
  723. Init(); //时钟初始化
  724. port_init();//GPIO初始化
  725. Ht1621_Init(); //上电初始化LCD
  726. ds1302();
  727. DelayMS(50); //延时一段时间
  728. Ht1621WrAllData();
  729. flag=6;
  730. k1=1;
  731. k2=1;
  732. k3=1;
  733. while(1)
  734. {
  735.                   dispaytemp(b);
  736.                         key();
  737.                         settime();
  738. }
  739. }
  740. @far @interrupt void TIM1_OVER_Int(void)
  741. {
  742.                 unsigned char min1;
  743.                 TIM1_SR1 = 0x00;
  744.                 f++;
  745.                 yu++;
  746.                 set++;
  747.                 keytime++;
  748.                 keytime++;
  749.                 if(keytime==22)
  750.                         {
  751.                                 keytime=0;
  752.                         }
  753.                 if(set==3)
  754.                         {
  755.                                 set=0;
  756.                         }
  757.                 if(yu==10)
  758.         {
  759.                 yu=0;
  760.         }
  761.         if(f==2)
  762.         {
  763.                 miao++;
  764.                 f=0;
  765.                 v1=0;
  766.                 for(i=0;i<100;i++)
  767.                 {
  768.                 v=0;
  769.                 ADC_CR1|=0x01;
  770.                 while(!(0x80&ADC_CSR));
  771.                 ADC_CSR&=0x7f;
  772.                 v=(unsigned int)ADC_DRH;
  773.                 v=v<<2;
  774.                 v+=ADC_DRL;
  775.                 v1+=v;
  776.                 }
  777.                 b=770-v1/100;
  778. }
  779. }
点赞  2015-7-4 10:45
没人用STM8单片机搞过DS1302吗?
点赞  2015-7-4 18:55
引用: chaolei0922 发表于 2015-7-4 18:55
没人用STM8单片机搞过DS1302吗?

一般从网上下个驱动,改改就行,如果硬件没问题,就只要修改一下延时就行了,基本上属于体力活。。。
点赞  2015-7-6 10:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复