【陈旧的事(08.4.15前)】毕设元素[不断更新中……]

 感谢高中同窗··同学大力帮助!!

主要实现以下三个模块:

    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();
        /* 字符为一个有效值 */
  
 ……………………后续程序 预知者请与本博联系
/*
恶搞一下!往常我在网上查找代码,都是不够全面的,上次还找到一个,结果到中间来了一句“后续代码请于作者联系”,所以程序为尊重作者劳动,省去一部分。*/

    }
}

57056
赖皮猪 发表于5/26/2007 2:36:17 PM
View blogs in this category:陈旧的事(08.4.15前)


幽幽 在 5/28/2007 5:34:13 PM 说:
天书

鉴定完毕!

卡布其诺 在 5/28/2007 8:52:32 AM 说:

想当年了

幽幽 在 5/27/2007 11:47:17 PM 说:
看看就算了!

格格巫 在 5/26/2007 11:21:16 PM 说:
专业

玉指星魂 在 5/26/2007 7:22:56 PM 说:
嘿嘿 不懂 ~~

Please leave your comment here   大名:
  主页:
  内容: