小弟最近想用8729芯片,做一个键盘控制数码管显示的小板子,从网上找了一段程序感觉写的挺好的,可是试了好久就是不对,求论坛的各位大神指导指导。
我上传了Proteus图片和我用的程序希望大家指导一下。
#include<reg51.h>
#include<absacc.h>
#define COM XBYTE[0x7fff] /*命令/状态口*/
#define DAT XBYTE[0x77ff] /*数据口*/
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar idata diss[8]={0,1,2,3,4,5,6,7};
sbit cflag=ACC^7;
uchar keyin();
uchar deky();
void disp(uchar idata *d);
void main (void)
{
uchar i;
COM=0xd1; /*总清除命令*/
do{ACC=COM;}
while(cflag==1); /*等待清除结束*/
COM=0x00;COM=0x2a; /*键盘,显示方式,时钟分频*/
while(1)
{
for(i=0;i<8;i++)
{
diss[i]=keyin(); /*键盘输入到显示缓冲*/
disp(diss); /*显示缓冲区内容*/
}
}
}
void disp(d) /*显示函数*/
uchar idata *d;
{
uchar i;
COM=0x90; /*写显示RAM命令,地址自动加1*/
for(i=0;i<8;i++)
{
COM=i+0x80;
DAT=table[*d];
d++;
}
}
uchar keyin(void) /*取键值函数*/
{
uchar i;
while(deky()==0); /*无键按下等待*/
COM=0x40; /*读FIFO RAM命令*/
i=DAT;i=i&0x3f; /*取键盘数据低6位*/
return(i); /*返回键值*/
}
uchar deky(void) /*判断FIFO有键按下函数*/
{
uchar k;
k=COM;
return(k&0x03); /*非0,有键按下*/
}
|