回读数据锁存:
CPU要读相应功能的数据,就必须先锁存其数据,才能读;否则,只能读取上次锁存的数据。共有下面三种功能数据:
脉冲计数器值:32bit;
通用输入口值:8bit;
按键编码值:7bit;
CPU读数据是按8 bit字节读方式进行的,32 bit脉冲计数器值需要读4次,可按0~3任意顺序读取。8 bit值只能从地址0读取。格式为:
a、(*锁存地址)= 任意数据;
b、变量=(*读地址);
其中:锁存地址和读地址,可参见地址分配表一。
8/8位通用输入/输出口:
该芯片包含8位通用输入口和8位通用输出口。
8位通用输入口读命令为:
a、(*锁存地址)= 任意数据;
b、变量=(*读地址);
其中:锁存地址=基地址+12;
读地址 =基地址+0;(所有读地址相同)
8位通用输出口写命令为:
a、(*写地址)= 数据;
其中:写地址=基地址+11;
写数据为8位字节数据。
8X8键盘接口:
该芯片支持8X8矩阵键盘,自动扫描键盘,识别按键键码,CPU通过接口可读取当前按键编码值。命令如下:
a、(*锁存地址)= 任意数据;
b、变量=(*读地址);
其中:锁存地址=基地址+28;
读地址 =基地址+0;(所有读地址相同)
按键编码格式:
标志位:为1表示有键正按下,为0表示没有按键;
X:忽略;
回读码:取0~7为当前按键所对应的行(或列)编码,特指输入线(KBC_0~7);
扫描码:取0~7为当前按键所对应的列(或行)编码;特指输出线(KBS_0~7);
七、编程示例
//A、地址常量定义:(设芯片基地址为0xe000)
#define MC_sys_CLK 32000000 //定义芯片工作频率
#define MC_CNT_WR_Base_Addr (volatile unsigned char *) 0xe000 //定义计数器值写基地址
#define MC_CNT_Latch_WR_Base_Addr (volatile unsigned char *) 0xe00A //定义计数器锁存写基地址
#define MC_FRQ_WR_Base_Addr (volatile unsigned char *) 0xe004 //定义频率值写基地址
#define MC_Startup_WR_Base_Addr (volatile unsigned char *) 0xe008 //定义启动写基地址
#define MC_Stop_WR_Base_Addr (volatile unsigned char *) 0xe009 //定义停止写基地址
#define MC_GPOut_WR_Base_Addr (volatile unsigned char *) 0xe00B //定义通用输出值写基地址
#define MC_GPIn_Latch_WR_Base_Addr (volatile unsigned char *) 0xe00C //定义通用输入值锁存写基地址
#define MC_KB_Latch_WR_Base_Addr (volatile unsigned char *) 0xe01C //定义键盘编码值锁存写基地址
#define MC_ RD_Base_Addr (volatile unsigned char *) 0xe000 //定义回读值读基地址
//B、子程序片:
//0、延迟子程序:芯片读/写命令间要求有一定的定时间隔。
void delay(int n)
{ int i;
for( i = 0; i<n ; i++);
}
//1、写第n通道脉冲数值(必须为奇数)
cnt = Np*2-1;
MC_CNT_WR_Base_Addr[n*16+0] = (char)((cnt>> 0) & 0x0ff);delay(10);
MC_CNT_WR_Base_Addr[n*16+1] = (char)((cnt>> 8) & 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+2] = (char)((cnt>>16) & 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+3] = (char)((cnt>>24) & 0x0ff);
//2、读第n通道脉冲数值
MC_CNT_Latch_WR_Base_Addr [n*16+0] = (char)0; delay(10); //锁存第n通道脉冲数值
Cnt = MC_ RD_Base_Addr [0]; delay(10); //回读数据0字节
Cnt |= MC_ RD_Base_Addr [1]<<8; delay(10); //回读数据1字节
Cnt |= MC_ RD_Base_Addr [2]<<16; delay(10); //回读数据2字节
Cnt |= MC_ RD_Base_Addr [3]<<24; //回读数据3字节
if( Cnt ==0xffffffff)
{
//第n通道脉冲输出完处理
}
//3、写第n通道脉冲频率值
Nfrq= frq_pulse*0x10000000/MC_sys_CLK; //注意整数运算溢出问题
MC_FRQ_WR_Base_Addr [n*16+0] = (char)((Nfrq>> 0) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+1] = (char)((Nfrq>> 8) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+2] = (char)((Nfrq>>16) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+3] = (char)((Nfrq>>24) & 0x0ff);
//4、启动多个通道脉冲工作
MC_Startup_WR_Base_Addr[0] = (F0 & 1) | ((F1<<1)&2) | ((F2<<2)&4 | ((F3<<3)&8) ;
//5、停止多个通道脉冲工作
MC_Stop_WR_Base_Addr[0] = (F0 & 1) | ((F1<<1)&2) | ((F2<<2)&4 | ((F3<<3)&8) ;
//6、8位通用输出口输出
MC_GPOut_WR_Base_Addr [0] = (char)(GPOut &0x0ff) ;
//7、8位通用输入口输入
MC_GPIn_Latch_WR_Base_Addr [0] = (char)0; delay(10); //锁存通用输入口值
本文关键字:暂无联系方式电工文摘,电工技术 - 电工文摘