|
基于普中單核A4開(kāi)發(fā)板,按鍵數(shù)碼管加減法計(jì)算:三位數(shù)碼管顯示0~999;獨(dú)立按鍵K2按一下,數(shù)碼管加或者減1;矩陣鍵盤(pán)按一下,數(shù)碼管加或者減對(duì)應(yīng)的鍵值,k1鍵用于清零,k3鍵用于實(shí)現(xiàn)加減法切換,數(shù)碼管大于999時(shí)變?yōu)?
單片機(jī)源程序如下:- #include <reg52.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar GetMatrixKey();
- sbit LSA = P2^2;
- sbit LSB = P2^3;
- sbit LSC = P2^4;
- sbit K1 = P3^0; // 清零鍵
- sbit K2 = P3^1; // 加減1鍵
- sbit K3 = P3^2; // 加減法切換鍵
- uchar matrixKey = 0;
- uchar code smgduan[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
- uchar disp_buff[3] = {0, 0, 0};
- int num = 0;
- bit isAddition = 1; // 默認(rèn)使用加法
- void delay(uint i) {
- while (i--);
- }
- void DigDisplay() {
- uchar i;
- for (i = 0; i < 3; i++) {
- switch (i) {
- case 0: LSA = 1; LSB = 0; LSC = 0; break; // 個(gè)位
- case 1: LSA = 0; LSB = 1; LSC = 0; break; // 十位
- case 2: LSA = 0; LSB = 0; LSC = 1; break; // 百位
- }
- P0 = smgduan[disp_buff[i]];
- delay(100);
- P0 = 0x00;
- }
- }
- void KeyScan() {
- if (K1 == 0) { // 清零鍵
- num = 0;
- disp_buff[0] = disp_buff[1] = disp_buff[2] = 0;
- while (K1 == 0);
- }
- if (K2 == 0) { // 加減1鍵
- if (isAddition) {
- num = (num + 1) % 1000;
- } else {
- num = (num == 0) ? 999 : num - 1;
- }
- disp_buff[0] = num % 10; // 個(gè)位
- disp_buff[1] = (num / 10) % 10; // 十位
- disp_buff[2] = num / 100; // 百位
- while (K2 == 0);
- }
- if (K3 == 0) { // 加減法切換鍵
- isAddition = ~isAddition;
- while (K3 == 0);
- }
- matrixKey = GetMatrixKey();
-
- // 處理矩陣鍵盤(pán)輸入
- if (matrixKey >= 1 && matrixKey <= 16) {
- // 根據(jù)矩陣鍵值加減對(duì)應(yīng)的鍵值
- if (isAddition) {
- num = (num + matrixKey) % 1000;
- } else {
- num = (num - matrixKey + 1000) % 1000;
- }
- disp_buff[0] = num % 10; // 個(gè)位
- disp_buff[1] = (num / 10) % 10; // 十位
- disp_buff[2] = num / 100; // 百位
- }
-
- }
- // 獲取矩陣鍵盤(pán)的鍵值,具體根據(jù)硬件情況實(shí)現(xiàn)
- uchar GetMatrixKey() {
- uchar KeyNumber = 0;
-
- P1 = 0xFF;
- P1_3 = 0;
- if (P1_7 == 0) { delay(20); while (P1_7 == 0); delay(20); KeyNumber = 1; }
- if (P1_6 == 0) { delay(20); while (P1_6 == 0); delay(20); KeyNumber = 5; }
- if (P1_5 == 0) { delay(20); while (P1_5 == 0); delay(20); KeyNumber = 9; }
- if (P1_4 == 0) { delay(20); while (P1_4 == 0); delay(20); KeyNumber = 13; }
- P1 = 0xFF;
- P1_2 = 0;
- if (P1_7 == 0) { delay(20); while (P1_7 == 0); delay(20); KeyNumber = 2; }
- if (P1_6 == 0) { delay(20); while (P1_6 == 0); delay(20); KeyNumber = 6; }
- if (P1_5 == 0) { delay(20); while (P1_5 == 0); delay(20); KeyNumber = 10; }
- if (P1_4 == 0) { delay(20); while (P1_4 == 0); delay(20); KeyNumber = 14; }
- P1 = 0xFF;
- P1_1 = 0;
- if (P1_7 == 0) { delay(20); while (P1_7 == 0); delay(20); KeyNumber = 3; }
- if (P1_6 == 0) { delay(20); while (P1_6 == 0); delay(20); KeyNumber = 7; }
- if (P1_5 == 0) { delay(20); while (P1_5 == 0); delay(20); KeyNumber = 11; }
- if (P1_4 == 0) { delay(20); while (P1_4 == 0); delay(20); KeyNumber = 15; }
- P1 = 0xFF;
- P1_0 = 0;
- if (P1_7 == 0) { delay(20); while (P1_7 == 0); delay(20); KeyNumber = 4; }
- if (P1_6 == 0) { delay(20); while (P1_6 == 0); delay(20); KeyNumber = 8; }
- if (P1_5 == 0) { delay(20); while (P1_5 == 0); delay(20); KeyNumber = 12; }
- if (P1_4 == 0) { delay(20); while (P1_4 == 0); delay(20); KeyNumber = 16; }
- return KeyNumber;
- }
- void main() {
- while (1) {
- KeyScan();
- DigDisplay();
- }
- }
復(fù)制代碼
|
|