当前位置: 首页 > news >正文

C编程控制PC蜂鸣器

在《I/O映射之I/O端口》一文中,我们实现了在Linux内核驱动里实现IO端口操作8254定时计数器芯片里的寄存器来实现PC主机蜂鸣器的控制,那么在C语言里是不是一样也能用io控制函数来操作呢?当然是可以的,只不过作为应用程序,其需要使用iopl或ioperm函数先获得IO操作的权限,其函数原型如下: 

1.iopl - change I/O privilege level

#include <sys/io.h>
int iopl(int level);

2.ioperm - set port input/output permissions

#include <unistd.h> /* for libc5 */
#include <sys/io.h> /* for glibc */
int ioperm(unsigned long from, unsigned long num, int turn_on);

其中,iopl修改程序运行时操作io的权限级别,默认是0,最大是3;而ioperm是设置从from开始的num个io端口turn_on状态。(详细看man) 有了《I/O映射之I/O端口》一文和上面的内容学习,接下来用C来实现就很容易了,其中关于inb等函数头可使用man inb命令查阅,下面上代码吧:

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>

/* The clock frequency of the i8253/i8254 PIT */
#define PIT_TICK_RATE 1193182ul

void beep(unsigned int val)
{
        unsigned int count = 0;
        if (val > 20 && val < 32767)
                count = PIT_TICK_RATE / val;

        iopl(3);

        if (count) {
                outb_p(0xB6, 0x43);
                outb_p(count & 0xFF, 0x42);
                outb((count >> 8) & 0xFF, 0x42);
                outb_p(inb_p(0x61) | 3, 0x61);
        } else {
                outb(inb_p(0x61) & 0xFC, 0x61);
        }

        iopl(0);
}

int main(int argc,char * argv[])
{
       unsigned int val;
       if (argc != 2) {
               printf("Usage:%s value\n 20<value<32767,other value will stop!\n",argv[0]);
               return 0;
       }

       val = atoi(argv[1]);
       beep(val);

       return 0;
}

相应的Makefile文件内容如下:

all:
        make ioport_beep
        #gcc -o ioport_beep ioport_beep.c

clean:
        rm -rf ioport_beep

相应的源码文件目录树如下: 

/home/xinu/xinu/c_cpp/ioport_beep/
├── ioport_beep.c
└── Makefile 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【乐企-业务篇】开票前置校验服务-规则链服务接口实现(纳税人基本信息)
  • dedecms(四种webshell姿势)、aspcms webshell漏洞复现
  • Leetcode 144. 二叉树的前序遍历(Easy)
  • JZ2440开发板——S3C2440的UART的使用
  • STM32启用FPU浮点运算
  • MVCC机制解析:提升数据库并发性能的关键
  • LabVIEW减速机加载控制系统
  • SpringCloud-04 OpenFeign服务调用与负载均衡
  • Springboot 集成 Swing
  • 【面试八股总结】GMP模型
  • 小程序开发设计-第一个小程序:创建小程序项目④
  • curl格式化json之jq工具?
  • Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)
  • 6--SpringBootWeb案例(详解)
  • springboot实战学习笔记(2)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • FineReport中如何实现自动滚屏效果
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java多线程(4):使用线程池执行定时任务
  • markdown编辑器简评
  • Python_网络编程
  • Python连接Oracle
  • Python学习之路16-使用API
  • SpringCloud集成分布式事务LCN (一)
  • Terraform入门 - 3. 变更基础设施
  • 那些年我们用过的显示性能指标
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Mac OS X上安装 Ruby运行环境
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Spring Boot 分片上传文件
  • $(selector).each()和$.each()的区别
  • (+4)2.2UML建模图
  • (03)光刻——半导体电路的绘制
  • (1)(1.11) SiK Radio v2(一)
  • (Git) gitignore基础使用
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (九)c52学习之旅-定时器
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (七)glDrawArry绘制
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)、python程序--模拟电脑鼠走迷宫
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET和.COM和.CN域名区别
  • .NET轻量级ORM组件Dapper葵花宝典