admin管理员组

文章数量:1530844

2024年7月23日发(作者:)

[cpp] view plaincopyprint?

1. #include

2. #define uchar unsigned char

3. #define uint unsigned int

4. sbit dula=P3^0;

5. sbit wela=P3^1;

6. #define keyport (P1)

7. #define keystate0 0 //按键确认状态

8. #define keystate1 1 //按键无动作状态

9. char keystate=1; //按键状态初始化为按键无动作状态

10. uchar keynum=0;

11. void delayms(uint x) //1ms

12. {

13. uint y,z;

14. for(y=x;y>0;y--)

15. for(z=111;z>0;z--);

16. }

17. uchar code table[]={ //共阳数码管

18. 0xc0,0xf9,0xa4,0xb0,

19. 0x99,0x92,0x82,0xf8,

20. 0x80,0x90,0x88,0x83,

21. 0xc6,0xa1,0x86,0x8e};

22. void smg()

23. {

24. dula=0;

25. wela=0;

26. P2=0x01;

27. wela=1;

28. wela=0;

29. P2=table[keynum];

30. dula=1;

31. dula=0;

32. delayms(1);

33. P2=0x02;

34. wela=1;

35. wela=0;

36. P2=table[keynum];

37. dula=1;

38. dula=0;

39. delayms(1);

40. P2=0x04;

41. wela=1;

42. wela=0;

43. P2=table[keynum];

44. dula=1;

45. dula=0;

46. delayms(1);

47. P2=0x08;

48. wela=1;

49. wela=0;

50. P2=table[keynum];

51. dula=1;

52. dula=0;

53. delayms(1);

54. P2=0x10;

55. wela=1;

56. wela=0;

57. P2=table[keynum];

58. dula=1;

59. dula=0;

60. delayms(1);

61. P2=0x20;

62. wela=1;

63. wela=0;

64. P2=table[keynum];

65. dula=1;

66. dula=0;

67. delayms(1);

68. P2=0x40;

69. wela=1;

70. wela=0;

71. P2=table[keynum];

72. dula=1;

73. dula=0;

74. delayms(1);

75. P2=0x80;

76. wela=1;

77. wela=0;

78. P2=table[keynum];

79. dula=1;

80. dula=0;

81. delayms(1);

82. }

83. void keyscan()

84. {

85. uchar temp1,temp2,column,row;

86. switch(keystate)

87. {

88. case keystate0: //keystate0,按键按下确认状态,下一状态为keystate1(按

键无动作状态)

89. keyport=0x0f;

90. temp1=keyport;

91. keyport=0xf0;

92. temp2=keyport;

93. if((temp1|temp2)!=0xff)

94. {

95. temp1|=temp2;

96. if(!(temp1&0x80))

97. row=3;

98. else

99. if(!(temp1&0x40))

100. row=2;

101. else

102. if(!(temp1&0x20))

103. row=1;

104. else

105. if(!(temp1&0x10))

106. row=0;

107. if(!(temp1&0x08))

108. column=3;

109. else

110. if(!(temp1&0x04))

111. column=2;

112. else

113. if(!(temp1&0x02))

114. column=1;

115. else

116. if(!(temp1&0x01))

117. column=0;

118. keynum=column*4+row;

119. while(!(keyport==0x0f|keyport==0xf0));

120. keystate=keystate1;

121. break;

122.

123. }

124. else

125. keystate=keystate1;

126. break;

127. case keystate1: //keystate1,按键无动作状态,下一状态为keystate0(按

键无动作状态)

128. keyport=0x0f;

129. temp1=keyport;

130. keyport=0xf0;

131. temp2=keyport;

132. if((temp1|temp2)!=0xff)

133. {

134. keystate=keystate0;

135. }

136. else

137. keystate=keystate1;

138. break;

139. }

140. }

141. void main()

142. {

143. while(1)

144. {

145. keyscan();

146. smg();

147. }

148. }

本文标签: 状态按键键盘数码管测试程序