小可现在用的是AT89C51/CH452L,驱动键盘,不带显示.问题是我程序下到片子里后,发现DIG0口没有扫描.不知道问题出在哪.请能人指点一下:谢谢! sbit DCLK=P1^5; sbit DIN=P1^4; sbit LOAD=P1^6; sbit DOUT=P3^2; void AT89C51_Init() { DOUT=1; TCON|=0x01;//中断0下降沿触发; //TCON&=0xfe;//中断0低电平触发; //IP|=0x01; CH452_KEY_INT0_ON;//中断0允许; EA=1;//全局中断允许; } /******************************************* ******名称:CH452_Init() ******变量: ******功能:CH452初始化(设定系统参数) ******01000[GPOE][INTM][SSPD][DPLR]0[KEYB][DISP] ****** 0 1 0 0 0 1 0 ******DISP(显示驱动功能的使能):0:关闭显示驱动 1:允许显示驱动 ******KEYB(键盘扫描功能的使能):0:关闭键盘扫描 1:启用键盘扫描 ******DPLR(字驱动DIG 输出极性):0:低电平有效 1:高电平有效 ******SSPD(闪烁速度/频率):0:低速(约1.5Hz) 1:快速(约3Hz) ******INTM(按键中断输出方式):0:低电平有效(电平或边沿中断) 1:低电平脉冲(边沿中断) ******GPOE(通用输出引脚使能--仅DIG6和DIG7引脚):0:用于显示驱动字输出禁止通用输出 ***********************************************1:当扫描极限为1~6 时,多余的DIG6和DIG7引脚用于通用输出,分别由闪烁位D6S和D7S控制 *******************************************/ void CH452_Init() { Uint CH452_SYS_SET=0; CH452_KEY_DIN_CLR; CH452_KEY_DIN_SET; CH452_SYS_SET=(CH452_SYS_COM|CH452_KEY_KEYB_ON|CH452_KEY_INTM_ON);//CH452系统参数设置:开键盘功能\边沿中断 // CH452_SYS_SET=(CH452_SYS_COM|CH452_KEY_KEYB_ON|CH452_KEY_INTM_OFF);//CH452系统参数设置:开键盘功能\低电平中断 // WriteCH452(CH452_RESET); WriteCH452(CH452_SYS_SET); } /******************************************* ******名称:WriteCH452(Uint command) ******变量:Uint command ******功能:向CH452写命令 *******************************************/ void WriteCH452(Uint command) { Uchar i; CH452_KEY_INT0_OFF;//51禁止452产生的中断 CH452_KEY_LOAD_CLR;//LOAD低电平 for(i=0;i<12;i++) { if(command&0x0001)CH452_KEY_DIN_SET; else CH452_KEY_DIN_CLR; //DIN=command&0x0001; CH452_KEY_DCLK_CLR; command>>=1; CH452_KEY_DCLK_SET; } CH452_KEY_LOAD_SET;//LOAD上升沿加载命令 NOP;NOP;NOP;NOP;NOP;NOP; CH452_KEY_INT0_ON;//51允许452产生的中断 } /******************************************* ******名称:Uchar ReadCH452() ******变量: ******功能:从CH452读数据 *******************************************/ Uchar ReadCH452() { Uchar i; Uchar key=0; Uchar read; CH452_KEY_INT0_OFF; read=CH452_R_COM;//读取键盘命令0111 CH452_KEY_LOAD_CLR; for(i=0;i<4;i++) { if(read&0x01)CH452_KEY_DIN_SET; else CH452_KEY_DIN_CLR; //DIN=read&0x01; CH452_KEY_DCLK_CLR; read>>=1; CH452_KEY_DCLK_SET; } CH452_KEY_LOAD_SET;//LOAD上升沿加载命令 for(i=0;i<7;i++) { key<<=1; key|=DOUT; NOP; CH452_KEY_DCLK_CLR; CH452_KEY_DCLK_SET; } //CH452_CLR_INT_FLAG; CH452_KEY_INT0_ON; return(key); } /******************************************* ******名称:INT0_Init() ******变量: ******功能:中断初始化 *******************************************/ void CH452_INT0() interrupt 0 { key_int_flag=1; keyboard=ReadCH452(); } //-----------main----- void main() { DelayMs(100); LcdInit(); AT89C51_Init(); CH452_Init(); DelayMs(100); while(1) { if(key_int_flag) { LcdSendCom(0x01); Display(0,0,5,"北京欢迎您"); key_int_flag=0; } else Display(1,0,4,"没键按下"); DelayMs(10);
} }