主要实现如图所示的功能
将主函数以外的函数全部放在qiyu.h文件中
1 //qiyu.h
2 #define KEY_PORT P1
3 #define led P2
4 #define unchar unsigned char
5 #define uint unsigned int
6
7 sbit Buz = P1^5;
8 sbit LED = P2^0;
9 sbit K1 = P3^0;
10 sbit K2 = P3^1;
11 sbit K3 = P3^2;
12 sbit K4 = P3^3;
13
14 char tzsta,msta,val=0;
15 int seccnt,temp,m=0,j,b;
16
17
18 void ini()//定时器
19 {
20 seccnt=0;
21 msta=tzsta=0;
22 TMOD=0x01;
23 TH0=0xFF;
24 TL0=0x9C;
25 TR0=1; //开启定时器0
26
27 }
28
29 void delay(int p)
30 {
31 while(p--);
32 }
33 void keyscan()//独立按键
34 {
35 if(K1==0)
36 {
37 delay(5);
38 if(K1==0)
39 {
40 msta=1;
41 }
42 }
43 if(K2==0)
44 {
45 delay(5);
46 if(K2==0)
47 {
48 msta=2;
49 }
50 }
51 if(K3==0)
52 {
53 delay(5);
54 if(K3==0)
55 {
56 msta=3;
57 }
58 }
59 if(K4==0)
60 {
61 delay(5);
62 if(K4==0)
63 {
64 msta=4;
65 }
66 }
67 }
68
69 char KeyScan1()//矩阵按键
70 {
71 KEY_PORT = 0x0f; // P1.0-1.3输出高电平,P1.4-P1.7输出低电平
72 if (KEY_PORT != 0x0f) // 读取KEY_PORT看是否有按键按下
73 {
74 delay(10); // 延时消抖
75 if (KEY_PORT != 0x0f) // 确认确实有按键按下
76 {
77 // 先确定按键发生在第几列
78 switch (KEY_PORT)
79 {
80 case 0x07 : val = 1; break;
81 case 0x0b : val = 2; break;
82 case 0x0d : val = 3; break;
83 case 0x0e : val = 4; break;
84 default : break;
85 }
86
87 // 再确定按键发生在第几行
88 KEY_PORT = 0xf0;
89 switch (KEY_PORT)
90 {
91 case 0x70: val = val + 0; break;
92 case 0xb0: val = val + 4; break;
93 case 0xd0: val = val + 8; break;
94 case 0xe0: val = val + 12; break;
95 }
96 return val;
97 }
98 }
99 return 0;
100 }
101
102 void fmq(int a)//蜂鸣器功能
103 {
104 while(a)
105 {
106 Buz=0;
107 delay(5);
108 Buz=1;
109 delay(5);
110 a--;
111 }
112 }
执行独立按键的程序放在dulianjian.h的文件中
1 //dulianjian.h
2 void work0()//蜂鸣器和灯
3 {
4 if(m<=500)
5 {
6 Buz = !Buz;
7 }
8 if(m>5000)
9 {
10 led=0xff;
11 }
12 if(m>=10000)
13 {
14 LED = 0;
15 m = 0;
16 }
17 }
18 //-----------------------
19 void work1()
20 {
21 static int s=50000;
22
23 if(m%500==0)
24 {
25 LED=0;
26 fmq(500);
27 delay(s=s-1000);
28 LED=1;
29 }
30 }
31 //----------------------
32 void work2()//停止
33 {
34 LED=1;
35 Buz=0;
36 }
37 void work3()
38 {
39
40 }
将矩阵按键的执行代码放在juzhenganjian.h中,同时借用math.h的pow函数来解决移位现象
也可借助https://www.cnblogs.com/action0/p/12642089.html中的思路来写,可大范围的简化代码。
要注意的是,借用第二个方法,要符合端口输入的方式。至于这个,有空再写。
1 //juzhenganjian.h
2
3
4 void work4()//按键1--1个空格
5 {
6 if(m>200)
7 {
8 led=0xff;
9 temp=~led;
10 }
11 if(m>=32000)
12 {
13 for(b=0;b<7;b+=2)//奇数补充
14 {
15 temp+=pow(2,b);
16 led=~temp;
17 delay(40000);
18 }
19
20
21 m=0;
22 }
23
24 }
25
26 void work5()//2--2个空格
27 {
28 if(m>200)
29 {
30 led=0xff;
31 temp=~led;
32 }
33 if(m>=32000)
34 {
35 for(b=0;b<8;b+=3)//奇数补充
36 {
37 temp+=pow(2,b);
38 led=~temp;
39 delay(40000);
40 }
41 for(b=1;b<=7;b+=3)//o数补充
42 {
43 temp+=pow(2,b);
44 led=~temp;
45 delay(40000);
46 }
47 for(b=2;b<7;b+=3)//奇数补充
48 {
49 temp+=pow(2,b);
50 led=~temp;
51 delay(40000);
52 }
53
54 m=0;
55 }
56 }
57
58 void work6()//3--3个空格
59 {
60 if(m>200)
61 {
62 led=0xff;
63 temp=~led;
64 }
65 if(m>=32000)
66 {
67 for(b=0;b<7;b+=4)
68 {
69 temp+=pow(2,b);