|
這個程序有很多缺欠,如:數(shù)碼管不能顯示+、-、*、/等等。我修改了半天也只能顯示鍵值,無法顯示四位數(shù)。發(fā)給你參考一下。
主函數(shù)部分:
#include <reg51.h> //包含特殊功能寄存器頭文件
#include <key_down.C>
#define uint unsigned int //定義uint=unsigned int
#define uchar unsigned char //定義uchar=unsigned char
#define dula P0 //段選
uchar qian,bai,shi,ge;
int temp;
sbit LSA=P2^2; //138譯碼器
sbit LSB=P2^3;
sbit LSC=P2^4;
uint code du_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段碼表
void Delay_pro(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
temp=(KeyPro());
qian=temp/1000; //分離千位
bai=temp%1000/100; //分離百位
shi=temp%100/10; //分離十位
ge=temp%10; //分離個位
LSA=0;LSB=0;LSC=1; //顯示千位位碼
dula=du_code[qian]; //顯示千位段碼
Delay_pro(5);
LSA=1;LSB=0;LSC=1; //顯示百位位碼
dula=du_code[bai]; //顯示百位段碼
Delay_pro(5);
LSA=0;LSB=1;LSC=1; //顯示十位位碼
dula=du_code[shi]; //顯示百位段碼
Delay_pro(5);
LSA=1;LSB=1;LSC=1; //顯示個位位碼
dula=du_code[ge]; //顯示百位段碼
Delay_pro(5);
}
void main()
{
while(1)
{
display(qian,bai,shi,ge);
}
}
矩陣掃描部分:
/*矩陣鍵盤*/
#include <reg51.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#define KeyPort P1
int k=0;
unsigned char Value,n=0;
void Delay_key(unsigned int i)
{
unsigned int a,b;
for(a=0;a<i;a++)
for(b=0;b<110;b++);
}
unsigned char KeyScan(void) //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
{
unsigned char cord_h,cord_l; //行列值中間變量
KeyPort=0x0f; //行線輸出全為0
cord_h=KeyPort&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
Delay_key(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //讀入列線值
KeyPort=cord_h|0xf0; //輸出當(dāng)前列線值
cord_l=KeyPort&0xf0; //讀入行線值
while((KeyPort&0xf0)!=0xf0); //等待松開并輸出
return(cord_h+cord_l); //鍵盤最后組合碼值
}
}return(0xff); //返回該值
}
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0xee:Value=1;break; //0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
case 0xde:Value=2;break; //1
case 0xbe:Value=3;break; //2
case 0x7e:Value=10;break;
case 0xed:Value=4;break; //4
case 0xdd:Value=5;break; //5
case 0xbd:Value=6;break; //6
case 0x7d:Value=11;break; //7
case 0xeb:Value=7;break; //8
case 0xdb:Value=8;break; //9
case 0xbb:Value=9;break; //a
case 0x7b:Value=12;break; //b
case 0xe7:Value=13;break; //c
case 0xd7:Value=0;break; //d
case 0xb7:Value=14;break; //e
case 0x77:Value=15;break; //f
break;
}
k=Value;
// k=(k*10)+Value;
return k;
} |
|