/********************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎访问我的USB专区:USB专区:http://home.cepark.com/space.php?do=mtag&tagid=108
欢迎访问我的blog: http:computer00.cepark.com
http://computer00.21ic.org
main.c file
作者:Computer-lov
建立日期:2007-11-20
修改日期:2007-11-20
版本:V1.0
版权所有,盗版必究。
Copyright(C) Computer-lov 2007-2017
All rights reserved
********************************************************************/
#include "AT89x52.H"
#include "USB.H"
#include "PDIUSBD12.H"
#include "My_type.h"
#include "UART.H"
#include "key.h"
#include "keyboard.h"
#include "led.h"
#define DispLineInf() \
{ \
Prints(" in file \""); \
Prints(__FILE__); \
Prints(", @ line "); \
PrintLongInt(__LINE__-1); \
Prints("\r\n"); \
}
//#define debug
#define USB_COMMAND_ADD 1
#define USB_DATA_ADD 0
//USB芯片连接引脚
#define USB_DATA P0
#define USB_A0 P3_5
#define USB_WR P3_6
#define USB_RD P3_7
#define USB_INT P3_2
#define ENDPOINT_NUMBER 2
#define MAX_CONTROL_DATA_SIZE 16
//控制传输时保存数据
CONTROL_DATA_BUFF Control_Data;
//缓冲
uint8 idata buffer[64];
//交换数据时用的指针
uint8 *pData;
uint8 idle; //空闲状态
uint8 protocol; //当前协议
//高低字节交换
#define SWAP16(x) ((((uint16)(x))<<8)|(((uint16)(x))>>8))
//取一个整数的低字节
#define LSB(x) ((uint8)(x))
//取一个整数的高字节
#define MSB(x) ((uint8)(((uint16)(x))>>8))
//字符串描述符所用的语言种类
code uint8 LANGUAGE_ID[4]={0x04,0x03,0x09,0x04};
//设备序列号
code uint8 device_serial_number[]=
{22,STRING_DESCRIPTOR,'2',0,'0',0,'0',0,'7',0,'-',0,'1',0,'1',0,'-',0,'2',0,'9',0};
//厂商字符串 电脑圈圈的USB专区 http://group.ednchina.com/93
//汉字Unicode编码,使用http://computer00.21ic.org/user1/2198/archives/2007/42769.html转换
code uint8 ManufacturerString[80]=
{80,STRING_DESCRIPTOR,0x35,0x75,0x11,0x81,0x08,0x57,0x08,0x57,0x84,0x76,'U',0x00,
'S',0x00,'B',0x00,0x13,0x4E,0x3A,0x53,0x20,0x00,'H',0,'t',0,'t',0,
'p',0,':',0,'/',0,'/',0,'g',0,'r',0,'o',0,'u',0,'p',0,'.',0,'e',0,'d',0,'n',0,
'c',0,'h',0,'i',0,'n',0,'a',0,'.',0,'c',0,'o',0,'m',0,'/',0,'9',0,'3',0};
//产品字符串 电脑圈圈的USB专区活动之USB键盘 http://group.ednchina.com/93
//汉字Unicode编码,使用http://computer00.21ic.org/user1/2198/archives/2007/42769.html转换
code uint8 ProducterString[96]=
{96,STRING_DESCRIPTOR,0x35,0x75,0x11,0x81,0x08,0x57,0x08,0x57,0x84,0x76,'U',0x00,
'S',0x00,'B',0x00,0x13,0x4E,0x3A,0x53,0x3B,0x6D,0xA8,0x52,0x4B,0x4E,'U',0x00,
'S',0x00,'B',0x00,0x2E,0x95,0xD8,0x76,0x20,0x00,'H',0,'t',0,'t',0,
'p',0,':',0,'/',0,'/',0,'g',0,'r',0,'o',0,'u',0,'p',0,'.',0,'e',0,'d',0,'n',0,
'c',0,'h',0,'i',0,'n',0,'a',0,'.',0,'c',0,'o',0,'m',0,'/',0,'9',0,'3',0};
code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //设备描述符
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小
DEVICE_DESCRIPTOR, //设备描述符类型编号
SWAP16(0x0110), //USB版本号,USB1.1
0x00, //USB分配的设备类代码
0x00, //USB分配的子类代码
0x00, //USB分配的设备协议代码
0x10, //端点0的最大包大小
SWAP16(0x8888), //厂商编号VID,这里只是作为测试用,请使用自己的VID
SWAP16(0x0001), //产品编号PID,这里只是作为测试用,请使用自己的PID
SWAP16(0x0001), //设备出厂编号
0x01, //设备厂商字符串的索引
0x02, //描述产品字符串的索引
0x03, //描述设备序列号字符串的索引
0x01 //可能的配置数量
};
//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
{
CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
INTERFACE_DESCRIPTOR_STRUCT interface_descriptor;
HID_DESCRIPTOR_STRUCT hid_descriptor;
ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小
CONFIGURATION_DESCRIPTOR, //配置描述符类型编号
SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
0x01, //只包含一个接口
0x01, //该配置的编号
0x00, //iConfiguration字段
0xA0, //采用总线供电,支持远程唤醒
0xC8 //从总线获取最大电流400mA
},
//interface_descritor //接口描述符
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小
INTERFACE_DESCRIPTOR, //接口描述符类型编号
0x00, //接口编号为0
0x00, //该接口描述符的编号
ENDPOINT_NUMBER, //非0端点数量为2,只使用端点主端点输入和输出
0x03, //人机接口设备(HID)类
0x01, //使用的子类:支持BIOS根启动Boot的子类
0x01, //使用的协议:键盘
0x00 //接口描述符字符串索引
},
//hid_descriptor
{
sizeof(HID_DESCRIPTOR_STRUCT), //HID描述符的字节数大小
HID_DESCRIPTOR, //HID描述符类型编号
SWAP16(0x0110), //HID类协议版本号,为1.1
0x21, //固件的国家地区代号,0x21为美国
NUM_SUB_DESCRIPTORS, //下级描述符的数量
{
{
REPORT_DESCRIPTOR, //下级描述符为报告描述符
SWAP16(sizeof(KeyBoardReportDescriptor)) //下级描述符的长度
}
},
},
//endpoint_descriptor[]
{
{ //主端点输入描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小
ENDPOINT_DESCRIPTOR, //端点描述符类型编号
MAIN_POINT_IN, //端点号,主输入端点
ENDPOINT_TYPE_INTERRUPT, //使用的传输类型:中断传输
SWAP16(0x0040), //该端点支持的最大包尺寸,64字节
0x0A //中断扫描时间:设置为10ms
},
{ //主端点输出描述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小
ENDPOINT_DESCRIPTOR,
没有合适的资源?快使用搜索试试~ 我知道了~
USBkey.rar_num lock_usb keypad_usbkey _单片机_单片机 输入法
共27个文件
h:9个
c:3个
lst:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 139 浏览量
2022-09-22
18:52:58
上传
评论
收藏 95KB RAR 举报
温馨提示
用单片机做的USB开发板的键盘程序 开发板上共有8个按键,功能分别为: K1:左Ctrl键 K2:左Shift键 K3:左Alt键 K4:0键 K5:1键 K6:2键 K7:Caps Lock键 K8:Num Lock键 按键功能测试: 同时按下K1和K2可做输入法切换,这跟键盘上的两个键功能一样的。 K7可打开大写字母锁定,同时LED2亮起。K8是小数字键盘锁定键, 当数字键盘打开时,LED1亮起,这时可用K4,K5,K6输入数字。 请留意EDN板上的LED会跟你自己的键盘上的LED灯同步。不管按哪块 键盘切换都是如此。不过按住切换键不放,可能会导致两块键盘之间 的LED失步。
资源推荐
资源详情
资源评论
收起资源包目录
USBkey.rar (27个子文件)
SourceCode
UsbKeyBoard.Uv2 2KB
UART.c 5KB
config.h 748B
UsbKeyBoard.plg 223B
Key.OBJ 6KB
Key.c 3KB
UsbKeyBoard 71KB
UsbKeyBoard.M51 61KB
UsbKeyBoard.OBJ 68KB
UART.LST 9KB
UsbKeyBoard_Uv2.Bak 2KB
LED.h 1KB
UsbKeyBoard.LST 62KB
UsbKeyBoard.hex 17KB
UART.OBJ 8KB
Key.LST 5KB
UsbKeyBoard.lnp 79B
AT89X52.H 6KB
Key.h 1KB
USB.H 7KB
UsbKeyBoard.c 38KB
UsbKeyBoard.Opt 2KB
My_type.h 930B
UART.h 874B
UsbKeyBoard_Opt.Bak 2KB
PDIUSBD12.h 3KB
keyboard.h 2KB
共 27 条
- 1
资源评论
周楷雯
- 粉丝: 92
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于activiti6和jeesite4的dreamFlow工作流管理设计源码
- 基于Python实现的简单植物大战僵尸脚本设计源码
- 基于Java及Web技术的医药管理系统设计源码
- 基于Objective-C的cordova-plugin-wechat插件开发源码研究
- 基于Python语言的SocialNetworkBackend社交数据分析系统后端设计源码
- 基于Python的pytracking-master目标跟踪dimp方法设计源码
- 基于PHP、JavaScript、CSS的zibll主题美化插件设计源码
- 毕业设计之mimo系统中中最大比合并和空时编码的性能研究
- 本程序对基于matlab对NOMA系统中经典多用户功率分配算法进行了研究
- Phone-1.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功