辅导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]); // 输出显示
}
}
}