📄 lesson8.c
字号:
/*-------------------------------------------------------------/
// 51接收光电旋钮信号 发送键值编码
//按键中断 int0,1
// 扫描旋钮扭动
/*------------------------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
//键盘以及PS2接口
sbit PS_DATA=P0^0; //用P0。0 Z做数据线
sbit PS_CLK=P0^1; //用p0.1做时钟线
sbit key_an=P3^2; //确定键
sbit key_down=P3^3; //向上旋动
sbit key_up=P3^4; //向下旋动
sbit beep=P2^3; //蜂鸣器指示
uint En_num; //按键时间间隔计数
uchar key_flag; //按键时间差标志 循环次数标志
uchar num,count,send_flag;
uint n_flag,AD_count;
uchar Plus_send(); //发送脉冲
void delayus(unsigned int us)
{
while(--us) ;
}
void Delay1ms(unsigned int x)//延时1ms
{
unsigned char j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
//液晶初始化+++定时器+++中断 初始化
void init()
{
send_flag=0;
AD_count=0;
n_flag=18; //脉宽量程 标志
num=0;
count=0;
key_flag=1;
En_num=0;
// 定时器+++中断 初始化
TMOD=0x22;//设置定时器1为工作方式2 (做串口波特率发生器 ) 定时器T0工作方式 2(按键时间间隔)
TH1=0xfd; //初值 波特率9600
TL1=0xfd;
TH0=0; //计数256us
TL0=0;
TR1=1; //启动定时器
TR0=1; //启动定时器
ET0=1;
EA=1; //所有中断 允许
EX0=1; //允许INT 0
EX1=1; //允许INT 0
}
/****************************************************/
//PS/2发送函数
// 发送一个编码
/****************************************************/
void PS_send(uchar x)
{
uchar i,temp,char_temp;
bit flag_check=1; //奇数偶校验位
Delay1ms(3);
temp=x;
for(i=0;i<8;i++)
{
char_temp=temp&0x01;
if(char_temp==0x01)
{
flag_check=!flag_check; //获得奇偶校验位
}
temp=temp>>1;
}
PS_CLK=1;
while(!PS_CLK)
{
;
}
PS_CLK=1;
PS_DATA=1;
if(PS_CLK==1)
{
delayus(30);
}
////提示发送开始
if(PS_CLK==1&&PS_DATA==1)
{
PS_DATA=0; //起始位为0
delayus(10);
PS_CLK=0;
delayus(5);
temp=x;
for(i=0;i<8;i++) //发送8位数据位
{
PS_CLK=1;
delayus(5);
char_temp=temp&0x01;
if(char_temp==0x01)
{PS_DATA=1;}
else
{PS_DATA=0;}
delayus(10);
PS_CLK=0;
delayus(5);
temp=temp>>1;
}
PS_CLK=1;
delayus(5);
PS_DATA=flag_check; //发送奇偶校验
delayus(10);
PS_CLK=0;
delayus(5);
PS_CLK=1;
delayus(5);
PS_DATA=1; //发送停止位
delayus(10);
PS_CLK=0;
delayus(5);
PS_CLK=1;
}
delayus(30);
PS_CLK=1;PS_DATA=1;
if(PS_CLK==1&&PS_DATA==0)
{
return;
}
}
void main()
{
init();
while(1)
{
if(key_up==1&key_down==1)
{
while(key_up);
if(key_down==1)
{
PS_send(0xE0);
PS_send(0x75);
}
else
{
PS_send(0xE0);
PS_send(0x72);
}
}
}
}
/**********************************/
// 发送负脉冲
// n_flag 设定发送的量程
/**********************************/
void timer0() interrupt 1 //定时器0中断为中断1
{
En_num++;
if(En_num>=1000) //1秒
{
En_num=0;
key_flag=0;//表示超过了时间差
}
}
//脉宽增加--按键中断
void int_key_up() interrupt 0//外部中断0为中断0
{
EX0=EX1=0;//先关外部中断0
Delay1ms(10);
if(key_an==0) //延时消抖 key_up是按键 应管脚 。
{
if(key_flag==0) //时间间隔超过0.5S
{
PS_send(0x0D); //发送Tab
key_flag=1;
En_num=0;
}
else
{
PS_send(0x5A); //发送enter 5a 29
En_num=0;
}
}
while(!key_an);
EX0=EX1=1;//重新开外部中断
}
//脉宽减少-按键中断
void int_key_down() interrupt 2//外部中断1是中断2
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -