📄 训练项目七:键盘的使用._c
字号:
/****************************************************************************
** File Name: 键盘的使用
** Createed By: Wangchangsong
** Create Date: 07/28/2008
** Version: 1.0
** Descriptions: led display
**
**---------------------------------------------------------------------------
** Modified By:
** Modified Date:
** Version:
** Descriptions:
**
****************************************************************************/
#include <iom128v.h>
#define data (PIND&0x04)==0x04
/* 判断PD2是否为1 */
#define set_cs asm("sbi 0x18,2")
/* PB输出为1 */
#define set_clk asm("sbi 0x18,3")
/* PB3输出为1 */
#define set_data asm("sbi 0x12,2")
/* PD2输出为1 */
#define cl_cs asm("cbi 0x18,2")
/* PB2输出为0 */
#define cl_clk asm("cbi 0x18,3")
/* PB3输出为0 */
#define cl_data asm("cbi 0x12,2")
/* PD2输出为0 */
#pragma interrupt_handler key_check:5
/* 外部中断3 */
unsigned char k = 0x00;n = 0;
/****************************************************************************
** Function Name: main
** Descriptions:
** Input Parameters: uiTime
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void main()
{
unsigned char i = 0;
init_7279();
s_delay();
send (0xA4);
/* 复位 */
while(1)
{
switch(k)
{
case 65:set_cs;send(0xc8);send(0x00);break; /*下载数据且按方式1译码 */
case 66:set_cs;send(0xc8);send(0x01);break;
case 67:set_cs;send(0xc8);send(0x02);break;
case 68:set_cs;send(0xc8);send(0x03);break;
case 73:set_cs;send(0xc8);send(0x04);break;
case 74:set_cs;send(0xc8);send(0x05);break;
case 75:set_cs;send(0xc8);send(0x06);break;
case 76:set_cs;send(0xc8);send(0x07);break;
case 81:set_cs;send(0xc8);send(0x08);break;
case 82:set_cs;send(0xc8);send(0x09);break;
case 83:set_cs;send(0xc8);send(0x0A);break;
case 84:set_cs;send(0xc8);send(0x0B);break;
case 89:set_cs;send(0xc8);send(0x0C);break;
case 90:set_cs;send(0xc8);send(0x0D);break;
case 91:set_cs;send(0xc8);send(0x0E);break;
case 92:set_cs;send(0xc8);send(0x0F);break;
default:break;
}
}
}
/****************************************************************************
** Function Name: key_check
** Descriptions: read the key
** Input Parameters: K
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void key_check()
{
n=1;
send(0x15); /* 读键盘指令 */
k=receive()+61;
set_cs;
}
/****************************************************************************
** Function Name: led_init
** Descriptions:
** Input Parameters: uiTime
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void led_init (void)
{
DDRB|= 0x0C; /* PB0和PB1为输入 */
set_cs;
send (0xA4);
}
/****************************************************************************
** Function Name: init_7279
** Descriptions: initialization
** Input Parameters: uiTime
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void init_7279()
{
SREG|=0x80; /* 状态寄存器,全局中断允许 */
EIMSK|=0x08; /* 外部中断屏蔽寄存器 */
EICRA&=0x3f; /* 外部中断控制寄存器A,INTn的上
升沿产生一个异步终端请求 */
DDRD&=0xf7; /* PD3为输入 */
DDRB|=0x0c;
PORTD&=0xfb; /* PD2输出为1 */
}
/****************************************************************************
** Function Name: send
** Descriptions: date read and write
** Input Parameters:
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void send (unsigned char out_data)
{
unsigned char i;
DDRD|=0x04; /* PD2为输出 */
cl_cs; /* PB2输出为0 */
l_delay();
for(i=0;i<8;i++)
{
if(out_data&0x80)
{
set_data; /* PD2输出为1 */
}
else
{
cl_data; /* PD2输出为0 */
}
s_delay();
set_clk;
s_delay();
cl_clk;
s_delay();
out_data*=2; /* 数据向左移一位 */
}
cl_data;
}
unsigned char receive(void)
{
unsigned char i;
unsigned char in_data=0x00;
DDRD&=0xfb;
/* PD2为输入 */
for(i=0;i<8;i++)
{
set_clk;
s_delay();
in_data*=2; /* 数据左移一位 */
if(data)
{
in_data|=0x01;
}
cl_clk;
s_delay();
}
cl_data;
return(in_data);
}
/****************************************************************************
** Function Name: delay_1ms
** Descriptions: delay time
** Input Parameters: i
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void delay_1ms(void) /* 延时 */
{
unsigned int i;
for (i=0;i<2260;i++);
}
/****************************************************************************
** Function Name: delay_nms
** Descriptions: delay time
** Input Parameters: n
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void delay_nms(unsigned int n) /* 延时 */
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
/****************************************************************************
** Function Name: l_delay
** Descriptions: delay time
** Input Parameters: i
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void l_delay() /* 延时 */
{
unsigned char i=33;
while(i!=0)
{
i--;
}
}
/****************************************************************************
** Function Name: s_delay
** Descriptions: delay time
** Input Parameters: i
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void s_delay() /* 延时 */
{
unsigned char i=11;
while(i!=0)
{
i--;
}
}
/****************************************************************************
END FILE
****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -