📄 keybordcontrol.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include <AT89x51.H>
#include <stdio.h>
#include<intrins.h>
//给出显示闪烁初值
#define DB_val 200
//定义显示口
sfr Disp_data=0x80;
sbit FLASH=P1^0;
/*sbit A=P1^0; //设置按键输入*/
sbit BC=P1^1; //选择按键输入
sbit C=P1^2; //显示使能输出
sbit D=P1^3; //显示寄器选择输出
sbit E=P1^4; //显示模式输出
sbit F=P1^5;
sbit G=P1^6;
sbit H=P2^4;
//定义keybordrow add keyboedcol
sfr keybord_row=0xA0;
sfr keybord_col=0xB0;
//定义LED显示字段码
//static struct
// {
// uchar assii;
// uchar stroke;
// } code led_strokes[27]=\
// {{'0',0x3f},{'1',0x06},{'2',0x5b},{'3'}
// }
//函数声明
void init_sys(void); //初始化系统
uchar disp_read(void); //独出显示数据
uchar get_ch(void); //键盘输入函数
//uchar get_str(uchar * , uint )
void delay(int); //延迟时间函数
bit kb_hit(void); //判断是否有键按下
//void put_0ff_leds(void);//关显示
//void put_on_leds(void); //开显示
void monitor(uchar);
void interface_out(void); //输出接口扫描from 00000 to 11111
void switch_power(void); //put off switch_power
//void main1(void);
/*********************************************************************
函数原型:void put_0n_leds(void)
功 能:初始化系统
*********************************************************************
void put_on_leds(void)
{
;
}
*/
/*********************************************************************
函数原型:void put_off_leds(void)
功 能:初始化系统
*********************************************************************
void put_off_leds(void)
{
Disp_data=Disp_data&&0x0f;
}
*/
//延时程序
void delay(int delayValue)
{
int i;
for(i=0;i<delayValue;i++)
{};
}
/*********************************************************************
函数原型:void init_sys(void)
功 能:初始化系统
*********************************************************************/
void init_sys(void)
{
uint j;
//系统初始化,开显示并显示8888
Disp_data=0xF8;
FLASH=0;
for(j=0;j<=DB_val;j++)
{delay(100);};
//系统初始化,关显示
Disp_data=disp_read()&0xF0;
FLASH=1;
//系统初始化,开显示并显示8888
for(j=0;j<=DB_val;j++)
{delay(100);};
Disp_data=0xF8;
FLASH=0;
}
/*********************************************************************
函数原型:void disp_read(void)
功 能:初始化系统
*********************************************************************/
uchar disp_read(void)
{
uchar value;
Disp_data=0x0FF;
value=Disp_data;
return(value);
}
/*********************************************************************
函数原型:void get_ch(void)
功 能:读出按键值
*********************************************************************/
uchar get_ch(void)
{
uchar row=0,col=0;
uchar mask;
uchar rmask;
uchar pic;
// uchar pc;
keybord_row=0xff;
keybord_col=0xff;
mask=keybord_row&0xfe; //使第1列线为0
rmask=keybord_row&0xdf;
if(!kb_hit()) return(0); //无键按下,输入不成功,返回0。
//分析按键所在的列号。
keybord_row=mask; //使第1列线为0
while(((keybord_col&0x1f)==0x1f)&&(mask>rmask))
{
++col;
mask=_crol_(mask,1);
keybord_row=mask;
}
//分析按键所在的行号
pic=keybord_col&0x1f;
mask=0x01;
while(pic&mask)
{
++row;
mask=_crol_(mask,1);
}
//等待按键释放。
while((keybord_col&0x1f)!=0x1f);
keybord_row=keybord_row|0x1f;
//计算按键列号
pic=(row*5)+col;
//P1=~(pic&0x03F);
switch(pic&0x3f)
{
//case 0: break;
//case 1: P1=~2;
//case 2: P1=~4;
//case 3: P1=~8;
// case 4: P1=~16;
// case 5: P1=~32;
// case 6: P1=~64;
// case 7: P1=~128;
// case 8: P1=~256;
// case 9: P1=~512;
// case 10: P1=~1024;
// case 11: P1=~2048;
case 12: switch_power(); break;
case 13: interface_out(); break;
// case 14: P1=~16384;
default: P1=~(pic&0x03F);
}
return(pic);
}
/*********************************************************************
函数原型:* get_str(uchar * str, uchar len);
功 能:
*********************************************************************
uchar get_str(uchar * str, uint len)
{
/*uchar pdata i;
uchar pdata ch;
uchar pdata keybord_buf[14]; //define keybord buffer
uchar pdata ledbuf_pos=0,keybuf_pos=0; //clear display buffer
set_led_buf(ox00,0,8);
while(keybuf_pos<len)
{
put_on_leds();
ch=get_ch;
/*如果成功,将显示buffer/
if(ch)
{
for(i=ledbuf_pos;i>0;i--)
led_buf[i]=led_buf[i-1];
led_buf[0]=ch;
if(++ledbuf_pos>7) ledbuf_pos=7;
keybord_buf[keybuf_pos++]=ch;
}
}
for(i=0;i<255;i++) put_on_leds();
memcopy(str,keybord_buf,len);
return(str);*
;
}
/*********************************************************************
函数原型:bit kb_hit(void);
功 能:
*********************************************************************/
bit kb_hit(void)
{
uchar kb_row;
uchar kb_col;
keybord_row=0x0ff;
keybord_col=0x0ff;
kb_row=keybord_row&0xe0; //往矩正列线送0
keybord_row=kb_row;
kb_col=keybord_col; //读出行线状态
if((keybord_col&0x1f)==0x1f) //输入并见检查行线
return((bit) 0); //行线为1则还回0
delay(500);
if((keybord_col&0x1f)==0x1f)
return((bit) 0);
return((bit) 1);
}
/*********************************************************************
函数原型:void monitor(void)
功 能:初始化系统
*********************************************************************/
void monitor(void)
{
// uchar command;
//uchar key;
//get_ch(uchar pc);
while(1)
{
//put_on_leds();
//if(message_time==0)
//{message_flag=0;
//auto_flush=1;
//}
//if(get_ch()){;};
//P1=0xff;
//key=pic;
/*switch(pic)
{
case 0: P1=~1;
case 1: P1=~2;
case 2: P1=~4;
case 3: P1=~8;
case 4: P1=~16;
case 5: P1=~32;
case 6: P1=~64;
case 7: P1=~128;
case 8: P1=~256;
case 9: P1=~512;
case 10: P1=~1024;
case 11: P1=~2048;
case 12: P1=~4096;
case 13: P1=~8192;
case 14: P1=~16384;
}*/
get_ch();
}
}
/*********************************************************************
函数原型:void interface_out(void)
功 能:初始化系统
*********************************************************************/
void interface_out(void)
{
uchar j,k;
k=P1&0xe0;
for(j=0;j<64;j++)
{
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
delay(500);
//P1=0xff;
// k=P1;
P1=(~(j&0x1f))|k;
};
}
/*********************************************************************
函数原型:void swtich_power(void)
功 能:初始化系统
*********************************************************************/
void switch_power(void)
{
F=0;
}
//主菡数
main()
{
init_sys();
monitor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -