📄 demo.c
字号:
/*8279键盘和LED显示程序*/
/*此程序响应8279的键盘中断,并根据按键来更新LED显示*/
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sfr AUXR = 0x8e;
#define COM XBYTE [0x0001] //8279的命令状态口
#define DAT XBYTE [0X0000] //8279的数据口
#define RAM XBYTE [0X8001] //8279的RAM地址
/*共阴的七段数码管译码0 1 2 3 4 5 6 7 8 9 a b c d e f*/
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
///////////////////////////////////////////////////////////////////////////////
//按键响应函数
//key0~key7 显示0~7
//skey0~skey7 显示8~f
void key0(void)
{
//在LED0上显示数字0
COM=0x80; //参见8279手册 ,写显示RAM命令
DAT=table[0]; //参见8279手册 ,把table[0]数据送给数据口DAT
}
void key1(void)
{
COM=0x81;
DAT=table[1];
}
void key2(void)
{
COM=0x82;
DAT=table[2];
}
void key3(void)
{
COM=0x83;
DAT=table[3];
}
void key4(void)
{
COM=0x84;
DAT=table[4];
}
void key5(void)
{
COM=0x85;
DAT=table[5];
}
void key6(void)
{
COM=0x86;
DAT=table[6];
}
void key7(void)
{
COM=0x87;
DAT=table[7];
}
void key8(void)
{
COM=0x80;
DAT=table[8];
}
void key9(void)
{
COM=0x80;
DAT=table[9];
}
void key10(void)
{
COM=0x80;
DAT=table[10];
}
void key11(void)
{
COM=0x80;
DAT=table[11];
}
void key12(void)
{
COM=0x80;
DAT=table[12];
}
void key13(void)
{
COM=0x80;
DAT=table[13];
}
void key14(void)
{
COM=0x80;
DAT=table[14];
}
void key15(void)
{
COM=0x80;
DAT=table[15];
}
/*带shift功能按键*/
void skey0(void)
{
COM=0x80;
DAT=table[8];
}
void skey1(void)
{
COM=0x81;
DAT=table[9];
}
void skey2(void)
{
COM=0x82;
DAT=table[10];
}
void skey3(void)
{
COM=0x83;
DAT=table[11];
}
void skey4(void)
{
COM=0x84;
DAT=table[12];
}
void skey5(void)
{
COM=0x85;
DAT=table[13];
}
void skey6(void)
{
COM=0x86;
DAT=table[14];
}
void skey7(void)
{
COM=0x87;
DAT=table[15];
}
void skey8(void)
{
COM=0x87;
DAT=table[16];
}
void skey9(void)
{
COM=0x81;
DAT=table[1];
}
void skey10(void)
{
COM=0x81;
DAT=table[11];
}
void skey11(void)
{
COM=0x81;
DAT=table[12];
}
void skey12(void)
{
COM=0x81;
DAT=table[13];
}
void skey13(void)
{
COM=0x81;
DAT=table[14];
}
void skey14(void)
{
COM=0x81;
DAT=table[15];
}
void skey15(void)
{
COM=0x81;
DAT=table[0];
}
///////////////////////////////////////////////////////////////////////////////
//读取键盘数据,返回当前被按下的键号
uchar keyin(void)
{
uchar i;
COM=0x40; //读FIFO/传感器RAM的命令
i=DAT; //?? DAT原来存的是什么数据???
i=i&0x7f; //取键盘数据低7位
return(i);
}
sbit clflag=ACC^7;
bit int_flag=0; /*中断标志位*/
uchar key_value;/*中断返回键值*/
void main(void)
{
uchar i,j,k;
//////////////////////////////////////////////////////////////////////////////
//初始化单片机
AUXR = 0x02;/*STC单片机关内部RAM和开ALE*/
for(i=0;i<5;i++)
{
for(j=0;j<100;j++)
{
for(k=0;k<100;k++); //延时40ms
}
}
//////////////////////////////////////////////////////////////////////////////
//初始化8279
COM=0xd1;//1101 0001b 清除所有显示
do{ACC=COM;}
while(clflag==1); //清除起来比较慢,所以一条指令执行的时间不足以完成所有清除,故需等待
COM=0x01;COM=0x02; //??? COM=0x02???
IE=0x81;TCON=0x01; //CPU开中断,外部中断0 开中断;定时器控制 IT0=1 下降延触发方式
//////////////////////////////////////////////////////////////////////////////
//大循环
while(1)
{
while(int_flag==0) /*等待中断*/
{
//此处可填入后台程序
}
int_flag=0;
//根据键值调用键盘响应函数
switch(key_value)
{
case 0x40:key0();break;
case 0x41:key1();break;
case 0x42:key2();break;
case 0x43:key3();break;
case 0x48:key4();break;
case 0x49:key5();break;
case 0x4a:key6();break;
case 0x4b:key7();break;
case 0x50:key8();break;
case 0x51:key9();break;
case 0x52:key10();break;
case 0x53:key11();break;
case 0x58:key12();break;
case 0x59:key13();break;
case 0x5a:key14();break;
case 0x5b:key15();break;
case 0x00:skey0();break;
case 0x01:skey1();break;
case 0x02:skey2();break;
case 0x03:skey3();break;
case 0x08:skey4();break;
case 0x09:skey5();break;
case 0x0a:skey6();break;
case 0x0b:skey7();break;
case 0x10:skey8();break;
case 0x11:skey9();break;
case 0x12:skey10();break;
case 0x13:skey11();break;
case 0x18:skey12();break;
case 0x19:skey13();break;
case 0x1a:skey14();break;
case 0x1b:skey15();break;
default:break;
}
}
}
//INT0的中断服务函数
//INT0由8279在键盘按下时发出
//注意关键字interrupt
/*返回值-函数名-interrupt 对应中断源的编号 当前工作寄存器由PSW中的两位设置,
也可以使用using指定,指定使用,第n组寄存器,n=0~3*/
void int_int0() interrupt 0 using 0
{
//设置标志,告诉主循环中断发生了
int_flag=1;
//读取键值
key_value=keyin();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -