一、原理图
二、原理分析
ROW1 -> ROW4分别接P3^0 -> P3^3,COL1接P4^2,COL2接P4^4,COL3和COL4分别接P3^5和P3^4,当按键两端同时置低电平时,按键导通。例如,当COL1和ROW1为0时,选择S7。
三、代码
#include "key.h" sbit R1 = P3^2; sbit R2 = P3^3; sbit C1 = P4^4; sbit C2 = P4^2; KEYStruct key; KEYStruct* GetKeyStruct() { return &key; } void Delay(unsigned int x) { while(x--); } void Key_Scan() { R1 = 0; R2 = 1; if(C1 == 0) //S5 { Delay(500); if(C1 == 0) { key.value = 5; while(C1 == 0)TaskDisplay(); } } if(C2 == 0) //S9 { Delay(500); if(C2 == 0) { key.value = 9; while(C2 == 0)TaskDisplay(); } } } void Init_Key() { key.pFun = Key_Scan; key.state = 0; key.value = 255; }
任务处理
#include "task.h" unsigned char num=0; void Sys_init() { LED(0xff); BUZ(0x00); InitDsp(); Init_Key(); } void TaskKey() { GetKeyStruct()->pFun(); switch(GetKeyStruct()->value) { case 5: num++; GetKeyStruct()->value = 255; break; case 9: num--; GetKeyStruct()->value = 255; break; } } void TaskDisplay() { DisplayStruct* seg = GetDisplayStruct(); GetDisplayStruct() -> SegDisplay(); seg->dot = 255; seg->buf[0] = 1; seg->buf[1] = 10; seg->buf[2] = 10; seg->buf[3] = 10; seg->buf[4] = 10; seg->buf[5] = 10; seg->buf[6] = num / 10 % 10; seg->buf[7] = num % 10; }
主函数
#include "main.h" void main() { Sys_init(); while(1) { TaskKey(); TaskDisplay(); } }
tips:通过S5和S9来控制加减,数码管显示。若想判断长短按,可通过结构体中的状态变量结合定时器计数来判断。