📄 ymain.c
字号:
/*8279键盘和 LED显 示程序* /
/*此程序响应8279的键盘中断,并根据按键来更新LED 显示 */
#include<reg51.h>
#include<absacc.h>
#include<yh.h>
bit int_flag=0; /*中断标志位*/
uchar key_value;/*中断返回键值 */
uchar js;
/*共阴的七段数码管译码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};
uchar code sinbo[]={0x80,0x83,0x86,0x8D,0x90,0x96,0x99,0x9C,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,
0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,
0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,
0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,
0xf1,0xef,0xee,0xec,0xeb,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xdf,0xdd,0xda,0xd8,0xd6,
0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,
0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x7c,
0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,
0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,
0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,
0x07,0x06,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,
0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,
0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,
0x5b,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
///////////////////////////////////////////////////////////////////////////////
//读取键盘数据,返回当前被按下的键号
uchar keyin(void)
{
uchar i;
COM8279=0x40;
i=DAT8279;
i=i&0x3f; //取键盘数据低7位
return(i);
}
void main(void)
{
//////////////////////////////////////////////////////////////////////////////
//初始化单片机
AUXR = 0x02;/*STC单片机关内部RAM和开ALE*/
delay(1000);
//////////////////////////////////////////////////////////////////////////////
//初始化8279
COM8279=0xd1;//1101 0001b 清除所有显示
do{ACC=COM8279;}
while(clflag==1); //清除起来比较慢,所以一条指令执行的时间不足以完成所有清除,故需等待
COM8279=0x00;
DA0832=0;
COM8255=0x80; //pa,pb以方式0工作,三个口都是输出
COM8255=0x80;
COM8255=0x80;
IE=0x83; //开中断
// IE=0x81;
TCON=0x01;
TMOD=0x00; //用定时器0,方式0
TH0=0x0F4;
TL0=0x010;
TR0=1;
//////////////////////////////////////////////////////////////////////////////
//大循环
while(1)
{
while(int_flag==0) /*等待中断 */
{
//此处可填入后台程序
}
int_flag=0;
//根据键值调用键盘响应函数
switch(key_value)
{
case 0x00:key0();break;
case 0x01:key1();break;
case 0x02:key2();break;
case 0x03:key3();break;
case 0x08:key4();break;
case 0x09:key5();break;
default:break;
}
}
}
//INT0的中断服务函数
//INT0由8279在键盘按下时发出
//注意关键字interrupt
void int_int0() interrupt 0 using 0
{
//设置标志,告诉主循环中断发生了
int_flag=1;
//读取键值
key_value=keyin();
}
void DA_time0() interrupt 1 using 1
{
TR0=0;
TH0=0x0F4;
TL0=0x010;
//DA0832 5Hz 正弦波输出
DA0832=sinbo[js];
js++;
if(js==251)
js=0;
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -