相关程序如下: //外部中断子程序 SIGNAL(SIG_INTERRUPT0) { _delay_ms(10); key_int_flag=1;
}
//向CH452发出操作命令 void CH452_Write(unsigned short cmd) { unsigned char temp; for(temp = 0;temp < 12;temp++) //送12位命令字 { if(cmd & 0x01) { ch452_sda_set; //低位先传送,如果低位为1,数据端口输出高电平 } else { ch452_sda_clr; //低位为0,数据端口输出高电平低电平 } ch452_scl_clr; //时钟端口置低 cmd >>= 1; //数据右移一位 ch452_scl_set; //数据端口置高,产生一个上升沿,发送数据 } ch452_load_clr; //数据加载端口产生一个上升沿,加载数据 _delay_ms(10); ch452_load_set; }
//从CH452读取按键代码 unsigned char CH452_Read(void) { unsigned char i,j; unsigned char read,key; read=0x07; ch452_load_clr; for(i=0;i<4;i++) { if(read&0x01)ch452_sda_set; else ch452_sda_clr; ch452_scl_clr; read>>=1; ch452_scl_set; } ch452_load_set; for(j=0;j<7;j++) { key<<=1; key|=ch452_int; ch452_scl_clr; ch452_scl_set; } //key_int_flag=0; return(key); }
//主函数 int main(void) //GCC中main文件必须为返回整形值的函数,没有参数 { _delay_ms(500); CH452_Write(CH452_RESET); //复位 CH452_Write(CH452_NOP); //空操作 CH452_Write(CH452_CLR_BIT); //段位地址清零 CH452_Write(CH452_SYSON2); //开显示、键盘 CH452_Write(CH452_BCD); //BCD译码方式送显示数据 PORTB = 0x07; //PB0\PB1\PB2为输出高电平 DDRB = 0x07; //PB0\PB1\PB2为输出方向,分别是数据、时钟、数据加载线 INI_INT0(); //外部中断初始化 sei(); //全局中断允许 while(1) { if(key_int_flag) { keyboard_display(); } while(1); }