找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3101|回复: 1
收起左侧

20*4LCD液晶屏与DS12c887时钟芯片电子钟v1.10

[复制链接]
ID:70976 发表于 2014-12-26 21:07 | 显示全部楼层 |阅读模式
  1. /*****************************************************************  
  2. 20*4LCD液晶屏与DS12c887时钟芯片电子钟v1.10  
  3. *****************************************************************/   
  4. #include <REG52.H>     
  5. #include <INTRINS.H>   
  6. #include <ABSACC.H>   
  7. /*****************定义LCD寄存器***************************************/   
  8. #define LCD_RL  XBYTE[0x1e00]//读指令寄存器   
  9. #define LCD_WL  XBYTE[0x1c00]//写指令寄存器   
  10. #define LCD_RD  XBYTE[0x1f00]//读数据寄存器   
  11. #define LCD_WD  XBYTE[0x1d00]//写数据寄存器   
  12. /********************************************************************/   
  13. #define  LINE1   1   
  14. #define  LINE2   2   
  15. #define  LINE3   3   
  16. #define  LINE4   4   
  17. #define  CLEARSCREEN  LCD_en_command(0x01)//清屏   
  18. /*******************************************************************/   
  19. #define REG_A  XBYTE[0x800a]//DS12887A寄存器A     
  20. #define REG_B  XBYTE[0x800b]//DS12887A寄存器B   
  21. unsigned char code at[8]={9,8,7,6,4,2,0,50};// 年、月、日、星期、时、分、秒、世纪   
  22. unsigned char xdata *calendar_address=0x8000;//DS12887片选   
  23. unsigned char calendar_time[8];   
  24. unsigned char key_s,key_v=0,sect1,sect2;   
  25. /*******************************************************************/   
  26.    
  27. void LCD_en_command(unsigned char command);//设置LCD工作状态函数   
  28. void LCD_en_dat(unsigned char temp);//写数据函数   
  29. void LCD_set_xy( unsigned char x, unsigned char y );//设置LCD显示地址函数   
  30. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//写字符函数   
  31. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//写字符串函数   
  32. void LCD_init(void);//初如化LCD函数   
  33. void WaitIdle(void);//检测LCD忙则等待函数   
  34. /*****************************************************************************/   
  35. void Read_calendar(void);//读取系统时间   
  36. void Start_calendar(void);//启动时钟   
  37. void Display_calendar(void);//显示时间   
  38. void Set_calendar(void);//设置系统时间   
  39. /*****************************************************************************/   
  40. void delayms(unsigned char i);//延时程序   
  41. bit scan_key(void);//按键扫描,读取按键状态到key_s   
  42. void proc_key(void);//按键主程序   
  43. void scan_main_key(void);//按键判断   
  44. bit key(void);//返回是否按下键   
  45. void set_date();//修改时间日期   
  46. /******************************************************************************/   
  47. void start_stopt2(bit x);//启动停止定时器2   
  48. /******************************************************************************/   
  49. void main(void)   
  50. {   
  51. LCD_init();   
  52. Start_calendar();   
  53. while(1)      
  54.   {   
  55. Read_calendar();   
  56. Display_calendar();   
  57. scan_main_key();   
  58.   }   
  59. }   
  60.    
  61. /*********************************************************************/   
  62. void LCD_en_command(unsigned char command)//写命令函数   
  63. {   
  64. WaitIdle();   
  65. LCD_WL=command;   
  66. }   
  67.    
  68. void LCD_en_dat(unsigned char dat)//写数据函数   
  69. {   
  70. WaitIdle();   
  71. LCD_WD=dat;   
  72. }   
  73.    
  74. void LCD_set_xy( unsigned char x, unsigned char y )  //设置地址函数   
  75. {   
  76. unsigned char address;   
  77. switch(y){   
  78. case 1:   
  79.   address = 0x80 + x;break;   
  80. case 2:   
  81.   address = 0xc0 + x;break;   
  82. case 3:   
  83.   address = 0x94 + x;break;   
  84. case 4:   
  85.   address = 0xd4 + x;break;   
  86.   }   
  87. LCD_en_command(address);   
  88.    
  89. }   
  90.    
  91. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)//写字符函数   
  92. {   
  93. LCD_set_xy( x, y );   
  94. LCD_en_dat(dat);   
  95. }   
  96.    
  97. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)//写字符串函数   
  98. {   
  99.     LCD_set_xy( X, Y ); //写地址     
  100.     while (*s)  // 写显示字符   
  101.     {   
  102. LCD_en_dat(*s);      
  103. s ++;   
  104.     }   
  105. }   
  106.    
  107. void LCD_init(void)//初始化子函数   
  108. {   
  109. CLEARSCREEN;//清屏   
  110. LCD_en_command(0x38);//设置8位串数据格式   
  111. LCD_en_command(0x0c);//开显示器   
  112. CLEARSCREEN;//清屏   
  113. }   
  114.    
  115. void WaitIdle(void)//检测LCD忙则等待   
  116. {   
  117. unsigned char tmp;   
  118. _nop_();   
  119. while(1)   
  120.   { tmp=LCD_RL;   
  121.     tmp&=0x80;   
  122.     if(tmp==0)   
  123.     break;   
  124.   }   
  125. }   
  126. /**************************************************************/   
  127. void Display_calendar(void)//显示时间   
  128. {LCD_write_string(0x04,LINE1,"GZJWD_SG_JKS");   
  129. LCD_write_char(0x05,LINE2,(calendar_time[7]/10)|0x30);//世纪十位   
  130. LCD_write_char(0x06,LINE2,(calendar_time[7]%10)|0x30);//世纪个位   
  131. LCD_write_char(0x07,LINE2,(calendar_time[0]/10)|0x30);//年十位   
  132. LCD_write_char(0x08,LINE2,(calendar_time[0]%10)|0x30);//年个位   
  133. LCD_write_string(0x09,LINE2,"/");   
  134. LCD_write_char(0x0a,LINE2,(calendar_time[1]/10)|0x30);//月十位   
  135. LCD_write_char(0x0b,LINE2,(calendar_time[1]%10)|0x30);//月个位   
  136. LCD_write_string(0x0c,LINE2,"/");   
  137. LCD_write_char(0x0d,LINE2,(calendar_time[2]/10)|0x30);//日十位   
  138. LCD_write_char(0x0e,LINE2,(calendar_time[2]%10)|0x30);//日个位   
  139. if(calendar_time[3]==1)   
  140. {   
  141.   LCD_write_string(0x07,LINE3,"Mon_");   
  142.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  143. }   
  144. if(calendar_time[3]==2)   
  145. {   
  146.   LCD_write_string(0x07,LINE3,"Tue_");   
  147.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  148. }   
  149. if(calendar_time[3]==3)   
  150. {   
  151.   LCD_write_string(0x07,LINE3,"Wen_");   
  152.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  153. }   
  154. if(calendar_time[3]==4)   
  155. {   
  156.   LCD_write_string(0x07,LINE3,"Thu_");   
  157.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  158. }   
  159. if(calendar_time[3]==5)   
  160. {   
  161.   LCD_write_string(0x07,LINE3,"Fri_");   
  162.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  163. }   
  164. if(calendar_time[3]==6)   
  165. {   
  166.   LCD_write_string(0x07,LINE3,"Sat_");   
  167.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  168. }   
  169. if(calendar_time[3]==7)   
  170. {   
  171.   LCD_write_string(0x07,LINE3,"Sun_");   
  172.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期   
  173. }   
  174. LCD_write_char(0x06,LINE4,(calendar_time[4]/10)|0x30);//小时十位   
  175. LCD_write_char(0x07,LINE4,(calendar_time[4]%10)|0x30);//小时个位   
  176. LCD_write_string(0x08,LINE4,":");   
  177. LCD_write_char(0x09,LINE4,(calendar_time[5]/10)|0x30);//分钟十位   
  178. LCD_write_char(0x0a,LINE4,(calendar_time[5]%10)|0x30);//分钟个位   
  179. LCD_write_string(0x0b,LINE4,":");   
  180. LCD_write_char(0x0c,LINE4,(calendar_time[6]/10)|0x30);//秒十位   
  181. LCD_write_char(0x0d,LINE4,(calendar_time[6]%10)|0x30);//秒个位   
  182. }   
  183.    
  184. void Set_calendar(void) //设置系统时间   
  185. {   
  186. unsigned char i;   
  187. REG_B=0x80;   
  188. for(i=0;i<8;i++)   
  189. *(calendar_address+at[i])=calendar_time[i];   
  190. Start_calendar();   
  191. }   
  192.    
  193. void Start_calendar(void) //启动时钟   
  194. {   
  195.   REG_A=0x20;//晶体振荡器开启并保存时钟运行   
  196.   REG_B=0x06;//24小时制,hex输出   
  197. }   
  198.    
  199. void Read_calendar(void) //读取系统时间   
  200. {   
  201. unsigned char temp,i;   
  202.   REG_B=0x06;//24小时制,hex输出   
  203.   do{ temp=REG_A;}   
  204.   while(temp&0x80);   
  205.   for(i=0;i<8;i++)   
  206.   calendar_time[i]=*(calendar_address+at[i]);      
  207. }   
  208.    
  209. void set_int12887(void)//初始化时钟   
  210. {   
  211. unsigned char i;   
  212. unsigned char calendar[]={06,12,19,2,16,30,30,20};   
  213. for(i=0;i<8;i++)   
  214. calendar_time[i]=calendar[i];   
  215. Set_calendar();   
  216. }   
  217. /*************************************************************************/   
  218. void scan_main_key(void)//按键判断   
  219. {   
  220. if(scan_key())    //调用按键扫描,读取按键的状态,如果有按键变化,则delay 10ms去抖动   
  221.     { delayms(10) ;//去抖动   
  222.        if(scan_key())//再扫描,如果仍然有键,才进入按键处理   
  223.           {key_v = key_s ;//保存按键状态   
  224.            proc_key() ;//按键处理   
  225.           }   
  226.      }   
  227. }   
  228.    
  229. bit key(void)//返回是否按下键   
  230. {   
  231. if(scan_key())    //调用按键扫描,读取按键的状态,如果有按键变化,则delay 10ms去抖动   
  232.     { delayms(10) ;//去抖动   
  233.        if(scan_key())//再扫描,如果仍然有键,才进入按键处理   
  234.           {key_v = key_s ;//保存按键状态   
  235.            return 1;//确定有键按下返回1   
  236.           }   
  237.      }   
  238. }   
  239.    
  240. bit scan_key(void)//按键扫描,读取按键状态到key_s   
  241. {   
  242. key_s =(~P1)&0x1F;   
  243. return(key_s ^ key_v) ; //如果新旧状态不一样,则返回1,表示有按键变化。否则返回0   
  244. }   
  245.    
  246. void proc_key(void)//按键主程序   
  247. {   
  248. switch(key_v)   
  249.    {   
  250. case 0x01:// ok键   
  251.   set_date();   
  252.   break;   
  253. case 0x02:// <-键   
  254.   break;   
  255. case 0x04:// ->键   
  256.   break;   
  257. case 0x08:// + 键   
  258.   break;   
  259. case 0x10:// - 键   
  260.   break;   
  261. case 0x18:   
  262.   set_int12887();   
  263.   break;   
  264. default:   
  265.   break;   
  266.    }   
  267. }   
  268.    
  269. void delayms(unsigned char i)//延时程序   
  270. {   
  271. unsigned char j;   
  272. for(;i>0;i--)   
  273. for(j=0;j++;j<250);   
  274. }   
  275.    
  276. void set_date(void)   
  277. {unsigned char address[]={0xc8,0xcb,0xce,0x9f,0xdb,0xde,0xe1};   
  278. unsigned char i=4;   
  279.   while(1)   
  280.   {   
  281.   LCD_en_command(address[i]); //写地址     
  282.   LCD_en_command(0x0f);//开显示器,光标闪烁   
  283.   if(key())   
  284.    {if(key_v==0x08)   //按下+键   
  285.     calendar_time[i]++;   
  286.     if(key_v==0x10)  //按下-键   
  287.     calendar_time[i]--;   
  288.    
  289.     if(calendar_time[0]==100)   
  290.     {calendar_time[0]=0;calendar_time[7]++;}   
  291.     if(calendar_time[0]==255)   
  292.     {calendar_time[0]=99;calendar_time[7]--;}   
  293.     if(calendar_time[1]==13)   
  294.     calendar_time[1]=1;   
  295.     if(calendar_time[1]==0)   
  296.     calendar_time[1]=12;   
  297.     if(calendar_time[2]==32)   
  298.     calendar_time[2]=1;   
  299.     if(calendar_time[2]==0)   
  300.     calendar_time[2]=31;   
  301.     if(calendar_time[4]==24)   
  302.     calendar_time[4]=0;   
  303.    if(calendar_time[4]==255)   
  304.     calendar_time[4]=23;   
  305.     if(calendar_time[5]==60)   
  306.     calendar_time[5]=0;   
  307.     if(calendar_time[5]==255)   
  308.     calendar_time[5]=59;   
  309.     if(calendar_time[6]==60)   
  310.     calendar_time[6]=0;   
  311.     if(calendar_time[6]==255)   
  312.     calendar_time[6]=59;   
  313.     if(calendar_time[3]==8)   
  314.     calendar_time[3]=1;   
  315.     if(calendar_time[3]==0)   
  316.     calendar_time[3]=7;   
  317.    
  318.    if(key_v==0x04)//按下->键   
  319.    i++;   
  320.     if(key_v==0x02)//按下<-键   
  321.     i--;   
  322.     if(i==255)i=6;   
  323.     if(i==7)i=0;   
  324.     if(key_v==0x01)//按下确认键   
  325.       {Set_calendar();//设置日期   
  326.        LCD_en_command(0x0c);//开显示器,取消光标闪烁   
  327.        break;   
  328.       }   
  329.       Display_calendar();//显示时间   
  330.     }   
  331.    }   
  332. }   
  333.    
  334. /**************************************************************************************/   
  335. timer2() interrupt 5//溢出一次50ms   
  336. {   
  337.   static unsigned char t;   
  338.   TF2=0;//清溢出标志   
  339.   t++;   
  340.   if(t==20)//20约一秒   
  341.   {t=0;sect1++;}   
  342. }   
  343. void start_stopt2(bit x)//启动停止定时器2   
  344. {   
  345. RCAP2H=0x50;   
  346. RCAP2L=0x00;   
  347. TR2=x;   
  348. ET2=x;   
  349. EA=x;   
  350. }   
