7279键盘显示程序

来源:百度文库 编辑:神马文学网 时间:2024/07/03 12:38:44
#include
#define CMD_RESET 0xa4 //复位(清除)指令
#define CMD_TEST 0xbf //测试指令
#define CMD_READ 0x15 //读键盘数据指令
#define BLINKCTL 0x88 //闪烁控制
#define ACTCTL 0x98 //消隐控制
#define DECODE0 0x80 //下载数据且按方式0译码
#define DECODE1 0xc8 //下载数据且按方式1译码
#define UNDECODE 0x90 //下载数据但不译码
#define SEGON 0xe0 //段点亮指令
#define SEGOFF 0xc0 //段关闭指令
#define RTL_CYCLE 0xa3 //循环左移指令
#define RTR_CYCLE 0xa2 //循环右移指令
#define RTL_UNCYL 0xa1 //左移指令
#define RTR_UNCYL 0xa0 //右移指令
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//*******************变量及I/O口定义**********************
sbit cs=P1^0; //7279使能端
sbit clk=P1^1; //7279时钟脉冲
sbit dat=P1^2; //7279数据端
sbit key=P1^3; //7279键位
/**************函数原型说明****************/
void write7279(uchar,uchar); //写入到HD7279
void send_uchar(uchar); //发送一个字节
void Init_Timer0();
void short_delay(void); //延时约8us
void long_delay(void); //延时约50us
uchar ucHMiao=0,ucSec=0,ucMin=0,ucHour=0;
uchar bflag=0; //1秒标记
//uchar ww_led[]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70, 0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47,0x00,0x67}; //0--9的数码表
uchar ww_led[]={0xdb,0xc0,0xb3,0xf2,0xe8,0x7a,0x6b,0xd0, 0xfb,0xf8};//0--9的数码表
uchar Led_buf[6]={0x5b,0x0f,0x77,0x77,0x0f,0x00};//START十六进制代码
uchar led_buf[];
//*****************************************
//发送数据给7279显示
//*****************************************
void send_uchar(uchar out_uchar)
{
uchar i;
cs=0;
long_delay();
for(i=0;i<8;i++)
{
if(out_uchar&0x80)
dat=1;
else
dat=0;
clk=1;
short_delay();
clk=0;
short_delay();
out_uchar=out_uchar*2;
}
dat=0;
}
//**********************************
// 函数功能:接收一个字节
// 形式参数:无
// 返回值 :接收到的字节in_uchar
//**********************************
uchar receive_uchar(void)
{
uchar i,in_uchar;
dat=1; //设为输入状态
long_delay();
for(i=0;i<8;i++)
{
clk=1;
short_delay();
in_uchar=in_uchar*2;
if(dat)
in_uchar=in_uchar|0x01;
clk=0;
short_delay();
}
dat=0;
return(in_uchar);
}
//************************************************ ***********
// 函数功能:往7279发送一个不带数据的指令,然后读出7279的值
// 形式参数:要发送的指令commond
// 返回值 :无
//************************************************ ***********
uchar read7279(uchar commond)
{
send_uchar(commond);
return(receive_uchar());
}
//*****************************************
// 函数功能:找出键值为value的按键的键号
// 形式参数:键值value
// 返回值 :查到的键号i
//*****************************************
uchar get_key_number(uchar value)
{
uchar i;
uchar KEY_CODE[]={ 0x04,0x05,0x06,0x07,
0x0c,0x0d,0x0e,0x0f,
0x14,0x15,0x16,0x17,
0x1c,0x1d,0x1e,0x1f}; //键值表
for(i=0;value!=KEY_CODE[i];i++);
return i;
}
uchar Key_Scan(void)
{
uchar key_value,key_number;
if(!key) //如果有键按下
{
key_value=http://blog.soso.com/qz.q/read7279(CMD_READ); //读出键值
key_number=get_key_number(key_value); //查出键号
while(!key);////////////////////////////////////// /////////////////////////////////////////////////// ////
return key_number;
}
else
{
return (0xff);
}
}
//****************************************
// 函数功能:往7279发送一个带数据的指令
// 形式参数:命令commond(数码管位子),数据Data(显示的数据)
// 返回值 :无
//****************************************
void write7279(uchar commond,uchar Data)
{
send_uchar(commond);
send_uchar(Data);
}
//***********************
// 函数功能:延时约8us
// 形式参数:无
// 返回值 :无
//***********************
void short_delay(void) //延时约8us
{
uchar i;
for(i=0;i<2;i++);
}
//************************
// 函数功能:延时约50us
// 形式参数:无
// 返回值 :无
//************************
void long_delay(void) //延时约50us
{
uchar i;
for(i=0;i<12;i++);
}
void Disp(uint k) //时间处理函数
{
uchar i;
led_buf[0]= k%10;
led_buf[1]= k%100/10;
led_buf[2]= k%1000/100;
led_buf[3]= k%10000/1000;
for(i=0;i<4;i++) //显示6位数码管
{
write7279(0x90+i,0); //0X90为最右边数码管
write7279(DECODE1+i,Led_buf[i]); //0X90为最右边数码管
}
}
void int_7279(void)
{
uchar i;
/**********************初始化***********************************/
send_uchar(CMD_RESET);
for(i=0;i<8;i++)
{
write7279(UNDECODE+i,1);
}
}