感谢高中同窗··同学大力帮助!!
主要实现以下三个模块:
1\键盘信号线驱动(获取键盘码)
2\对键盘码存储
3\与pc通信协议
/***************************************************************
文件名: main.c
目的 :主函数文件
作者 :··
日期 :2007-05-26
*****************************************************************/
#include <reg51.h>
typedef unsigned int DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE;
/* 对信号线引脚的定义 */
#define DATA_PIN P0_0 /* 数据信号线,p0.0端口 */
#define CLK_PIN P0_1 /* 时钟线 ,p0.1端口*/
/* 对信号设置 */
#define HIGH 1 /* 高电平 */
#define LOW 0 /* 低电平 */
/* 对频率控制 */
#define MAX_DELAY_NUM 10 /* 暂定为10 */
/* 当前采用了12bit通信
bit 0: 起始bit,固定为0
bit 1-8: 数据,低位在前
bit 9: 奇校验位,奇数个1,该bit为0,偶数个1,该bit为1
bit 10: 1bit停止位,固定填0
bit 11: ack bit
*/
#define MAX_BIT_NUM 12 /* 采用12bit通信 */
/* 对固定位置的校验 */
#define START_BIT 0 /* 起始位,固定填0 */
#define INVALID_START_BIT 1 /* 无效的起始位 */
#define END_BIT 1 /* 结束位,固定填1 */
#define INVALID_END_BIT 0 /* 无效的结束位 */
#define ODD_ONE 0 /* 奇数个1 */
#define EVEN_ONE 1 /* 偶数个1 */
#define RETURN_INVALID_START_BIT -1 /* 起始bit错误 */
#define RETURN_INVALID_END_BIT -2 /* 结束bit错误 */
#define RETURN_INVALID_PARTY -3 /* 奇偶校验失败 */
#define SUCCESS 0 /* 成功 */
#define FAILED 1 /* 读取失败 */
#define DATA_BIT_NUM 8 /* 有效数据的bit个数 */
/* 存放键盘数据缓冲区,目前只能存放5个 */
#define KEY_WORD_BUF_SIZE 5 /* 键盘字符缓冲区大小 */
BYTE g_aucKeyWordBuf[KEY_WORD_BUF_SIZE]; /* 字符缓冲区 */
/* 当前已经接收的字符个数 */
BYTE g_ucKeyWordCount; /* 字符存放个数计数器 */
/* 异常计数器,可以在调试的时候使用 */
BYTE g_ucStartBitErr = 0; /* 起始bit正确 */
BYTE g_ucEndBitErr = 0; /* 结束bit错误 */
BYTE g_ucParityBitErr= 0; /* 奇偶bit正确 */
/* 函数声明部分 */
void Delay(DWORD time);
sbit SimClkUp();
/***********************************
函数名: Delay
参数: time:延时的次数
返回参数: none
作用: 延时
历史: 2007-05-26创建
***********************************/
void Delay(DWORD time)
{
int i;
/* 什么也不做,只是做延时使用 */
for(i = time;i > 0;i--);
}
/***********************************
函数名: SimClkUp()
参数: 1bit的信号
返回参数: none
作用: 模拟一次时钟,在上跳延并获取1bit的采样信号
历史: 2007-05-26创建
***********************************/
sbit SimClkUp()
{
/* 延时用来保证频率 */
Delay(MAX_DELAY_NUM);
CLK_PIN = LOW;
/* 延时用来保证频率 */
Delay(MAX_DELAY_NUM);
CLK_PIN = HIGH;
return DATA_PIN;
}
/***********************************
函数名: GetOneChar
参数: None
返回参数: 字符
-1表示起始bit错误
-2表示结束bit错误
-3表示校验位错误
0-255 表示获取有效字符
作用: 获取一个有效字符
历史: 2007-05-26创建
***********************************/
WORD GetOneChar()
{
sbit bCurBit; /* 当前的bit */
sbit bParityBit; /* 校验位 */
BYTE ucData = 0; /* 输入的数据 */
BYTE ucCountOne = 0; /* 用于计算有多少个1 */
WORD uwRet = 0; /* 返回值 */
BYTE i;
/* 获取1bit */
bCurBit = SimClkUp();
/* 检查 是否无效 */
if(INVALID_START_BIT == bCurBit)
{
g_ucStartBitErr++;
RETURN_INVALID_START_BIT;
}
/* 获取数据 */
for(i = 0;i < DATA_BIT_NUM;i++)
{
bCurBit = SimClkUp();
/* 检查一的个数 */
if(1 == bCurBit)
{
/* 需要将最高位设置为1 */
ucData |=0x80;
ucCountOne++;
}
/* 右移1位 */
ucData >>= 1;
}
/* 获取校验位 */
bParityBit= SimClkUp();
/* 获取结束bit */
bCurBit = SimClkUp();
while(bCurBit != END_BIT)
{
uwRet = INVALID_END_BIT;
bCurBit = SimClkUp();
}
/* 输出失败 */
if(uwRet != SUCCESS)
{
g_ucEndBitErr++;
DATA_PIN = FAILED;
SimClkUp();
return uwRet;
}
else
{
DATA_PIN = SUCCESS;
SimClkUp();
}
/* 检查奇偶校验 */
/* 有偶数个1 */
if((ucCountOne%2) == 0)
{
if(bParityBit == EVEN_ONE)
{
uwRet = ucData;
return uwRet;
}
else
{
g_ucParityBitErr++;
RETURN_INVALID_PARTY;
}
}
else
{
if(bParityBit == ODD_ONE)
{
uwRet = bParityBit;
return uwRet;
}
else
{
g_ucParityBitErr++;
RETURN_INVALID_PARTY;
}
}
}
/***********************************
函数名: main
参数: 无
返回参数: none
作用: 不停的读取字符,同时记录到字符缓冲区中
历史: 2007-05-26创建
***********************************/
void main()
{
WORD usRet;
/* 获取字符 */
while(1)
{
usRet = GetOneChar();
/* 字符为一个有效值 */
……………………后续程序 预知者请与本博联系
/* 恶搞一下!往常我在网上查找代码,都是不够全面的,上次还找到一个,结果到中间来了一句“后续代码请于作者联系”,所以程序为尊重作者劳动,省去一部分。*/
}
}
View blogs in this category:陈旧的事(08.4.15前)

鉴定完毕!
想当年了