[AVR单片机] 关于LCD1602计数的一个程序,求会的人帮我看看

[复制链接]
 楼主| studying123 发表于 2012-12-16 10:26 | 显示全部楼层 |阅读模式

  1. #include <iom16v.h>
  2. #include <macros.h>
  3. #pragma interrupt_handler gs:9
  4. #pragma interrupt_handler sd:10
  5. #define LCM_RS_1 PORTB|=(1<<7)
  6. #define LCM_RS_0 PORTB&=(~(1<<7))
  7. #define LCM_RW_1 PORTB|=(1<<6)
  8. #define LCM_RW_0 PORTB&=(~(1<<6))
  9. #define LCM_E_1 PORTB|=(1<<5)
  10. #define LCM_E_0 PORTB&=(~(1<<5))
  11. #define uint unsigned int
  12. #define uchar unsigned char
  13. uint num=5;/*用以计个数*/
  14. const unsigned char LCM_Dis_String1[]="number:";
  15. const unsigned char LCM_Dis_String2[]="speed:";
  16. const unsigned char table[]="0123456789";

  17. void delay_1(uint ms)
  18. {
  19. uint i,j;
  20. for(i=0;i<ms;i++)
  21. for(j=0;j<1141;j++);
  22. }

  23. void delay_2(uint ns)
  24. {
  25. uint k,h;
  26. for(k=0;k<ns;k++)
  27. for(h=0;h<8;h++);
  28. }

  29. unsigned char LCM_Re_BAC()
  30. {
  31. unsigned char status;
  32. DDRA=0X00;
  33. LCM_RS_0;
  34. LCM_RW_1;
  35. LCM_E_1;
  36. delay_2(1000);
  37. status=PINA;
  38. LCM_E_0;
  39. return status;
  40. }

  41. void LCM_Wr_CMD(uchar cmd_dat)
  42. {
  43. while(LCM_Re_BAC()>=0X80);
  44. DDRA=0XFF;
  45. LCM_RS_0;
  46. LCM_RW_0;
  47. LCM_E_1;
  48. PORTA=cmd_dat;
  49. delay_2(1000);
  50. LCM_E_0;
  51. }

  52. void LCM_Wr_DAT(uchar dis_dat)
  53. {
  54. while(LCM_Re_BAC()>=0X80);
  55. DDRA=0XFF;
  56. LCM_RS_1;
  57. LCM_RW_0;
  58. LCM_E_1;
  59. PORTA=dis_dat;
  60. delay_2(1000);
  61. LCM_E_0;
  62. delay_2(400);
  63. }

  64. void LCM_1602_Init(void)
  65. {
  66. LCM_Wr_CMD(0X38);
  67. delay_1(5);
  68. LCM_Wr_CMD(0X0c);
  69. delay_1(5);
  70. LCM_Wr_CMD(0X06);
  71. delay_1(5);
  72. LCM_Wr_CMD(0X01);
  73. delay_1(5);
  74. }

  75. void gs(void)  /*定时器1用以计算脉冲个数*/
  76. {
  77. uint a=0,b=0,c=0,d=0,e=0,f=0,g=0;
  78. TCCR1B=0X00;
  79. SREG|=BIT(7);
  80. TIMSK&=0XFB;
  81. if (num<999)
  82. {
  83. LCM_Wr_CMD(0X80+0X0D);
  84. LCM_Wr_DAT('g');
  85. a=num/100;
  86. d=num%100;
  87. b=d/10;
  88. c=d%10;
  89. LCM_Wr_CMD(0X80+0X0A);
  90. delay_2(10);
  91. LCM_Wr_DAT(table[a]);
  92. delay_2(10);
  93. LCM_Wr_DAT(table[b]);
  94. delay_2(10);
  95. LCM_Wr_DAT(table[c]);
  96. delay_2(10);
  97. }
  98. else
  99. {
  100. LCM_Wr_CMD(0X80+0X0D);
  101. LCM_Wr_DAT('k');
  102. LCM_Wr_DAT('g');
  103. a=num/100000;
  104. d=num%100000;
  105. b=d/10000;
  106. e=d%10000;
  107. c=e/1000;
  108. f=e%1000;
  109. g=f/100;
  110. LCM_Wr_CMD(0X80+0X0A);
  111. if((!a)&(!b))
  112. {
  113. LCM_Wr_DAT(table[c]);
  114. delay_2(10);
  115. LCM_Wr_DAT('.');
  116. delay_2(10);
  117. LCM_Wr_DAT(table[g]);
  118. delay_2(10);
  119. }
  120. else
  121. {
  122. LCM_Wr_DAT(table[c]);
  123. LCM_Wr_DAT('.');
  124. LCM_Wr_DAT(table[g]);
  125. }
  126. }
  127. TCNT1H=0XF0;
  128. TCNT1L=0XBE;
  129. TIMSK|=BIT(2);
  130. TCCR1B=0X04;
  131. }

  132. void sd(void)     /*定时器0用以就算传输速度,假定定时是1s*/
  133. {
  134. uint a=num;
  135. TCCR0=0;
  136. TIMSK=0XFE;
  137. LCM_Wr_CMD(0XC0+0X08);
  138. LCM_Wr_DAT(table[a]);
  139. TCNT0=0X01;
  140. TIMSK|=BIT(0);
  141. TCCR0=0X05;
  142. }

  143. void main(void)
  144. {
  145. unsigned char temp1,temp2;
  146. uchar x1=0;
  147. DDRB=0XFF;
  148. DDRA=0xff;
  149. DDRD&=0XF8;
  150. LCM_1602_Init();
  151. temp1=0;
  152. temp2=0;
  153. LCM_Wr_CMD(0X80);
  154. while(LCM_Dis_String1[temp1]!='\0')
  155. {
  156. LCM_Wr_DAT(LCM_Dis_String1[temp1++]);
  157. delay_2(100);
  158. }
  159. LCM_Wr_CMD(0xc0);
  160. while(LCM_Dis_String2[temp2]!='\0')
  161. {
  162. LCM_Wr_DAT(LCM_Dis_String2[temp2++]);
  163. delay_2(100);
  164. }
  165. TCCR0=0X05;
  166. TCNT0=0X01;
  167. TCCR1B=0X04;
  168. TCNT1H=0XF0;
  169. TCNT1L=0XBE;
  170. TIMSK|=BIT(2);
  171. TIMSK|=BIT(0);
  172. SREG|=BIT(7);
  173. LCM_Wr_CMD(0XC0+0X0B);
  174. LCM_Wr_DAT('g');
  175. LCM_Wr_DAT('/');
  176. LCM_Wr_DAT('s');

  177. while(1)   /*读脉冲*/
  178. {
  179. x1=PIND&0X01;
  180. if(x1=0) num++;
  181. }

  182. }


  183. 新手,所以上述这个程序花了两天多时间,还是不行,感觉一直在执行中断,不知道该怎么改,真心菜啊。求大神给支个招啊。

