![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-17 01:15 |
共 47,813 主题排行 / 349,903 发帖 / 今日 0 篇 / 48,259 会员排行 |
| DOS疑难解答 & 问题讨论 (解答室) » PC系统实模式下的uS级定时解决 |
| 可打印版本 752 / 0 |
| 第1楼 郭恒 | 发表于 2004-11-17 00:00 |
| 中级用户 发帖 39 积分 225 | |
|
PC系统实模式下的uS级定时解决 PC系统的8254的里面有3个有固定用途的计数器,其端口地址为40~43H,其中40H是计数器0的数据口,41H是计数器1的数据口,42H是计数器2的数据口,43H是控制字寄存器。其中 计数器0工作于方式3,16位二进制计数,时钟值为1.1931816Mhz,用于系统计时器日时钟 计数器1工作于方式2,16位二进制计数,时钟值为1.1931816Mhz,用于存贮器定时刷新 对于方式2或方式3都是减2定时器,若要DELAY 1000uS,即1mS,则计数值wCounter计算如下所示 WORD wMicroSecond = 1000;//单位uS WORD wCounter= (WORD)(((DWORD)(1.0 * wMicroSecond*1.1931816)) >> 2); //单位计数值 //uS级的DELAY函数,其入口参数是计数值,而不是uS时间值,这样设计是为了避免函数内部的浮点数学运算,提高运行速度。内部没有关中断,用户可根据需要在函数外部关/开中断。采用计数器1,并不是计数器0,是特意安排。 //函数名称: AfxMicroDelay //入口参数: wCounter:计数值 //返 回 值: 无 void AfxMicroDelay(WORD wCounter) { //读老的计数值 label_Init:; asm mov al, 11010010B //计数器1 asm out 43H, al asm in al,41H asm mov ah, al asm in al, 41H //asm xchg al, ah asm mov bx, ax //赋计数初值,减至为零结束 asm mov cx, wCounter label_read:; //读当前值 asm mov al, 11010010B asm out 43H, al asm in al,41H asm mov ah, al asm in al, 41H //asm xchg al, ah //读计数值直到计数值变化 asm cmp ax, bx asm jz label_read asm mov bx, ax //若CX = 0,计数结束 asm cmp cx, 0 asm jz label_exit //将计数减1 asm dec cx asm jmp short label_read label_exit:; return; } |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |