|
/***************************************************
程序功能:通过矩阵按键,可以依次显示0到9,A到F,一个按键显示1位
接线情况:P0端口接静态数码管的a-g和DP
P2^0-P^3接矩阵键盘的KL3-KL0
P2^4-P2^7接矩阵键盘的KR3-KR0
日 期:2014/7/21
作 者:吴超
****************************************************/
#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define FOSC 12000000L //晶振的频率
#define TIMS 65536-FOSC/2/1000 //1MS
sfr AUXR = 0x8e;
sfr P0M1 =0x93;
sfr P0M0 =0x94;
//数码管字形表,供显示时查询
uchar code disptable[18]=
{ //定义表格一定要使用code,这样会做到程序存储区中
0x3F, //"0"的字形表,0B00111111
0x06, //"1"的字形表,0B00000110
0x5B, //"2"的字形表,0B01011011
0x4F, //"3"的字形表,0B01001111
0x66, //"4"的字形表,0B01100110
0x6D, //"5"的字形表,0B01101101
0x7D, //"6"的字形表,0B01111101
0x07, //"7"的字形表,0B00000111
0x7F, //"8"的字形表,0B01111111
0x6F, //"9"的字形表,0B01101111
0x77, //"A"的字形表,0B01110111
0x7c, //"b"的字形表,0B01111100
0x39, //"C"的字形表,0B00111001
0x5e, //"d"的字形表,0B01011110
0x79, //"E"的字形表,0B01111001
0x71, //"F"的字形表,0B01110001
0x00 // 全灭消隐
};
uchar mTimeCount = 0; //定时器计数
uchar mSecIs0k = 0; //定时器标准位
uchar k_value; //存储按键值
/***************************************************
函数名称:tm0_init()
函数功能:定时器0的初始函数, 1ms@12MHz,1T模式
入口参数:无
返回参数:无
****************************************************/
void tm0_init()
{
AUXR |= 0x80; //定时器0工作在1T模式
TMOD = 0x00; //设置定时器0工作模式0
TL0 =(char)TIMS;
TH0 =TIMS>>8; //设置定时器0初始值
ET0 =1; //使能定时器0中断
EA =1; //使能全局中断
TR0 =1; //定时器0开始计数
}
/***************************************************
函数名称:keyscan()
函数功能:矩阵按键扫描程序,读出哪个按键按下
入口参数:无
返回参数:无
****************************************************/
void keyscan()
{
uchar i,j,tmep;
uchar buffer[4]={0xfe,0xfd,0xfb,0xf7};
for(j=0;j<4;j++) //循环4次,进行行扫描,四次
{
P2 = buffer[j];
tmep = 0x80; //先读出列的最高位
for(i=0;i<4;i++) //循环4次,检查列
{
if(!(P2 & tmep)) //从高4位截取1位
{
k_value = i+j*4; //获得按键值
}
tmep >>=1;
}
}
}
void main()
{
P0M1 = 0x00;
P0M0 = 0xFF; //P0的端口为推挽输出
P0 = 0x00;
tm0_init(); //定时器0的初始化
while(1)
{
if(mSecIs0k == 1)
{
mSecIs0k = 0;
keyscan();
P0 = disptable[k_value];
}
}
}
/*******************************************************
函数名称:Timer0_ISR()
函数功能:定时器0中断服务程序
入口参数:无
返回参数:无
********************************************************/
void tm0_isr() interrupt 1 using 1
{
if(++mTimeCount >=10)
{
mTimeCount = 0;
mSecIs0k = 1;
}
}
|
|