|
只學(xué)了矩陣鍵盤,沒有學(xué)LCD所以請大佬們幫忙看看怎么解決這個東西另外由于仿真圖的矩陣鍵盤好像用不了 就不放了,板子是ct107d的,熬夜好幾個晚上了,救救孩子吧
單片機源程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sfr P4 = 0xC0;
//行線
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
//列線
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
uint Num,temp;
uchar fuhao,keyvalue,bai,shi,ge,flag,sign,a,b;
uchar i = 0;
uchar x1, x2, x3, x4, x5, x6, x7, x8;
uchar code tab[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff,
0x89,0x8e,0xc7,0xc0 };//段碼表
//延時函數(shù)
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
for (y = 112; y > 0; y--);
}
//掃描鍵盤函數(shù)
uchar Key_Scan()
{
R1 = 0; //第一行線清零0,其余行列置1
R2 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(!C1);
Num = 0;
}
else if(C2 == 0)
{
while(!C2);
Num = 1;
}
else if(C3 == 0)
{
while(!C3);
Num = 2;
}
else if(C4 == 0)
{
while(!C4);
fuhao = '+';
}
R2 = 0; //第二行線清零0,其余行列置1
R1 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(!C1);
Num = 3;
}
else if(C2 == 0)
{
while(!C2);
Num = 4;
}
else if(C3 == 0)
{
while(!C3);
Num = 5;
}
else if(C4 == 0)
{
while(!C4);
fuhao = '-';
}
R3 = 0; //第三行線清零0,其余行列置1
R1 = R2 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(!C1);
Num = 6;
}
else if(C2 == 0)
{
while(!C2);
Num = 7;
}
else if(C3 == 0)
{
while(!C3);
Num = 8;
}
else if(C4 == 0)
{
while(!C4);
fuhao = '*';
}
R4 = 0; //第四行線清零0,其余行列置1
R1 = R2 = R3 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{
while(!C1);
Num = 9;
}
else if(C2 == 0)
{
while(!C2);
fuhao = 'r';
}
else if(C3 == 0)
{
while(!C3);
fuhao = '=';
}
else if(C4 == 0)
{
while(!C4);
fuhao = '/';
}
return Num;
}
//計算鍵值函數(shù)
void calculate()
{
if (keyvalue == '+' || keyvalue == '-' || keyvalue == '*' || keyvalue == '/' || keyvalue == 'r' || keyvalue == '=')
{
if (flag == 0)//如果輸入的是第一個數(shù)據(jù)
{
a = temp;//將temp的值賦給變量a
flag = 1;
}
else
{
b = temp;//將temp的值賦給變量b
}
temp = 0;
if (keyvalue != '=')
{
sign = keyvalue;
}
else
{
flag = 0;
switch (sign)
{
case '+':a = a + b;
break;
case '-':a = a - b;
break;
case '*':a = a * b;
break;
case '/':a = a / b;
break;
case 'r':a = 0;
default:break;
}
temp = a;//將a的值賦給變量temp
}
sign = 0;//將所有數(shù)據(jù)清零
a = b = 0;
temp = 0;
}
else if (
keyvalue == 0 || keyvalue == 1 || keyvalue == 2 ||
keyvalue == 3 || keyvalue == 4 || keyvalue == 5 ||
keyvalue == 6 || keyvalue == 7 || keyvalue == 8 ||
keyvalue == 9)
{
if (flag == 0)
{
temp = keyvalue;
flag = 1;
}
else
{
temp = temp * 10 + keyvalue;
}
}
}
//顯示函數(shù)
void display(uchar aa, uchar bb, uchar cc, uchar dd, uchar ee, uchar ff, uchar gg, uchar hh)
{
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x01;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[aa];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x02;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[bb];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x04;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[cc];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x08;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[dd];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x10;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[ee];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x20;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[ff];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x40;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[gg];
delay(5);
P2 = 0x0; P0 = 0x0;
P2 = ((P2 & 0x1f) | 0xc0); P0 = 0x80;
P2 = 0x0; P0 = 0xff;
P2 = ((P2 & 0x1f) | 0xe0); P0 = tab[hh];
delay(5);
}
//計算每一位的值
void computer(uchar x)
{
x8 = x / 10000000;
x7 = (x - x8 * 10000000) / 1000000;
x6 = (x - x7 * 1000000) / 100000;
x5 = (x - x6 * 100000) / 10000;
x4 = (x - x5 * 10000) / 1000;
x3 = (x - x4 * 1000) / 100;
x2 = (x - x3 * 100) / 10;
x1 = x - x2 * 10;
display(x8, x7, x6 , x5 , x4 , x3 , x2 , x1);
}
void main()
{
P2 = ((P2&0x1f)|0xa0);
P0 = 0X00;
P2 = ((P2&0x1f)|0x80);
P0 = 0xff;
while(1)
{
keyvalue = Key_Scan();
calculate();
computer(temp);
delay(10);
}
}
|
|