lirunze 发表于 2012-12-16 10:30 | 显示全部楼层
路过帮顶一下
wallacer 发表于 2012-12-16 11:21 | 显示全部楼层
路过,帮顶!建议先调试一个定时器,先一步一步完成功能,然后再将两个功能加到一块儿。比如先调试LCD,然后调试定时器0……
zf_015820 发表于 2012-12-18 16:26 | 显示全部楼层
这个,用KEIL C51的断点,逐步调试,一下子就知道问题在那了呀;另外,你程序运行后,出现 了什么问题?现象也没有说明呀
 楼主| studying123 发表于 2012-12-18 17:16 | 显示全部楼层
zf_015820 发表于 2012-12-18 16:26
这个,用KEIL C51的断点,逐步调试,一下子就知道问题在那了呀;另外,你程序运行后,出现 了什么问题?现 ...

就是显示乱来的,本来显示第一行的,它显示到第二行去了。我确定的是在发送数据之前我给它发送了地址指令是正确的位置。
用AVR Studio 能查吗?具体怎么做呢?
zf_015820 发表于 2012-12-19 10:09 | 显示全部楼层
这个软件,我没玩过,但是,只要是IDE界面,应该都有断点调试功能 的,你看看这个软件说明书或者上网搜下,使用说明书吧;如果 是KEIL C51,我可以具体列出来步骤;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部