ch451按键程序,求检查

2020-01-14 18:57发布

#define CH451_RESET     0x0201                           //复位
#define CH451_LEFTMOV   0x0300                            //设置移动方式-作移
#define CH451_LEFTCYC   0x0301                            //设置移动方式-左循
#define CH451_RIGHTMOV  0x0302                            //设置移动方式-右移
#define CH451_RIGHTCYC  0x0303                            //设置移动方式-右循       
#define CH451_SYSOFF    0x0400                      //关显示、键盘、看门狗
#define CH451_SYSON1    0x0401                      //开显示
#define CH451_SYSON2    0x0403                      //开显示、键盘
#define CH451_SYSON3    0x0407                      //开显示、键盘、看门狗功能
#define CH451_DSP       0x0500                      //设置默认显示方式
#define CH451_BCD       0x0580                      //设置BCD译码方式
#define CH451_TWINKLE   0x0600                            //设置闪烁控制
#define CH451_DIG0      0x0800                      //数码管位0显示
#define CH451_DIG1      0x0900                            //数码管位1显示
#define CH451_DIG2      0x0a00                            //数码管位2显示
#define CH451_DIG3      0x0b00                            //数码管位3显示
#define CH451_DIG4      0x0c00                            //数码管位4显示
#define CH451_DIG5      0x0d00                            //数码管位5显示       
#define CH451_DIG6      0x0e00                            //数码管位6显示       
#define CH451_DIG7      0x0f00                            //数码管位7显示
#define CH451_KEY      0x0700            //读键盘代码
#include <reg51.h>

//如果使用键盘中断请定义
#define  USE_KEY  1
#define  uchar unsigned char
#define  uint unsigned int
//须主程序定义的参数
sbit   ch451_load=P1^2;
sbit   ch451_din=P1^0;
sbit   ch451_dclk=P1^1;                    //串行数据时钟上升延激活
                                               // 串行数据输出,接CH451的数据输入
                                          //串行命令加载,上升延激活
sbit   ch451_dout=P3^3;                        //INT1,键盘中断和键值数据输入,接CH451的数据输出
uchar  ch451_keyzhi;                                // 存放键盘中断中读取的键值
uint code DigCode[8]={CH451_DIG0,CH451_DIG1,CH451_DIG2,CH451_DIG3,
                      CH451_DIG4,CH451_DIG5,CH451_DIG6,CH451_DIG7};
//共阴数码管编码表
uchar code DSYCode[18]={0x3F,0x06,0x5B,0x4F,//0,1,2,3
                        0x66,0x6D,0x7D,0x07,//4,5,6,7
                        0x7F,0x6F,0x77,0x7C,//8,9,A,b
                        0x39,0x5E,0x79,0x71,//C,d,E,F
                        0x40,0x00};//-,全灭
//键盘编码表
uchar code KeyCode[16]={0x40,0x41,0x42,0x43,//0,1,2,3
                        0x48,0x49,0x4A,0x4B,//4,5,6,7
                        0x50,0x51,0x52,0x53,//8,9,A,B
                        0x58,0x59,0x5A,0x5B};//C,D,E,F

//*************************************************
//延时程序
void delay()
{                                        //在12P下延时十毫秒
        uchar i,j,k;
    for(i=0;i<10;i++)
            for(j=0;j<60;j++)
                for(k=0;k<120;k++);
}

//初始化子程序

void ch451_init()
{
        P1=0x60;
        ch451_din=0;
    ch451_dclk=1;                     //先低后高,选择4线输入
    ch451_din=1;
    ch451_load=1;
    ch451_dout=1;
    #ifdef USE_KEY
    EA=1;
          IT1=0;                                          //设置下降沿触发
    IE1=0;                                          //清中断标志
    PX1=0;                                          //设置低优先级
    EX1=1;                                          //开中断
    #endif
}
//*****************************************************

//输出命令子程序
//定义一无符号整型变量存储12字节的命令字。
void ch451_write(uint command)
{
    unsigned char i;
        #ifdef USE_KEY
    EX1=0;                                         //禁止键盘中断
    #endif       
    ch451_load=0;                                  //命令开始      
    for(i=0;i<12;i++)
        {                             //送入12位数据,低位在前
            ch451_din=command&1;                               
            ch451_dclk=0;
            command>>=1;
            ch451_dclk=1;                               //上升沿有效
        }
    ch451_load=1;                                 //加载数据
    #ifdef USE_KEY
    EX1=1;
    #endif
}

#ifdef USE_KEY

//*************************************************
//输入命令子程序,MCU从451读一字节
unsigned char ch451_read()
{
        unsigned char i;
    unsigned char command,keycode;                //定义命令字,和数据存储器
    EX1=0;                                       //关中段       
    command=0x07;                                       //输入读451命令字       
    ch451_load=0;
    for(i=0;i<4;i++)
        {
            ch451_din=command&1;                      //送入最低位
            ch451_dclk=0;                         
            command>>=1;                              //往右移一位
            ch451_dclk=1;                              //产生时钟上升沿锁通知CH451输入位数据
        }
    ch451_load=1;                                      //产生加载上升沿通知CH451处理命令数据
    keycode=0;                                      //清除keycode
    for(i=0;i<7;i++){
    keycode<<=1;                              //数据移入keycode,高位在前,低位在后
    keycode|=ch451_dout;                      //从高到低读入451的数据
    ch451_dclk=0;                              //产生时钟下升沿通知CH451输出下一位
    ch451_dclk=1;
}
    IE1=0;                                      //清中断标志
    EX1=1;
    return(keycode);                             //反回键值
}
//*************************************************
//中断子程序  使用中断2,寄存器组1
//CH451显示一位数码管,DIG选择数码管,要显示的数据,
void CH451_DisplayDig(uchar DIG,uchar Data,uchar Point){
  if(Point==1){
    ch451_write(DigCode[DIG]|(DSYCode[Data]|0x80));
  }else{
    ch451_write(DigCode[DIG]|DSYCode[Data]);
  }
}

void ch451_inter() interrupt 2 using 1
{
        unsigned char i;                              //定义循环变量
    unsigned char command,keycode;              //定义控制字寄存器,和中间变量定时器
    command=0x07;                                      //读取键值命令的高4位0111B
    ch451_load=0;                                      //命令开始
    for(i=0;i<4;i++)
        {
            ch451_din=command&1;                     //低位在前,高位在后
            ch451_dclk=0;
            command>>=1;                             //右移一位
            ch451_dclk=1;                             //产生时钟上升沿锁通知CH451输入位数据
        }
    ch451_load=1;                                     //产生加载上升沿通知CH451处理命令数据
    keycode=0;                                     //清除keycode
    for(i=0;i<7;i++)
        {
            keycode<<=1;                             //数据作移一位,高位在前,低位在后
            keycode|=ch451_dout;                     //从高到低读入451的数据
            ch451_dclk=0;                             //产生时钟下升沿通知CH451输出下一位
            ch451_dclk=1;
    }
    ch451_keyzhi=keycode;                            //保存上次的键值
    IE1=0;                                    //清中断标志
}

//***********************************************

#endif


//************************************************
void main()
{
   uchar a,b,c,d;
   d=0;
   ch451_init();                                  //调用初始化
   ch451_write(0x403);
   ch451_write(0x580);          //测试送入命令
       
         ch451_keyzhi=0x0ff;
   ch451_write(CH451_KEY);
   CH451_DisplayDig(CH451_DIG0,ch451_keyzhi,1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。