复制代码


回复

使用道具 举报

ID:70976 发表于 2014-12-26 21:09 | 显示全部楼层
  1. /*****************************************************************
  2. 20*4LCD液晶屏与DS12c887时钟芯片电子钟v1.10
  3. 广州机务段韶关监控所检修组雪狼湖研发
  4. 2006/12/19 09:25修改
  5. *****************************************************************/
  6. #include <REG52.H>     
  7. #include <INTRINS.H>   
  8. #include <ABSACC.H>
  9. /*****************定义LCD寄存器***************************************/
  10. #define LCD_RL  XBYTE[0x1e00]//读指令寄存器
  11. #define LCD_WL  XBYTE[0x1c00]//写指令寄存器
  12. #define LCD_RD  XBYTE[0x1f00]//读数据寄存器
  13. #define LCD_WD  XBYTE[0x1d00]//写数据寄存器
  14. /********************************************************************/
  15. #define  LINE1   1
  16. #define  LINE2   2
  17. #define  LINE3   3
  18. #define  LINE4   4
  19. #define  CLEARSCREEN  LCD_en_command(0x01)//清屏
  20. /*******************************************************************/
  21. #define REG_A  XBYTE[0x800a]//DS12887A寄存器A  
  22. #define REG_B  XBYTE[0x800b]//DS12887A寄存器B
  23. unsigned char code at[8]={9,8,7,6,4,2,0,50};// 年、月、日、星期、时、分、秒、世纪
  24. unsigned char xdata *calendar_address=0x8000;//DS12887片选
  25. unsigned char calendar_time[8];
  26. unsigned char key_s,key_v=0,sect1,sect2;
  27. /*******************************************************************/

  28. void LCD_en_command(unsigned char command);//设置LCD工作状态函数
  29. void LCD_en_dat(unsigned char temp);//写数据函数
  30. void LCD_set_xy( unsigned char x, unsigned char y );//设置LCD显示地址函数
  31. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//写字符函数
  32. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//写字符串函数
  33. void LCD_init(void);//初如化LCD函数
  34. void WaitIdle(void);//检测LCD忙则等待函数
  35. /*****************************************************************************/
  36. void Read_calendar(void);//读取系统时间
  37. void Start_calendar(void);//启动时钟
  38. void Display_calendar(void);//显示时间
  39. void Set_calendar(void);//设置系统时间
  40. /*****************************************************************************/
  41. void delayms(unsigned char i);//延时程序
  42. bit scan_key(void);//按键扫描,读取按键状态到key_s
  43. void proc_key(void);//按键主程序
  44. void scan_main_key(void);//按键判断
  45. bit key(void);//返回是否按下键
  46. void set_date();//修改时间日期
  47. /******************************************************************************/
  48. void start_stopt2(bit x);//启动停止定时器2
  49. /******************************************************************************/
  50. void main(void)
  51. {
  52. LCD_init();
  53. Start_calendar();
  54. while(1)     
  55.   {
  56. Read_calendar();
  57. Display_calendar();
  58. scan_main_key();
  59.   }
  60. }

  61. /*********************************************************************/
  62. void LCD_en_command(unsigned char command)//写命令函数
  63. {
  64. WaitIdle();
  65. LCD_WL=command;
  66. }

  67. void LCD_en_dat(unsigned char dat)//写数据函数
  68. {
  69. WaitIdle();
  70. LCD_WD=dat;
  71. }

  72. void LCD_set_xy( unsigned char x, unsigned char y )  //设置地址函数
  73. {
  74. unsigned char address;
  75. switch(y){
  76. case 1:
  77.   address = 0x80 + x;break;
  78. case 2:
  79.   address = 0xc0 + x;break;
  80. case 3:
  81.   address = 0x94 + x;break;
  82. case 4:
  83.   address = 0xd4 + x;break;
  84.   }
  85. LCD_en_command(address);  

  86. }

  87. void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)//写字符函数
  88. {
  89. LCD_set_xy( x, y );  
  90. LCD_en_dat(dat);
  91. }

  92. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)//写字符串函数
  93. {
  94.     LCD_set_xy( X, Y ); //写地址  
  95.     while (*s)  // 写显示字符
  96.     {
  97. LCD_en_dat(*s);   
  98. s ++;
  99.     }
  100. }

  101. void LCD_init(void)//初始化子函数
  102. {  
  103. CLEARSCREEN;//清屏
  104. LCD_en_command(0x38);//设置8位串数据格式
  105. LCD_en_command(0x0c);//开显示器
  106. CLEARSCREEN;//清屏
  107. }

  108. void WaitIdle(void)//检测LCD忙则等待
  109. {  
  110. unsigned char tmp;
  111. _nop_();
  112. while(1)
  113.   { tmp=LCD_RL;
  114.     tmp&=0x80;
  115.     if(tmp==0)
  116.     break;
  117.   }
  118. }
  119. /**************************************************************/
  120. void Display_calendar(void)//显示时间
  121. {LCD_write_string(0x04,LINE1,"GZJWD_SG_JKS");
  122. LCD_write_char(0x05,LINE2,(calendar_time[7]/10)|0x30);//世纪十位
  123. LCD_write_char(0x06,LINE2,(calendar_time[7]%10)|0x30);//世纪个位
  124. LCD_write_char(0x07,LINE2,(calendar_time[0]/10)|0x30);//年十位
  125. LCD_write_char(0x08,LINE2,(calendar_time[0]%10)|0x30);//年个位
  126. LCD_write_string(0x09,LINE2,"/");
  127. LCD_write_char(0x0a,LINE2,(calendar_time[1]/10)|0x30);//月十位
  128. LCD_write_char(0x0b,LINE2,(calendar_time[1]%10)|0x30);//月个位
  129. LCD_write_string(0x0c,LINE2,"/");
  130. LCD_write_char(0x0d,LINE2,(calendar_time[2]/10)|0x30);//日十位
  131. LCD_write_char(0x0e,LINE2,(calendar_time[2]%10)|0x30);//日个位
  132. if(calendar_time[3]==1)
  133. {
  134.   LCD_write_string(0x07,LINE3,"Mon_");
  135.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  136. }
  137. if(calendar_time[3]==2)
  138. {
  139.   LCD_write_string(0x07,LINE3,"Tue_");
  140.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  141. }
  142. if(calendar_time[3]==3)
  143. {
  144.   LCD_write_string(0x07,LINE3,"Wen_");
  145.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  146. }
  147. if(calendar_time[3]==4)
  148. {
  149.   LCD_write_string(0x07,LINE3,"Thu_");
  150.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  151. }
  152. if(calendar_time[3]==5)
  153. {
  154.   LCD_write_string(0x07,LINE3,"Fri_");
  155.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  156. }
  157. if(calendar_time[3]==6)
  158. {
  159.   LCD_write_string(0x07,LINE3,"Sat_");
  160.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  161. }
  162. if(calendar_time[3]==7)
  163. {
  164.   LCD_write_string(0x07,LINE3,"Sun_");
  165.   LCD_write_char(0x0b,LINE3,(calendar_time[3]%10)|0x30);//星期
  166. }
  167. LCD_write_char(0x06,LINE4,(calendar_time[4]/10)|0x30);//小时十位
  168. LCD_write_char(0x07,LINE4,(calendar_time[4]%10)|0x30);//小时个位
  169. LCD_write_string(0x08,LINE4,":");  
  170. LCD_write_char(0x09,LINE4,(calendar_time[5]/10)|0x30);//分钟十位
  171. LCD_write_char(0x0a,LINE4,(calendar_time[5]%10)|0x30);//分钟个位
  172. LCD_write_string(0x0b,LINE4,":");  
  173. LCD_write_char(0x0c,LINE4,(calendar_time[6]/10)|0x30);//秒十位
  174. LCD_write_char(0x0d,LINE4,(calendar_time[6]%10)|0x30);//秒个位
  175. }

  176. void Set_calendar(void) //设置系统时间
  177. {
  178. unsigned char i;
  179. REG_B=0x80;  
  180. for(i=0;i<8;i++)
  181. *(calendar_address+at[i])=calendar_time[i];
  182. Start_calendar();
  183. }

  184. void Start_calendar(void) //启动时钟
  185. {
  186.   REG_A=0x20;//晶体振荡器开启并保存时钟运行
  187.   REG_B=0x06;//24小时制,hex输出
  188. }

  189. void Read_calendar(void) //读取系统时间
  190. {
  191. unsigned char temp,i;
  192.   REG_B=0x06;//24小时制,hex输出
  193.   do{ temp=REG_A;}  
  194.   while(temp&0x80);
  195.   for(i=0;i<8;i++)
  196.   calendar_time[i]=*(calendar_address+at[i]);     
  197. }

  198. void set_int12887(void)//初始化时钟
  199. {
  200. unsigned char i;
  201. unsigned char calendar[]={06,12,19,2,16,30,30,20};
  202. for(i=0;i<8;i++)
  203. calendar_time[i]=calendar[i];
  204. Set_calendar();
  205. }
  206. /*************************************************************************/
  207. void scan_main_key(void)//按键判断
  208. {
  209. if(scan_key())    //调用按键扫描,读取按键的状态,如果有按键变化,则delay 10ms去抖动
  210.     { delayms(10) ;//去抖动
  211.        if(scan_key())//再扫描,如果仍然有键,才进入按键处理
  212.           {key_v = key_s ;//保存按键状态
  213.            proc_key() ;//按键处理
  214.           }
  215.      }
  216. }

  217. bit key(void)//返回是否按下键
  218. {
  219. if(scan_key())    //调用按键扫描,读取按键的状态,如果有按键变化,则delay 10ms去抖动
  220.     { delayms(10) ;//去抖动
  221.        if(scan_key())//再扫描,如果仍然有键,才进入按键处理
  222.           {key_v = key_s ;//保存按键状态
  223.            return 1;//确定有键按下返回1
  224.           }
  225.      }
  226. }

  227. bit scan_key(void)//按键扫描,读取按键状态到key_s
  228. {
  229. key_s =(~P1)&0x1F;
  230. return(key_s ^ key_v) ; //如果新旧状态不一样,则返回1,表示有按键变化。否则返回0
  231. }

  232. void proc_key(void)//按键主程序
  233. {
  234. switch(key_v)
  235.    {
  236. case 0x01:// ok键
  237.   set_date();
  238.   break;
  239. case 0x02:// <-键
  240.   break;
  241. case 0x04:// ->键
  242.   break;
  243. case 0x08:// + 键
  244.   break;
  245. case 0x10:// - 键
  246.   break;
  247. case 0x18:
  248.   set_int12887();
  249.   break;
  250. default:
  251.   break;
  252.    }
  253. }

  254. void delayms(unsigned char i)//延时程序
  255. {
  256. unsigned char j;
  257. for(;i>0;i--)
  258. for(j=0;j++;j<250);
  259. }

  260. void set_date(void)
  261. {unsigned char address[]={0xc8,0xcb,0xce,0x9f,0xdb,0xde,0xe1};
  262. unsigned char i=4;
  263.   while(1)
  264.   {
  265.   LCD_en_command(address[i]); //写地址  
  266.   LCD_en_command(0x0f);//开显示器,光标闪烁
  267.   if(key())
  268.    {if(key_v==0x08)   //按下+键
  269.     calendar_time[i]++;
  270.     if(key_v==0x10)  //按下-键
  271.         calendar_time[i]--;

  272.         if(calendar_time[0]==100)
  273.         {calendar_time[0]=0;calendar_time[7]++;}
  274.         if(calendar_time[0]==255)
  275.         {calendar_time[0]=99;calendar_time[7]--;}
  276.         if(calendar_time[1]==13)
  277.         calendar_time[1]=1;
  278.         if(calendar_time[1]==0)
  279.         calendar_time[1]=12;
  280.         if(calendar_time[2]==32)
  281.         calendar_time[2]=1;
  282.         if(calendar_time[2]==0)
  283.         calendar_time[2]=31;
  284.         if(calendar_time[4]==24)
  285.         calendar_time[4]=0;
  286.    if(calendar_time[4]==255)
  287.         calendar_time[4]=23;
  288.         if(calendar_time[5]==60)
  289.         calendar_time[5]=0;
  290.         if(calendar_time[5]==255)
  291.         calendar_time[5]=59;
  292.         if(calendar_time[6]==60)
  293.         calendar_time[6]=0;
  294.         if(calendar_time[6]==255)
  295.         calendar_time[6]=59;
  296.         if(calendar_time[3]==8)
  297.         calendar_time[3]=1;
  298.         if(calendar_time[3]==0)
  299.         calendar_time[3]=7;

  300.    if(key_v==0x04)//按下->键
  301.    i++;
  302.         if(key_v==0x02)//按下<-键
  303.         i--;
  304.         if(i==255)i=6;
  305.         if(i==7)i=0;
  306.     if(key_v==0x01)//按下确认键
  307.           {Set_calendar();//设置日期
  308.            LCD_en_command(0x0c);//开显示器,取消光标闪烁
  309.            break;
  310.           }
  311.           Display_calendar();//显示时间
  312.     }
  313.    }
  314. }

  315. /**************************************************************************************/
  316. timer2() interrupt 5//溢出一次50ms
  317. {
  318.   static unsigned char t;
  319.   TF2=0;//清溢出标志
  320.   t++;
  321.   if(t==20)//20约一秒
  322.   {t=0;sect1++;}
  323. }
  324. void start_stopt2(bit x)//启动停止定时器2
  325. {
  326. RCAP2H=0x50;
  327. RCAP2L=0x00;
  328. TR2=x;
  329. ET2=x;
  330. EA=x;
  331. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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