x86键盘跑马灯

我一直痴迷于用代码来控制硬件执行各种动作,有一天我突然想到,是不是可以用电脑的键盘灯来做一个跑马灯呢?


如果你读过linux0.11代码,我们就知道,linus已经把这段代码写好了,你不需要再去翻datasheet,配寄存器,使能置位。。。不停的凑。。。


以下是一段让你的键盘灯做“跑马灯”运动的代码,代码很简单,但是很好玩!如果你手头有一个妹子,可以试试让它以摩尔斯电码,或者ASCII码来说几句情话,当电子机械的灯以一种神秘特别而真诚的方式表达出你的温柔的时候,我想一定很有feel~,当然怎么用三个灯来表达出信息,还需要做一些合理的设计。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/io.h> 
#include <errno.h> 
#include <unistd.h> 
  
#define CAP_LED 0x4 
#define NUM_LED 0x2 
#define SCR_LED 0x1 
#define OFF_ALL 0x0 
#define ON_ALL 0x7 
  
unsigned char led_seq[6] = {NUM_LED, OFF_ALL, CAP_LED, OFF_ALL, SCR_LED, OFF_ALL}; 
void set_led(unsigned char x) 
{ 
        __asm__( 
        "pushl %%eax\n\t"
        "1: inb $0x64, %%al\n\t"
        "testb $0x02, %%al\n\t"
        "jne 1b\n\t"
        "popl %%eax\n\t"
  
                "movb $0xed, %%al\n\t"
                "outb %%al, $0x60\n\t"
  
        "pushl %%eax\n\t"
        "1: inb $0x64, %%al\n\t"
        "testb $0x02, %%al\n\t"
        "jne 1b\n\t"
        "popl %%eax\n\t"
  
                "movb %0, %%al\n\t"
                "outb %%al, $0x60\n\t"
        ::"m"(x) 
        ); 
} 
int main() 
{ 
        int count = 0; 
        int i = 0; 
        if (iopl(3)) { 
                perror("iopl"); 
                exit(-1); 
        } 
    while(count < 100000) { 
        set_led(led_seq[i]); 
        usleep(100000); 
        count ++ ; 
        i ++; 
        i = i % 6; 
    } 
    while(1); 
        return 0; 
} 

在linux下用root权限跑一段代码,windows上可以试试一个叫ioperm.sys的模块,用来读写端口。

小伙伴们赶紧试试吧~~。 

另外推荐一个视频,码农的春天,很振奋人心!

你可能感兴趣的:(x86键盘跑马灯)