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. }
|