我要用zlg7289做一个按键的显示模块(基于SPI总线技术的),显示函数display()能正常工作,但是读键函数ReadKB()好像有问题,当用其返回值kb写入显示缓冲区dispbuff时,总是不能正常显示,望大虾指点!
#include <reg51.H>
sbit CS=P1^0; sbit CLK=P1^1; sbit DIO=P1^2; sbit keydown=P3^3;
char dispbuff[8];
void sent(unsigned char sent_buf); void delay(char time); void display(); char ReadKB();
main() { char i,kb=0; CS=1; for (i=0;i<8;i++) //初始化,执行一次 { dispbuff=16; } display(); while(1) { while(keydown==1); //检测有无按键按下 while(keydown==0); //等待按键弹起 kb=ReadKB(); dispbuff[0]=kb+16; display(); delay(50); }
}
void sent(unsigned char sent_buf)//发送函数 { char i; CLK=0; //置SPI时钟线为低 CS=0; //置SPI片选线为低 delay(50); //延时50us for(i=0;i<8;i++) //发送8位数据 { sent_buf=sent_buf<<1; //从数据最高位开始,将要发发送的数据位移入进位位CY DIO=CY; //数据位送数据线 CLK=1; //置SPI时钟线为高 delay (10); //延时10us CLK=0; //置SPI时钟线为低,发送完1位数据 delay (10); //延时10us } DIO=0; }
void delay(char time) //延时函数 { char i; for(i=0;i<time;i++); }
void display() //显示函数 { char i; for(i=0;i<8;i++) { CS=1; sent(0xc8+i); sent(dispbuff); CS=1; } }
char ReadKB() //读键值函数 { char i,kb=0; CS=1; CLK=0; delay(50); sent(0x15); //发送读键盘指令 delay(10); DIO=1; CLK=1; delay(50); for(i=0;i<8;i++) { CLK=0; kb=kb*2+(char)DIO;//读1位数据 delay(10); CLK=1; delay(10); } //for循环后,kb中存放着键值 CS=1; return(kb); }
|