ZLG的LED键盘

/*********************************************
-------------------硬件延时-------------------
功能描述:通过硬件延时大约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();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值