1. #include <reg52.h> 2. unsigned char count; //0.5ms次数标识 3. sbit pwm=P1^0; //信号输出 4. sbit jia=P1^1; //角度增加按键 5. sbit jan=P1^2; //角度减小按键 6. char jd; //角度标识 7. void delay(unsigned int i) 8. { 9. unsigned int j,k; 10. for(j=i;j>0;j--) 11. for(k=125;k>0;k--); 12. } 13. void Time0_init() //定时器初始化 14. { 15. TMOD=0x01; 16. IE=0x82; 17. TH0=0xff; 18. TL0=0x19; //12晶振,0.25ms 19. TR0=1; //定时器开始 20. } 21. void Time0_int() interrupt 1 //中断程序 22. { 23. TH0=0xff; 24. TL0=0x19; 25. if(count<jd) //输出count个高电平 26. pwm=1; 27. else 28. pwm=0; //其余输出低电平 29. count++; 30. count=count%40; //时钟保持40个count 即20ms 31. } 32. void keyscan() //按键扫描 33. { 34. if(jia==0) //角度增加键是否按下 35. { 36. delay(50); //按下延时,消抖 37. if(jia==0) 38. { 39. jd++; //角度标识加1 40. count=0; //按键按下,则20ms周期重新开始 41. if(jd==50) 42. jd=9; //已经是180°则保持 43. while(jia==0); //等待按键放开 44. } 45. } 46. if(jan==0) //角度减小键是否按下 47. { 48. delay(10); 49. if(jd==0); 50. { 51. jd--; //角度标识减1 52. count=0; 53. if(jd==0) 54. jd=1; 55. while(jan==0); 56. } 57. } 58. } 59. 60. void main() 61. { 62. jd=1; 63. count=0; 64. Time0_init(); 65. while(1) 66. { 67. keyscan(); 68. // display(); 69. } 70. }
|