/*********************************************
-------------------硬件延时-------------------
功能描述:通过硬件延时大约40us
**********************************************/
void delay_t1()
{
asm //等待40us
{
PSHH
PSHX
PSHA
LDHX #$0020
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
/*********************************************
-------------------硬件延时-------------------
功能描述:通过硬件延时10us
**********************************************/
void delay_t2()
{
asm //等待10us
{
PSHH
PSHX
PSHA
LDHX #$008
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
/************************************************************
---------------------------硬件延时--------------------------
功能描述:通过硬件延时10us,并在延时到5us时将KB_SIO置为高电平
*************************************************************/
void delay_t3_high()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=1;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
/************************************************************
---------------------------硬件延时--------------------------
功能描述:通过硬件延时10us,并在延时到5us时将KB_SIO置为低电平
*************************************************************/
void delay_t3_low()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=0;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
/***************************************************
-------------------键盘中断初始化-------------------
功能描述:将PTA0作为键盘中断的入口
****************************************************/
void keyboard_init()
{
DDRA_DDRA0=0; //PTA0为输入
PTAPUE_PTAPUE0=1; //PTA0有上拉电阻
INTKBSCR_IMASKK=1; //屏蔽键盘中断
INTKBIER_KBIE0=1; //允许PTA0作为键盘中断
INTKBSCR_ACKK=1; //清除键盘中断请求
INTKBSCR_IMASKK=0; //开放键盘中断
}
/***************************************************
-------------------发送字节函数-------------------
功能描述:将传入的数据发给7289
传入参数:data
参数设置:data为要发送的数据
调用函数:delay_t3_high()
delay_t3_low()
delay_t2()
****************************************************/
void send_byte(byte data)
{
byte i;
byte temp;
i=0;
while(i<8)
{
temp=data<<i;
temp=temp&0x80;
if(temp==0x80)
{
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
else
{
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
i++;
}
}
/*********************************************************
---------------------------键盘复位-----------------------
功能描述:清除所有的字符显示,清除所有的字符消隐、闪烁属性
使得芯片所处的状态与系统上电后所处的状态一样
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void keyboard_reset()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa4);
delay_t1();
KB_CS=1;
}
/*******************************************************
--------------------------键盘测试----------------------
功能描述:使所有的LED全部点亮,并处于闪烁状态,供测试用
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void keyboard_test()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xbf);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED闪烁函数---------------------
功能描述:控制各LED的闪烁特性
传入参数:place
参数设置:place为要闪烁的LED的位置,有效值范围为0x0~0x8
0x0----第0位闪烁,0x1----第1位闪烁
0x2----第2位闪烁,0x3----第3位闪烁
0x4----第4位闪烁,0x5----第5位闪烁
0x6----第6位闪烁,0x7----第7位闪烁
0x8----全部不闪烁
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void wink_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x88);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED消隐函数---------------------
功能描述:控制各LED的消隐特性
传入参数:place
参数设置:place为要消隐的LED的位置,有效值范围为0x0~0x8
0x0----第0位消隐,0x1----第1位消隐
0x2----第2位消隐,0x3----第3位消隐
0x4----第4位消隐,0x5----第5位消隐
0x6----第6位消隐,0x7----第7位消隐
0x8----全部显示
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void disappear_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x98);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED显示函数---------------------
功能描述:控制各LED的显示
传入参数:place,number,point
参数设置:place为要显示的LED的位置,有效值范围为0x0~0x7
0x0----第0位显示,0x1----第1位显示
0x2----第2位显示,0x3----第3位显示
0x4----第4位显示,0x5----第5位显示
0x6----第6位显示,0x7----第7位显示
number为LED显示的数字,有效值范围为0x0~0xf,LED
显示的数字即为number的数值
point用来确定是否显示小数点,有效值范围为0x0~0x1
0x0----不显示小数点,0x1----显示小数点
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void display_led(byte place,byte number,byte point)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
place=place<<5;
place=place>>5;
place=place+0b11001000;
send_byte(place);
delay_t1();
//----------------//
point=point<<7;
number=number+point;
send_byte(number);
delay_t1();
KB_CS=1;
}
/*********************************************************
--------------------------左移函数------------------------
功能描述:使所有的显示自右向左(从第0位向第7位)移动一位,
(包括处于消隐状态的显示位),但对各位所设置的消隐
及闪烁属性不变,移动后最右边一位为空无显示
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void move_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa1);
delay_t1();
KB_CS=1;
}
/*********************************************************
--------------------------右移函数------------------------
功能描述:使所有的显示自左向右(从第7位向第0位)移动一位,
(包括处于消隐状态的显示位),但对各位所设置的消隐
及闪烁属性不变,移动后最左边一位为空无显示
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void move_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa0);
delay_t1();
KB_CS=1;
}
/*********************************************************
------------------------循环左移函数----------------------
功能描述:使所有的显示自右向左(从第0位向第7位)移动一位,
(包括处于消隐状态的显示位),对各位所设置的消隐
及闪烁属性不变,移动后原最左边一位(第7位)的内容
显示于最右边一位(第0位)
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void cyc_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa3);
delay_t1();
KB_CS=1;
}
/*********************************************************
------------------------循环右移函数----------------------
功能描述:使所有的显示自左向右(从第7位向第0位)移动一位,
(包括处于消隐状态的显示位),对各位所设置的消隐
及闪烁属性不变,移动后原最右边一位(第0位)的内容
显示于最左边一位(第7位)
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void cyc_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa2);
delay_t1();
KB_CS=1;
}
/*************************************************************
--------------------------读键值函数--------------------------
功能描述:在中断时读取所按下的键的键值
调用函数:delay_t1()
delay_t2()
send_byte(byte data)
返回值: 返回读到的键值,键值范围为0x0~0xf,对应键盘上的按键为
0x0--按键1 0x1--按键2 0x2--按键3 0x3--按键4
0x4--按键5 0x5--按键6 0x6--按键7 0x7--按键8
0x8--按键9 0x9--按键10 0xa--按键11 0xb--按键12
0xc--按键13 0xd--按键14 0xe--按键15 0xf--按键16
***************************************************************/
byte read_key()
{
byte i,temp;
temp=0x00;
i=0;
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x15);
delay_t1();
//----------------//
DDRC_DDRC2=0;
while(i<8)
{
KB_SCK=1;
delay_t2();
KB_SCK=0;
if(KB_SIO==1)
{
temp=temp<<1;
temp=temp+1;
}
else
{
temp=temp<<1;
}
delay_t2();
i++;
}
DDRC_DDRC2=1;
KB_CS=1;
return temp;
}
应用实例:
(1)
/******************************************************
**硬件连接:PTC0------CS PTC1------SCK
PTC2------SIO
**程序描述:每一位都从0~f依次显示,直到8位全部显示
最后所有的数码管全部点亮
******************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define KB_CS PTC_PTC0
#define KB_SCK PTC_PTC1
#define KB_SIO PTC_PTC2
//#define HIGH 0xff
//#define LOW 0x00
void delay_t1()
{
asm //等待40us
{
PSHH
PSHX
PSHA
LDHX #$0020
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
void delay_t2()
{
asm //等待10us
{
PSHH
PSHX
PSHA
LDHX #$008
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
void delay_t3_high()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=1;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
void delay_t3_low()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=0;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
void keyboard_reset()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
KB_SIO=1;
delay_t1();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t1();
KB_CS=1;
}
void send_byte(byte data)
{
byte i;
byte temp;
i=0;
/* temp=data&0x80;
if(temp==0x80)
{
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
else
{
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}*/
while(i<8)
{
temp=data<<i;
temp=temp&0x80;
if(temp==0x80)
{
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
else
{
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
i++;
}
}
void keyboard_test()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
//KB_SIO=1;
delay_t1();
send_byte(0xbf);/*
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;*/
delay_t1();
KB_CS=1;
}
void display_led(byte place,byte number,byte point)
{
byte temp;
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
//KB_SIO=1;
delay_t1();/*
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;*/
temp=0b11001000;
place=place<<5;
place=place>>5;
place=place+0b11001000;
send_byte(place);
delay_t1();
//---------------//
point=point<<7;
number=number+point;
send_byte(number);
/*delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;*/
delay_t1();
KB_CS=1;
}
/*************************************************
------------------定时器初始化-----------------
*************************************************/
void time_init()
{
T1SC=0x26; //定时器停止,无中断,1分频
T1MODH=0x25; //预置数为0132
T1MODL=0x80;
}
void main(void)
{
byte i,j;
CONFIG1_COPD=1; //禁止看门狗
DDRC_DDRC0=1;
DDRC_DDRC1=1;
DDRC_DDRC2=1;
keyboard_reset();
//while(1)
//{
//keyboard_test();
time_init();
T1SC_TSTOP=0; //计时起开始计时
for(i=0x00;i<=0x07;i++)
{
for(j=0x0;j<=0x0f;j++)
{
while(T1SC_TOF==0)
{
}
display_led(i,j,0x00);
T1SC_TOF=0;
}
}
for(i=0x00;i<=0x07;i++)
{
display_led(i,0x8,0x01);
}
for(;;);
}
(2)
/******************************************************
**硬件连接:PTC0------CS PTC1------SCK
PTC2------SIO
**程序描述:1.自右向左依次显示0~7
2.循环左移
3.循环右移
4.左移
5.右移
6.全灭后显示0~7
7.第0位到第7位依次闪烁后停止闪烁
8.第0位到第7位依次消隐后全部显示
******************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define KB_CS PTC_PTC0
#define KB_SCK PTC_PTC1
#define KB_SIO PTC_PTC2
void delay_t1()
{
asm //等待40us
{
PSHH
PSHX
PSHA
LDHX #$0020
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
void delay_t2()
{
asm //等待10us
{
PSHH
PSHX
PSHA
LDHX #$008
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
void delay_t3_high()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=1;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
void delay_t3_low()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=0;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
void send_byte(byte data)
{
byte i;
byte temp;
i=0;
while(i<8)
{
temp=data<<i;
temp=temp&0x80;
if(temp==0x80)
{
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
else
{
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
i++;
}
}
void keyboard_reset()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xa4);
delay_t1();
KB_CS=1;
}
void keyboard_test()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xbf);
delay_t1();
KB_CS=1;
}
void wink_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x88);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
void disappear_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x98);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
void display_led(byte place,byte number,byte point)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
place=place<<5;
place=place>>5;
place=place+0b11001000;
send_byte(place);
delay_t1();
//----------------//
point=point<<7;
number=number+point;
send_byte(number);
delay_t1();
KB_CS=1;
}
void move_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xa1);
delay_t1();
KB_CS=1;
}
void move_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xa0);
delay_t1();
KB_CS=1;
}
void cyc_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xa3);
delay_t1();
KB_CS=1;
}
void cyc_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;;
delay_t1();
send_byte(0xa2);
delay_t1();
KB_CS=1;
}
/*************************************************
------------------定时器初始化-----------------
*************************************************/
void time_init()
{
T1SC=0x26; //定时器停止,无中断,1分频
T1MODH=0x96; //预置数为0132
T1MODL=0x00;
}
void main(void)
{
byte i;
CONFIG1_COPD=1; //禁止看门狗
DDRC_DDRC0=1;
DDRC_DDRC1=1;
DDRC_DDRC2=1;
keyboard_reset();
//while(1)
//{
//keyboard_test();
time_init();
T1SC_TSTOP=0; //计时起开始计时
for(i=0x00;i<=0x07;i++)
{
while(T1SC_TOF==0)
{
}
display_led(i,i,0x00);
T1SC_TOF=0;
}
while(T1SC_TOF==0)
{
}
cyc_left();
T1SC_TOF=0;
while(T1SC_TOF==0)
{
}
cyc_right();
T1SC_TOF=0;
while(T1SC_TOF==0)
{
}
move_left();
T1SC_TOF=0;
while(T1SC_TOF==0)
{
}
move_right();
T1SC_TOF=0;
while(T1SC_TOF==0)
{
}
keyboard_reset();
T1SC_TOF=0;
for(i=0x00;i<=0x07;i++)
{
while(T1SC_TOF==0)
{
}
display_led(i,i,0x00);
T1SC_TOF=0;
}
for(i=0x00;i<=0x07;i++)
{
while(T1SC_TOF==0)
{
}
wink_led(i);
T1SC_TOF=0;
}
while(T1SC_TOF==0)
{
}
wink_led(8);
T1SC_TOF=0;
for(i=0x00;i<=0x07;i++)
{
while(T1SC_TOF==0)
{
}
disappear_led(i);
T1SC_TOF=0;
}
while(T1SC_TOF==0)
{
}
disappear_led(8);
for(;;);
}
(3)
/******************************************************
**硬件连接:PTC0------CS PTC1------SCK
PTC2------SIO PTA0------KEY
PTB接LED
**程序描述:按下键盘中任意的键,LED灯会根据键值变化
******************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define KB_CS PTC_PTC0
#define KB_SCK PTC_PTC1
#define KB_SIO PTC_PTC2
#define KB_KEY PTA_PTA0
/*********************************************
-------------------硬件延时-------------------
功能描述:通过硬件延时大约40us
**********************************************/
void delay_t1()
{
asm //等待40us
{
PSHH
PSHX
PSHA
LDHX #$0020
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
/*********************************************
-------------------硬件延时-------------------
功能描述:通过硬件延时10us
**********************************************/
void delay_t2()
{
asm //等待10us
{
PSHH
PSHX
PSHA
LDHX #$008
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
}
/************************************************************
---------------------------硬件延时--------------------------
功能描述:通过硬件延时10us,并在延时到5us时将KB_SIO置为高电平
*************************************************************/
void delay_t3_high()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=1;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
/************************************************************
---------------------------硬件延时--------------------------
功能描述:通过硬件延时10us,并在延时到5us时将KB_SIO置为低电平
*************************************************************/
void delay_t3_low()
{
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP:
DBNZX LOOP
PULA
PULX
PULH
}
KB_SIO=0;
asm //等待5us
{
PSHH
PSHX
PSHA
LDHX #$004
LOOP1:
DBNZX LOOP1
PULA
PULX
PULH
}
}
/***************************************************
-------------------键盘中断初始化-------------------
功能描述:将PTA0作为键盘中断的入口
****************************************************/
void keyboard_init()
{
DDRA_DDRA0=0; //PTA0为输入
PTAPUE_PTAPUE0=1; //PTA0有上拉电阻
INTKBSCR_IMASKK=1; //屏蔽键盘中断
INTKBIER_KBIE0=1; //允许PTA0作为键盘中断
INTKBSCR_ACKK=1; //清除键盘中断请求
INTKBSCR_IMASKK=0; //开放键盘中断
}
/***************************************************
-------------------发送字节函数-------------------
功能描述:将传入的数据发给7289
传入参数:data
参数设置:data为要发送的数据
调用函数:delay_t3_high()
delay_t3_low()
delay_t2()
****************************************************/
void send_byte(byte data)
{
byte i;
byte temp;
i=0;
while(i<8)
{
temp=data<<i;
temp=temp&0x80;
if(temp==0x80)
{
delay_t3_high();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
else
{
delay_t3_low();
KB_SCK=1;
delay_t2();
KB_SCK=0;
}
i++;
}
}
/*********************************************************
---------------------------键盘复位-----------------------
功能描述:清除所有的字符显示,清除所有的字符消隐、闪烁属性
使得芯片所处的状态与系统上电后所处的状态一样
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void keyboard_reset()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa4);
delay_t1();
KB_CS=1;
}
/*******************************************************
--------------------------键盘测试----------------------
功能描述:使所有的LED全部点亮,并处于闪烁状态,供测试用
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void keyboard_test()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xbf);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED闪烁函数---------------------
功能描述:控制各LED的闪烁特性
传入参数:place
参数设置:place为要闪烁的LED的位置,有效值范围为0x0~0x8
0x0----第0位闪烁,0x1----第1位闪烁
0x2----第2位闪烁,0x3----第3位闪烁
0x4----第4位闪烁,0x5----第5位闪烁
0x6----第6位闪烁,0x7----第7位闪烁
0x8----全部不闪烁
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void wink_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x88);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED消隐函数---------------------
功能描述:控制各LED的消隐特性
传入参数:place
参数设置:place为要消隐的LED的位置,有效值范围为0x0~0x8
0x0----第0位消隐,0x1----第1位消隐
0x2----第2位消隐,0x3----第3位消隐
0x4----第4位消隐,0x5----第5位消隐
0x6----第6位消隐,0x7----第7位消隐
0x8----全部显示
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void disappear_led(byte place)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x98);
delay_t1();
//----------------//
place=0b00000001<<place;
place=~place;
send_byte(place);
delay_t1();
KB_CS=1;
}
/*******************************************************
------------------------LED显示函数---------------------
功能描述:控制各LED的显示
传入参数:place,number,point
参数设置:place为要显示的LED的位置,有效值范围为0x0~0x7
0x0----第0位显示,0x1----第1位显示
0x2----第2位显示,0x3----第3位显示
0x4----第4位显示,0x5----第5位显示
0x6----第6位显示,0x7----第7位显示
number为LED显示的数字,有效值范围为0x0~0xf,LED
显示的数字即为number的数值
point用来确定是否显示小数点,有效值范围为0x0~0x1
0x0----不显示小数点,0x1----显示小数点
调用函数:delay_t1()
send_byte(byte data)
********************************************************/
void display_led(byte place,byte number,byte point)
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
place=place<<5;
place=place>>5;
place=place+0b11001000;
send_byte(place);
delay_t1();
//----------------//
point=point<<7;
number=number+point;
send_byte(number);
delay_t1();
KB_CS=1;
}
/*********************************************************
--------------------------左移函数------------------------
功能描述:使所有的显示自右向左(从第0位向第7位)移动一位,
(包括处于消隐状态的显示位),但对各位所设置的消隐
及闪烁属性不变,移动后最右边一位为空无显示
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void move_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa1);
delay_t1();
KB_CS=1;
}
/*********************************************************
--------------------------右移函数------------------------
功能描述:使所有的显示自左向右(从第7位向第0位)移动一位,
(包括处于消隐状态的显示位),但对各位所设置的消隐
及闪烁属性不变,移动后最左边一位为空无显示
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void move_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa0);
delay_t1();
KB_CS=1;
}
/*********************************************************
------------------------循环左移函数----------------------
功能描述:使所有的显示自右向左(从第0位向第7位)移动一位,
(包括处于消隐状态的显示位),对各位所设置的消隐
及闪烁属性不变,移动后原最左边一位(第7位)的内容
显示于最右边一位(第0位)
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void cyc_left()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa3);
delay_t1();
KB_CS=1;
}
/*********************************************************
------------------------循环右移函数----------------------
功能描述:使所有的显示自左向右(从第7位向第0位)移动一位,
(包括处于消隐状态的显示位),对各位所设置的消隐
及闪烁属性不变,移动后原最右边一位(第0位)的内容
显示于最左边一位(第7位)
调用函数:delay_t1()
send_byte(byte data)
**********************************************************/
void cyc_right()
{
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
send_byte(0xa2);
delay_t1();
KB_CS=1;
}
/*byte get_byte()
{
byte i,temp;
temp=0x00;
i=0;
DDRC_DDRC2=0;
while(i<8)
{
KB_SCK=1;
delay_t2();
KB_SCK=0;
if(KB_SIO==1)
{
temp=temp<<1;
temp=temp+1;
}
else
{
temp=temp<<1;
}
delay_t2();
i++;
}
DDRC_DDRC2=1;
return temp;
}*/
/*************************************************************
--------------------------读键值函数--------------------------
功能描述:在中断时读取所按下的键的键值
调用函数:delay_t1()
delay_t2()
send_byte(byte data)
返回值: 返回读到的键值,键值范围为0x0~0xf,对应键盘上的按键为
0x0--按键1 0x1--按键2 0x2--按键3 0x3--按键4
0x4--按键5 0x5--按键6 0x6--按键7 0x7--按键8
0x8--按键9 0x9--按键10 0xa--按键11 0xb--按键12
0xc--按键13 0xd--按键14 0xe--按键15 0xf--按键16
***************************************************************/
byte read_key()
{
byte i,temp;
temp=0x00;
i=0;
KB_CS=1;
KB_SCK=0;
KB_SIO=0;
delay_t1();
KB_CS=0;
delay_t1();
//----------------//
send_byte(0x15);
delay_t1();
//----------------//
DDRC_DDRC2=0;
while(i<8)
{
KB_SCK=1;
delay_t2();
KB_SCK=0;
if(KB_SIO==1)
{
temp=temp<<1;
temp=temp+1;
}
else
{
temp=temp<<1;
}
delay_t2();
i++;
}
DDRC_DDRC2=1;
KB_CS=1;
return temp;
}
/*************************************************
------------------定时器初始化-----------------
*************************************************/
void time_init()
{
T1SC=0x26; //定时器停止,无中断,1分频
T1MODH=0x96; //预置数为0132
T1MODL=0x00;
}
void main(void)
{
//byte i;
CONFIG1_COPD=1; //禁止看门狗
DDRC_DDRC0=1;
DDRC_DDRC1=1;
DDRC_DDRC2=1;
keyboard_init();
keyboard_reset();
//DDRB_DDRB0=1;
//PTB_PTB0=1;
DDRB=0xff;
PTB=0x00;
EnableInterrupts;
for(;;);
}
void interrupt 15 KB_int()
{
//delay(180);
//PTB_PTB0=~PTB_PTB0;
PTB=read_key();
}