#include "ctype.h"
uint8 ledchar[]={ //数码管真值标
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
uint8 keysta[4][4]={//按键状态值
{1,1,1,1,},{1,1,1,1,},{1,1,1,1,},{1,1,1,1,},
};
unsigned ledbuf[]={
0xff,0xff,0xff,0xff,0xff,0xff,
};
unsigned char code keycodemap[4][4]={//矩阵按键标号到标准键盘码的映射表
{0x31,0x32,0x33,0x26},//数字键1,数字键2,数字键3,向上键
{0x34,0x35,0x36,0x25},//数字键4,数字键5,数字键6,向左键
{0x37,0x38,0x39,0x28},//数字键7,数字键8,数字键9,向下键
{0x30,0x1B,0x0D,0x27},//数字键0,ESC键, 回车键, 向右键
};
void Timer0Init(void);
void keydriver(void);
void main()
{
P11 = 0;
Timer0Init();
ledbuf[0] = ledchar[0];//上电显示0
P2 = 0xff;
while(1){
keydriver();
}
}
void shownumber(uint64 num)
{
int8 i;
uint8 buf[6];
for(i=0;i<6;i++){
buf[i] = num %10;
num/=10;
}
for(i=5;i>=1;i--){
if(buf[i] == 0){
ledbuf[i]=0xff;
}else
break;
}
for(;i>=0;i--){
ledbuf[i]=ledchar[buf[i]];
}
}
void keyaction(uint8 keycode){
static uint64 result = 0;
static uint64 addend = 0;
if( (keycode>=0x30)&&(keycode<=0x39) ){
addend = (addend*10)+keycode-0x30;
shownumber(addend);
}else if(keycode == 0x26){
result += addend;
addend = 0;
shownumber(result);
}else if(keycode == 0x0D){
result += addend;
addend = 0;
shownumber(result);
}else if(keycode == 0x1B){
addend = 0;
result = 0;
shownumber(addend);
}
}
void keydriver(void)
{
uint8 i,j;
static uint8 backup[4][4]={
{1,1,1,1,},{1,1,1,1,},{1,1,1,1,},{1,1,1,1,},
};
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keysta[i][j]!=backup[i][j])
{
if(backup[i][j]==0){
keyaction(keycodemap[i][j]);
}
backup[i][j]=keysta[i][j];
}
}
}
}
void keyscan(void)
{
static uint8 keyout = 0;
uint8 i =0;
static uint8 keybuf[4][4]={//按键状态值(16进制,用于消抖)
{0xff,0xff,0xff,0xff,},
{0xff,0xff,0xff,0xff,},
{0xff,0xff,0xff,0xff,},
{0xff,0xff,0xff,0xff,},
} ;
keyin1 = 1;
keyin2 = 1;
keyin3 = 1;
keyin3 = 1;
keybuf[keyout][0]=(keybuf[keyout][0]<<1) | P20;
keybuf[keyout][1]=(keybuf[keyout][1]<<1) | P21;
keybuf[keyout][2]=(keybuf[keyout][2]<<1) | P22;
keybuf[keyout][3]=(keybuf[keyout][3]<<1) | P23;
for(i=0;i<4;i++){
if((keybuf[keyout][i]&0x0f)==0x0f){
keysta[keyout][i]=1;
}else if((keybuf[keyout][i]&0x0f)==0x00){
keysta[keyout][i]=0;
}
}
keyout++;
keyout&=0x03;
switch(keyout){
case 02=0x7f;break;
case 12=0xbf;break;
case 22=0xdf;break;
case 32=0xef;break;
default: break;
}
}
void ledscan(void)
{
static int8 n ;
P0 = 0xff;
switch(n){
case 020=121=022=10=ledbuf[n];n++;break;
case 120=021=022=10=ledbuf[n];n++;break;
case 220=121=122=00=ledbuf[n];n++;break;
case 320=021=1;P22=0;P0=ledbuf[n];n++;break;
case 420=1;P21=0;P22=0;P0=ledbuf[n];n++;break;
case 520=0;P21=0;P22=0;P0=ledbuf[n];n=0;break;
default: break;
}
}
void Timer0Init(void) //1毫秒@32MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x83; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
void T0() interrupt 1
{
TL0 = 0x00; //设置定时初值
TH0 = 0x83; //设置定时初值
keyscan();
ledscan();
}
#ifndef __ctype_h_
#define __ctype_h_
#include <stc12c5a60s2.h>
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long uint64;
typedef signed char int8;
typedef signed int int32;
typedef signed long int64;
sbit keyin1=P2^0;
sbit keyin2=P2^1;
sbit keyin3=P2^2;
sbit keyin4=P2^3;
sbit kout1=P2^4;
sbit kout2=P2^5;
sbit kout3=P2^6;
sbit kout4=P2^7;
#endif
|