辅导LED C程序、辅导C、辅导IO20--IO23

- 首页 >> C/C++编程



/*

接线:

1、用导线将EDA的IO20--IO23分别连接到CH451的DOUT、DCLK、DIN、LOAD。

过程:

上电,运行程序,按键,观察LED显示的数据是否与键盘一一对应。

*/


//------------------头文件--------------------------------------

#include <stdio.h>

#include <string.h>

#include "io.h"

#include "system.h"


#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 LOAD_CLR    IO_INI(0,0)

 #define LOAD_SET    IO_INI(1,0)

 #define DIN_CLR     IO_INI(0,1)

 #define DIN_SET     IO_INI(1,1)

 #define DCLK_CLR    IO_INI(0,2)

 #define DCLK_SET    IO_INI(1,2)


void IO_INI(unsigned char data,unsigned char name)

 {

   unsigned char temp;

  if(data) temp = temp|(1<<name);

  else temp = temp&(~(1<<name));

  IOWR(LED_PIO_BASE,0,temp);

 }




unsigned char ch451_key;    //存放键盘中断中读取的键值

unsigned char keycodebuf[16]={0x40, 0x41, 0x42, 0x43,

                             0x48, 0x49, 0x4A, 0X4B,

                             0X50, 0X51, 0X52, 0X53,

                             0X58, 0X59, 0X5A, 0X5B};


unsigned char realcodebuf[16]={0x3F, 0x06, 0x5B, 0x4F,

                              0x66, 0x6D, 0x7D, 0X07,

                              0X7F, 0X6F, 0X77, 0X7C,

                              0X39, 0X5E, 0X79, 0X71};



unsigned char ch451_key;

unsigned char count = 0;


// 函数声明

unsigned char getkey(unsigned char Key);



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

函数名称:按键键值转换

输入参数:键值

输出参数:键码

函数返回:无

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

unsigned char getkey(unsigned char Key)

{


  unsigned char i;


  for(i=0;i<16;i++)

  {

     if(Key == keycodebuf[i])

     {

       return i;

     }

  }

}


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

函数名称:CH451初始化函数

输入参数:无

输出参数:无

函数返回:无

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

void ch451_init(void)

{

   DIN_CLR;                    //先高后低,选择4线输入

   DCLK_SET;

   DIN_SET;

   LOAD_SET;

}


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

函数名称:输出命令子程序

输入参数:无

输出参数:无

函数返回:无

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

void ch451_write(unsigned int command)//定义一无符号整型变量储存12B的命令字

{

   unsigned char i;


   LOAD_CLR;                   //命令开始

   for(i=0;i<12;i++)               //送入12位数据,低位在前

   {

       if((command&1)==0x01)

          DIN_SET;

       else DIN_CLR;

       DCLK_CLR;

       command>>=1;

       DCLK_SET;               //上升沿有效

   }

   LOAD_SET;                   //加载数据


}


unsigned char Receive451(void)

{

   unsigned char i;

   unsigned char command,keycode;//定义控制字寄存器、中间变量定时器

   command=0x07;                 //读取键值命令的高4位0111B

   LOAD_CLR;                //命令开始

   for(i=0;i<4;i++)

   {

        if((command&1)==0x01)

          DIN_SET;

       else DIN_CLR;       //低位在前,高位在后

       DCLK_CLR;

       command>>=1;               // 向右移一位

       DCLK_SET;              //  产生时钟上升沿锁通知ch451输入位数据

   }

   LOAD_SET;                  //产生时钟上升沿锁通知ch451处理命令数据

   keycode=0;                     //清除keycode

   for(i=0;i<7;i++)

   {

       keycode<<=1;               //数据左移一位,高位在前,低位在后

       keycode|=IORD(BUTTON_PIO_BASE,0)& 0x01;

       DCLK_CLR;             //产生时钟上升沿锁通知ch451输出下一位

       DCLK_SET;

   }

   //ch451_key = keycode;           // 保存键值

   return keycode;

}


unsigned char read_KEY()  //BUTTON[0]

{

 unsigned char value=0;

 value = IORD(BUTTON_PIO_BASE,0)& 0x01;

 return value;

}


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

函数名称:main函数

输入参数:无

输出参数:无

函数返回:无

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

void main(void)

{

   unsigned char key = 0;

   IOWR(LED_PIO_BASE,1,0x0f);

   ch451_init();

   ch451_write(CH451_RESET);      // 芯片复位

   ch451_write(CH451_SYSON2);     // 开显示和键盘扫描

   ch451_write(CH451_DSP);        // 设置默认显示方式


   //清空数码显示

   ch451_write(CH451_DIG0|0x00);

   ch451_write(CH451_DIG1|0x00);

   ch451_write(CH451_DIG2|0x00);

   ch451_write(CH451_DIG3|0x00);

   ch451_write(CH451_DIG4|0x00);

   ch451_write(CH451_DIG5|0x00);

   ch451_write(CH451_DIG6|0x00);

   ch451_write(CH451_DIG7|0x00);

   printf("请按下黄色帽按键\n");

   while(1)

   {

       if( read_KEY() == 0x00)               // 等待按键

       {

          ch451_key = Receive451();

          key = getkey(ch451_key) ;   // 转换显示为16进制数字

          ch451_write(CH451_LEFTMOV); // 准备左移

          ch451_write(CH451_DIG0|realcodebuf[key]);  // 输出显示

       }

   }

}


站长地图