文档库 最新最全的文档下载
当前位置:文档库 › LED驱动程序

LED驱动程序

LED驱动程序
LED驱动程序

设备驱动程序的开发流程

进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。在ARM平台上开发嵌入式Linux的设备驱动程序与在其他平台上开发是一样的。总的来说,实现一个嵌入式Linux设备驱动的大致流程如下:

(1)查看原理图,理解设备的工作原理

(2)定义主设备号

(3)在驱动程序中实现驱动的初始化。如果驱动程序采用模块的方式,则要实现模块初始化。

(4)设计所要实现的文件操作,定义file_operations结构。

(5)实现中断服务(中断并不是每个设备驱动所必须的)

(6)编译该驱动程序到内核中,或者用insmod命令加载

(7)测试该设备

3.2 linux下字符设备的驱动开发实例----LED驱动

(可参考FS2410P实验指导手册v2.1.2.pdf,302-313)

(1)实验内容:4个LED灯轮流闪烁

本节要求实现在一个字符设备驱动里面实现对GPIO端口的操作。

●在模块加载的时候跑马灯运行起来

●模块卸载的时候,跑马灯停止。

FS2410P上的4个LED指示灯由4个I/O口控制,它们分别是:GPF4~GPF7,输出低电平时候,相应的LED指示灯亮。

(2)LED的原理图

FS2410P带有4个用户可编程I/O方式LED,下表为LED对应的I/O口。

表1用户指示灯占用CPU资源列表

序号名字CPU端口资源

1LED1 GPF4

2 LED2 GPF5

3LED3 GPF6

4LED4GPF7

图1 LED原理图

(3)LED驱动源代码及说明

◆在/s3c2410下新建一个目录:gpiodrv

●#mkdir/s3c2410/gpiodrv

●#cd/s3c2410/gpiodrv

◆在/s3c2410/gpiodrv目录下用vi编辑器编写符合上面功能的驱动源程序

gpiodrv.c

●#cd/s3c2410/gpiodrv

●#vi gpiodrv.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define IOPORT_MAJOR 220

int magic_leds_open(struct inode*inode,struct file*filp);

int magic_leds_ioctl(struct inode*inode,struct file*filp,unsigned int cmd,unsigned long arg);

int magic_leds_release(struct inode*inode,struct file*filp);

static struct file_operations magic_leds_fops=

{

ioctl:magic_leds_ioctl,

open:magic_leds_open,

release:magic_leds_release,

};

#define LED1_ON()(GPFDAT&=~0x10)

#define LED2_ON()(GPFDAT&=~0x20)

#define LED3_ON()(GPFDAT&=~0x40)

#define LED4_ON()(GPFDAT&=~0x80)

#define LED1_OFF()(GPFDAT|=0x10)

#define LED2_OFF()(GPFDAT|=0x20)

#define LED3_OFF()(GPFDAT|=0x40)

#define LED4_OFF()(GPFDAT|=0x80)

static int ledStatus;

void LedSet(int led)

{

ledStatus=led;

if(ledStatus&1)

LED1_ON();

else

LED1_OFF();

if(ledStatus&2)

LED2_ON();

else

LED2_OFF();

if(ledStatus&4)

LED3_ON();

else

LED3_OFF();

if(ledStatus&8)

LED4_ON();

else

LED4_OFF();}

void LedDisy(void)

{

LedSet(0x08);

udelay(0x500000);

LedSet(0x04);

udelay(0x500000);

LedSet(0x02);

udelay(0x500000);

LedSet(0x01);

udelay(0x500000);

LedSet(0x02);

udelay(0x500000);

LedSet(0x04);

udelay(0x500000);

LedSet(0x08);

udelay(0x500000);

}

static int__init magic_leds_init(void)

{

int result=0;

printk("magic_leds_init\n");

result=register_chrdev(IOPORT_MAJOR,"gpio",&magic_leds_fops); if(result<0)

{

printk("Failed to register major.\n");

return result;

}

printk("success to register\n");

return 0;

}

int magic_leds_open(struct inode*inode,struct file*filp)

{

GPFCON=0x5500;

GPFUP=0xff;

printk("open gpio devices\n");

return 0;}

void__exit magic_leds_exit(void)

{

unregister_chrdev(IOPORT_MAJOR,"gpio");

}

int__exit magic_leds_release(struct inode*inode,struct file*filp)

{

printk("release this device\n");

return 0;

}

int magic_leds_ioctl(struct inode*inode,struct file*filp,unsigned int cmd,unsigned

long arg)

{

int err=0;

if(cmd==1)

{

while(arg--)

{

LedDisy();

printk(".....");

}

printk("\n");

return 0;

}

return err;

}

module_init(magic_leds_init);

module_exit(magic_leds_exit);

(3)编译安装LED驱动

◆同样,在/s3c2410/gpiodrv目录下用vi编辑器编写该驱动程序的Makefile文件:(Makefile 的编写可参考Makefile中文教程.pdf)

●#vi Makefile输入以下内容:

CROSS=arm-linux-gcc

CFLAGS=-D__KERNEL__

CFLAGS+=-DMODULE

CFLAGS+=-I/s3c2410/2.4.18-rmk7/include

CFLAGS+=-I/s3c2410/2.4.18-rmk7/include/linux

CFLAGS+=-I/usr/local/arm/2.95.3/include

CFLAGS+=-Wall-Wstrict-prototypes-Wno-trigraphs-Os-mapcs

CFLAGS+=-fno-strict-aliasing-fno-common-fno-common-pipe-mapcs-32

CFLAGS+=-march=armv4-mtune=arm9tdmi-mshort-load-bytes-msoft-float

CFLAGS+=-DKBUILD_BASENAME=gpiodrv

all:gpiodrv.o

gpiodrv.o:gpiodrv.c

$(CROSS)$(CFLAGS)-o gpiodrv.o-c gpiodrv.c

clean:

-rm-f$(EXEC)*.o*~core

将gpiodrv.c和Makefile这个放置在同一个新建目录下gpiodrv下,进入这个目录,输入make 后,编绎成功后将在这个目录下生成一个gpiodrv.o文件。

●#cd/s3c2410/gpiodrv

●#make

3.3 linux下字符设备的驱动开发实例—测试LED

(1)在/s3c2410/gpiodrv目录下用vi编辑器编写led驱动程序相应的测试

程序gpio_test.c

●#vi gpio_test.c

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char**argv)

{

int i;

int fd;fd=open("/dev/gpio",0);

if(fd<0)

{

perror("Failed to open device");

exit(1);

}

while(1)

printf("please select number to run program\n");

printf("1:led on\n2:quit");

scanf("%d",&val);

if(val==1)

ioct1(fd,1,10);

else if(val==2)

{

close(fd);

}

return 0;

}

编译gpio_test.c,得到可执行文件gpio_test。即用下面的命令:

#arm-linux-gcc–o gpio_test gpio_test.c

3.4 linux下字符设备的驱动开发实例—实验步骤

(也可参考FS2410P实验指导手册v2.1.2.pdf,311-313上的方法)

(1)PC机进入LINUX系统,配置好minicom,连接好串口线,让FS2410P教学实验平台进入LINUX 环境,利用minicom来显示。

(2)将编绎生成的gpiodrv.o和gpio_test用NFS mount到/tmp目录下。(方法参考实验三---通过NFS进入映射)

#mount 192.168.3.111:/s3c2410/tmp

#cd/tmp

#cd/gpiodrv

(3)加载设备驱动gpiodrv.o模块:

insmod gpiodrv.o

如果加载成功,可以通过cat/proc/devices命令查看该设备的相关信息。卸载该设备驱动模块的命令是:rmmod gpiodrv

(4)建立gpio设备节点:mknod/dev/gpio c 220 0/dev/gpio为该设备驱动程序的设备名,C表明该设备为字符设备,220为该设备的主设备好,0为从设备号。(5)执行gpio_test程序:./gpio_test

(6)在minicon终端选择1,回车,可以看到4个LED灯轮流闪烁。

选择2,则退出程序的运行。

(7)将应用程序添加根文件系统,并烧写到开发板。

◆将FS2410XP_camare_demo.cramfs拷贝到/s3c2410目录下。

◆在该目录下建立两个文件:

#cd/s3c2410/

#mkdir chang

#mkdir guo

◆将FS2410XP_camare_demo.cramfs挂接到chang目录。

#mount-o loop FS2410XP_camare_demo.cramfs chang

◆将chang目录下的内容压缩。

#cd chang

#tar-cvf/s3c2410/1.tar./

这时,将在chang的目录产生一个1.tar的包。

#cd..

#

mv 1.tar guo

#cd guo

#tar-xvf 1.tar#rm 1.tar

rm:是否删除一般文件“1.tar”?y

◆将自已的gpiodrv.o和gpio_test拷贝到相应的目录下。

将gpiodrv.o拷贝到guo/usr/目录下

将gpio_test拷贝到guo/bin下

◆现在开始制作cramfs根文件系统

./mkcramfs/s3c2410/guo FS2410XP_camare_demo.cramfs

◆下载FS2410XP_camare_demo.cramfs根文件系统到开发板:

★使用tftpcmd网络传输,设置宿主机IP地址,将其地址与开发平台的IP地址设置在同一网段内。这里,将PC的IP设为192.168.0.121。并把

tftpcmd复制到/bin文件夹下。

★#cd/s3c2410/guo

★新建一个down文件

#vi down

tftpcmd 202.193.9.21 69 put FS2410XP_camare_demo.cramfs

★改变down的属性

#chmod 777 down

★改变tftpcmd的属性

#chmod 777/bin/tftpcmd

★将开发板与PC机用交叉网线连接好,复位开发板,按住A键,进入BIOS

命令行状态提示符:(minicom)

\>netload

★#./down

或是双击down批处理文件,选择在终端运行,可以看到内核映像下载到了开发板。★传输完后,再输入命令“nfprog”,然后回车,然后输入“2”选择第

二个区块,输入“Y”确认将文件烧写到nandflash中。

◆重复操作(3),(4),(5),(6),可看到实验结果。

驱动模块makefile文件编写求助

自己编的一个linux驱动,我原来的工程目录是这样的:工程总目录下有一个include文件夹,所有的.c源文件,makefile文件,还有一个总的x.h头文件,x.h中include了include 文件夹中所有的头文件和一些内核的头文件。include文件夹里有几个子文件夹,按类放头文件。每个.c源文件都#include "x.h"。下面是原来的makefile文件。在工程总目录下make

可以生成.ko文件。

KERNELDIR :=/arm/linux-2.6.22.19

PWD :=$(shell pwd)

CFLAGS =-fno-common

CROSS_COMPILE =/arm/3.4.1/bin/arm-linux-

CC =$(CROSS_COMPILE)gcc

OBJECTS :=a.o b.o c.o d.o e.o

obj-m := mydriver.o

mydriver-objs := $(OBJECTS)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

rm -rf *.o *.ko *.mod.o *.mod.c

现在工程的文件越来越多,很乱。我想建立这样的工程目录:

工程总目录下有:include文件夹,src文件夹,makefile文件。include文件夹和src文件夹下都有几个子文件夹,都按类放好头文件或源文件。x.h头文件也放在include文件夹

下。

应该怎么来写makefile。怎么样在驱动模块的makefile中指定头文件、源文件的目录?是

否还需要指定内核头文件的目录?

大家帮我看看!谢谢!

编译驱动模块

2009-07-29 10:45

有两种方法可以编译自己写的驱动程序。

第一种方法:直接加入内核

1. 将驱动程序放入内核相应的驱动文件夹,例如名字为my_led.c

2. 修改此驱动目录下的Kconfig文件,加入对该驱动文件的配置选项:

config MY_LED

bool "S3C2410 LED Driver"

depens on ARCH_S3C2410

help

LED driver for the samsung s3c2410

说明:my_LED是配置选项标题

bool表示该选项要么是y要么是n,不可编译成模块。如需要编译成模块则改为tristate(三态)

3. 修改此驱动目录下的Makefile文件,加入对驱动源码的编译:

obj-$(CONFIG_MY_LED) += my_led.o

第二种方法:单独编译驱动模块(1)

1. 下载内核源代码,选择和你的驱动相同的平台的配置文件进行编译,

假设路径为/root/linux-2.6.29。或者利用/usr/src下面的源码,这样就只能编译主机平台上的驱动。

2. 将驱动文件放在一目录下,例如/root/dirver/my_led.c

3. 在/root/driver下编写Makefile文件,内容为:

obj-m := my_led.o

如果这个模块包含多个.c文件,则如下编写Makefile :

obj-m := module_name.o

module-objs := file1.o file2.o ...

4. 在本目录下执行:

make -C /root/linux-2.6.29 M=$(pwd) modules

第三种方法:单独编译驱动模块(2)

直接编写Makefile文件:

obj-m :=led.o

CURRENT_PATH := $(shell pwd)

ARM_LINUX_KERNEL :=/root/linux-2.6.29

all:

$(MAKE) -C $(ARM_LINUX_KERNEL) M=$(CURRENT_PATH) modules

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order

运行make即可

Linux下LED驱动的开发笔记

Linux 2010-07-06 15:52:15 阅读17 评论0 字号:大中小订阅

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include //arm-linux-gcc编译器包含的头文件//#include

//#include

#include arm-linux-gcc编译器包含的头文件

#include arm-linux-gcc编译器包含的头文件MODULE_LICENSE("Dual BSD/GPL");

//#define LED_DRIVER "utu2440 LED Driver v1.00"

#define GPIO_LED_MAJOR 0 //主设备号,如果为0的话,由系统自动分配//#define EINVAL 22

/*static unsigned long led_table [] = {

S3C2410_GPF4,

S3C2410_GPF5,

S3C2410_GPF6,

S3C2410_GPF7,

};*/

//static int led_ioctl(struct inode *inode, struct file *file,

// unsigned int cmd, unsigned long arg);

static int led_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg) {

switch (cmd)

{

case 0:{s3c2410_gpio_setpin(S3C2410_GPF4, 1);

s3c2410_gpio_setpin(S3C2410_GPF5, 1);

s3c2410_gpio_setpin(S3C2410_GPF6, 1);

s3c2410_gpio_setpin(S3C2410_GPF7, 1);

break;}

case 1:{s3c2410_gpio_setpin(S3C2410_GPF4, 0);

s3c2410_gpio_setpin(S3C2410_GPF5, 0);

s3c2410_gpio_setpin(S3C2410_GPF6, 0);

s3c2410_gpio_setpin(S3C2410_GPF7, 0);

break;}

default:

{ printk("no cmd led!");

return -1;

}

}

return 0;

}

static struct file_operations ledz_fops = {

.ioctl = led_ioctl,

};

static int led_init(void)

{

//pr_info("%s\n", LED_DRIVER);

int ret = -1;

//s3c2410_gpio_setpin(S3C2410_GPFCON, 0x55aa);

//s3c2410_gpio_setpin(S3C2410_GPFUP, 0xff);

//s3c2410_gpio_setpin(S3C2410_GPFDA T, 0xff);

//S3C2410_GPFCON=0x55aa;

//S3C2410_GPFUP=0xff;

//S3C2410_GPFDA T=0xff;

s3c2410_gpio_setpin(S3C2410_GPF4, 1);

s3c2410_gpio_setpin(S3C2410_GPF5, 1);

s3c2410_gpio_setpin(S3C2410_GPF6, 1);

s3c2410_gpio_setpin(S3C2410_GPF7, 1);

ret = register_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl",&ledz_fops);//完成注册

if(ret < 0)

{

printk("S3C2410 :init_module failed with %d\n",ret);

return ret;

}

else

printk("S3C2410 :init_module register success!!\n");

return ret;

}

static int __init gpio_led_init(void)

{

int ret = -1;

ret =led_init();

if (ret)

return ret;

return 0;

}

static void __exit led_exit(void)

{

int ret;

ret = unregister_chrdev(GPIO_LED_MAJOR, "gpio_led_ctl");//注销注册

if(ret < 0)

{

printk("S3C2410 :exit_module failed with %d\n",ret);

return ret;

}

else

printk("S3C2410 :exit_module unregister success!!\n");

}

module_init(gpio_led_init);

module_exit(led_exit);

Makefile

# Makefile

# Please modify here or set environments.

# KSOURCE should be pointed to the build directory of your kernel.

#

DEBUG ?= n

#KSOURCE ?= /home/azure/Utu-linux/s3c2440/Kernel/utu-linux_for_s3c2440_V1.5/

KSOURCE ?= /utu-linux/utu-linux

//内核目录,这里的目录是与目标机的linux内核相同版本,并不是自己的linux版本,是重新将源码文件拷到linux下解压后的目录

%.x:%.c

arm-linux-gcc -o $@ $<

KBUILD_VERBOSE:=1

obj-m := leds.o

default:

make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} SUBDIRS=`pwd` modules

.PHONY: cscope

cscope:

cscope -b -k -R

.PHONY: clean

clean:

make -C $(KSOURCE) LANG=C KBUILD_VERBOSE=${KBUILD_VERBOSE} SUBDIRS=`pwd` clean rm -f *.x *~

测试程序

#include

#include

#include

#include

int main()

{

int fd;

int num;

int ope;

fd = open("/dev/gpio_led_ctl", 0);

if (fd < 0)

{

perror("open miniled fail");

exit(1);

}

while(1)

{

ioctl(fd, 1);

sleep(1);

ioctl(fd, 0);

sleep(1);

}

close(fd);

return 0;

}

在有leds.c的文件目录下

make

生成4个文件:leds.ko leds.mod.c leds.mod.o leds.o

这里只需要leds.ko,将这个文件传到目标机上,

insmod leds.ko,

Using leds.ko

S3C2410 :init_module register success!!

如果挂载成功,可在/proc/devices 目录下发现挂载的设备名lsmod

Module Size Used by Not tainted

leds 1632 0 - Live 0xbf000000

cat /proc/devices

Character devices:

1 mem

2 pty

3 ttyp

4 /dev/vc/0

4 tty

5 /dev/tty

5 /dev/console

5 /dev/ptmx

7 vcs

10 misc

13 input

14 sound

29 fb

81 video4linux

89 i2c

90 mtd

128 ptm

136 pts

180 usb

204 s3c2410_serial

253 gpio_led_ctl

254 utu2440-buttons

Block devices:

1 ramdisk

7 loop

8 sd

31 mtdblock

43 nbd

65 sd

66 sd

67 sd

68 sd

69 sd

70 sd

71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

254 mmc

然后到/dev 目录下

mknod gpio_led_ctl c 253 0

ls -l /dev |grep gpio_led_ctl

crw-r--r-- 1 root root 253, 0 Jan 1 00:09 gpio_led_ctl 然后运行测试程序

./testled

4个灯不断的闪烁!

Makefile

两个连接成一个模块?

还是两个独立的模块?

两个连接成一个模块

obj-m := module.o //名字随便写

module-y := rs-raidmain.o xor.o

两个独立的模块

obj-m := rs-raidmain.o xor.o

#include /*它定义了模块的API、类型和宏(MODULE_LICENSE、MODULE_AUTHOR等等),所有的内核模块都必须包含这个头文件。/

#include /*使用内核信息优先级时要包含这个文件,一般在使用printk函数时使用到优先级信息*/

#include //头文件:module_init、module_exit等宏定义。

#include ////struct file_operations

#include

#include // S3C2410 GPIO寄存器定义

#include // s3c2410_gpio_setpin, s3c2410_gpio_cfgpin等

#include //class_create device_create(注意,有些 2.6.27以前是的可能是class_device_create,如果出现implicate 错误时,看一下这个头问题里边是哪一个),udev,自动在/dev下创建设备节点

#include //字符设备节点注册,函数有cdev_init,cdev_add,cdev_del等早期的办法是register_chrdev,unregister_chrdev这种方法应避免使用。

#define DEVICE_NAME "leds" /* 加载模式后,执行”cat /proc/devices”命令看到的设备名称*/#define LED_MAJOR 231 /* 主设备号*//* 应用程序执行ioctl(fd, cmd, arg)时的第2个参数*/

#define IOCTL_LED_ON 1

#define IOCTL_LED_OFF 0/* 用来指定LED所用的GPIO引脚*/static unsigned long led_table [] ={ S3C2410_GPB5, S3C2410_GPB6, S3C2410_GPB7, S3C2410_GPB8,};

/* 应用程序对设备文件/dev/EmbedSky-leds执行open(...)时,

* 就会调用EmbedSky_leds_open函数

*/

static int EmbedSky_leds_open(struct inode *inode, struct file *file)

{

int i;

for (i = 0; i < 4; i++)

{ // 设置GPIO引脚的功能:本驱动中LED所涉及的GPIO引脚设为输出功能s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

}

return 0;}

/* 应用程序对设备文件/dev/EmbedSky-leds执行ioclt(...)时,

* 就会调用EmbedSky_leds_ioctl函数

*/

static int EmbedSky_leds_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

{

if (arg > 4)

{

return -EINVAL;

}

switch(cmd)

{ case IOCTL_LED_ON: // 设置指定引脚的输出电平为0 s3c2410_gpio_setpin(led_table[arg], 0);

return 0;

case IOCTL_LED_OFF: // 设置指定引脚的输出电平为 1 s3c2410_gpio_setpin(led_table[arg], 1);

return 0;

default: return -EINVAL; }

}

/* 这个结构是字符设备驱动程序的核心

* 当应用程序操作设备文件时所调用的open、read、write等函数,

* 最终会调用这个结构中指定的对应函数

*/

static struct file_operations EmbedSky_leds_fops ={

.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量*/

.open = EmbedSky_leds_open,

.ioctl = EmbedSky_leds_ioctl,};

static char __initdata banner[] = "TQ2440/SKY2440 LEDS, (c) 2008,2009 https://www.wendangku.net/doc/e21513734.html,\n"; static struct class *led_class;

/*

* 执行“insmod EmbedSky_leds.ko”命令时就会调用这个函数

*/

static int __init EmbedSky_leds_init(void)

{

int ret;

dev_t devno=MKDEV(LED_MAJOR,0);

printk("init led\n");

printk(banner);

/* 注册字符设备驱动程序

* 参数为主设备号、设备名字、file_operations结构;

* 这样,主设备号就和具体的file_operations结构联系起来了,

* 操作主设备为LED_MAJOR的设备文件时,就会调用EmbedSky_leds_fops中的相关成员函数

ret = register_chrdev_region(devno, 1,DEVICE_NAME);//获得设备编号my_leds_dev=kmalloc(sizeof(struct leds_type),GFP_KERNEL);

/*这个必须有不然会在加载模块时出现Unable to handle kernel NULL pointer dereference at virtual addres 00000000 错误,这是由于在这里my_leds_dev仅仅是个指针,没有相应大小的分配内存,所以使用时会出错,,,寻找这个错误是比较麻烦的*/

if(!my_leds_dev)

{

ret=-ENOMEM;

goto fail_malloc;

}

memset(my_leds_dev,0,sizeof(struct leds_type)); cdev_init(&(my_leds_dev->cdev),&EmbedSky_leds_fops);

ret=cdev_add(&(my_leds_dev->cdev),devno,1);

/*注意:与早期的设备注册方法不同,早期的直接register_chrdev()就可以,*/ if(ret)printk(KERN_NOTICE"ERROR %d",ret); //注册一个类,使mdev可以在"/dev/"目录下面建立设备节点

led_class = class_create(THIS_MODULE, DEVICE_NAME); if(IS_ERR(led_class)) { printk("Err: failed in EmbedSky-leds class. \n"); return -1; } //创建一个设备节点,节点名为DEVICE_NAME device_create(led_class, NULL, MKDEV(LED_MAJOR, 0), NULL, DEVICE_NAME); printk(DEVICE_NAME " initialized\n"); return 0; fail_malloc: unregister_chrdev_region(devno,1); return ret;}/* * 执行”rmmod EmbedSky_leds.ko”命令时就会调用这个函数*/static void __exit EmbedSky_leds_exit(void){ /* 卸载驱动程序*/ unregister_chrdev(LED_MAJOR, DEVICE_NAME); device_destroy(led_class, MKDEV(LED_MAJOR, 0)); //删掉设备节点class_destroy(led_class); //注销类}/* 这两行指定驱动程序的初始化函数和卸载函数*/module_init(EmbedSky_leds_init);module_exit(EmbedSky_leds_exit);/* 描述驱动程序的一些信息,不是必须的*/MODULE_AUTHOR("https://www.wendangku.net/doc/e21513734.html,"); // 驱动程序的作者MODULE_DESCRIPTION("TQ2440/SKY2440 LED Driver"); // 一些描述信息MODULE_LICENSE("GPL"); // 遵循的协议

写内核模块Makefile的技巧

hansel@https://www.wendangku.net/doc/e21513734.html,

2007.11.07

Linux 2.6的内核使用Kbuild来编译内核模块。Kbuild能够编译内核树目录内的内核模块,也能够编译内核树目录外的内核模块(外部内核模块)。

.编译外部内核模块的命令:

#cd

#make -C M=`pwd`

其中为要编译的内核模块所在目录, 为内核源码所在的目录。

对于发行版本的Linux,可以用:

#make -C /lib/modules/`uname -r`/build M=`pwd`

注意:使用Kbuild之前,必须先成功编译过内核源码。

说明:

.#make -C M=`pwd` modules

作用与上面的命令一样

.以前的内核版本可以使用

#make -C SUBDIRS=`pwd` modules

.安装外部内核模块

#make -C M=`pwd` modules_install

默认安装目录为:/lib/modules/`uname -r`/extra,可以通过INSTALL_MOD_PATH宏在默认安装路径前加前缀。

例如:

#make -C INSTALL_MOD_PATH=/opt M=`pwd` modules_install

则编译后的模块会放在/opt/lib/modules/`uname -r`/extra

通过宏INSTALL_MOD_DIR可以修改是否放在'extra'下,例如:

#make -C INSTALL_MOD_DIR=golf M=`pwd` modules_install

则编译后的模块会放在/lib/modules/`uname -r`/golf

.编译单个文件

#make -C M=`pwd`

.其他命令

#make -C M=`pwd` clean

#make -C M=`pwd` help

LED显示屏控制软件操纵使用说明(灵信V3.3)

第一章概述 1.1 功能特点 《LED Player V3.3》是本公司新推出的一套专为LED显示屏设计的功能强大,使用方便,简单易学的节目制作、播放软件,支持多种文件格式:文本文件,WORD文件,图片文件(BMP/JPG/GIF/JPEG...),动画文件(SWF /Gif)。 2.2 运行环境 操作系统 中英文Windows/7/NT/XP 硬件配置 CPU: 奔腾600MHz以上 内存:128M 相关软件 OFFICE2000--如需WORD文件必须安装

第二章安装与卸载 2.1 安装 《LED Player》软件安装很简单,操作如下:将LED Player播放软件的安装光盘插入电脑光驱,即可显示LED Player播放软件的安装文件,双击LED Player,即可实现轻松安装。 《LED Player》软件安装成功后,在【开始】/【程序】里将出现“LED软件”程序组,然后进入该程序组下的“LED Player”,单击即可运行,如图所示, opyright ? 2005-2007 Listen tech. All Rights Reserved 灵感设计诚信 同时,桌面上也出现“LED Player”快捷方式:如右图所示,双击它同样可以启动程序。

2.2 卸载 《LED Player》软件提供了自动卸载功能,使您可以方便地删除《LED Player》的所有文件、程序组和快捷方式,用户可以在“LED软件”组中选择“卸载LED Player”,也可在【控制面板】中选择【添加/删除程序】快速卸载. 第三章使用详解 3.1 节目组成 每块显示屏由一个或多个节目页组成。节目页是用来显示用户所要播放的文本、图片、动画等内容。区域窗口有十一种:图文窗、文本窗、单行文本窗、静止文本窗、时间窗、正计时窗、倒计时窗、模拟时钟窗、表格窗、动画窗、温度窗。 文件窗:可以播放各种文字、图片、动画、表格等几十种文件。 文本窗:用于快速输入简短文字,例如通知等文字。 单行文本窗:用于播放单行文本,例如通知、广告等文字。 静止文本窗:用于播放静止文本,例如公司名称、标题等文字。 时间窗:用于显示数字时间。 计时窗:用于计时,支持正/倒计时显示。

基于某STM32LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟 #define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平 #define LCD_RESET_0 LCD_CONTROL->BRR = LCD_RESET_Pin // 复位 #define LCD_RESET_1 LCD_CONTROL->BSRR = LCD_RESET_Pin // 复位脚拉高 #define DATAOUT LCD_DATAPORT->ODR &=0xff00;LCD_DATAPORT->ODR // 数据输出寄存器 #define DATAIN LCD_DATAPORT->IDR // 数据输入寄存器 #define LCD_BF ((DATAIN)& 0x0080) // 忙状态 void LCD_delayus(unsigned long n); //延时n(us) void LCD_delayms(unsigned long n); //延时n(ms) void LCD_WriteInitcmd(uint8_t initcmd); //写初始化命令 void LCD_WaitLaisure(void); //一直等待到LCD内部操作完成,变为空闲状态 void LCD_Writecmd(uint8_t cmd); //写命令到LCD12864 void LCD_WriteByte(uint8_t byte); //写一字节数据到LCD12864 void LCD_pos(uint16_t pos); //LCD显示位置设置 void LCD_Setpos(uint16_t row,uint16_t col);//设定LCD12864的显示地址,根据习惯 void LCD_DispChar(char ch); //显示一个字符 void LCD_Setpos_DispChar(uint16_t row,uint16_t col,char ch);//在指定位置显示一个字符 void LCD_DispString(char str[]); //显示一个字符串,显示位置需提前设定

嵌入式点亮一个LED灯的程序

飞凌OK6410开发板(裸板)第一个点亮LED灯程序,主要的C程序,完整程序请下载附件。 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) void msDelay(int time) { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j

1.设计要求 EM-STM3210E开发板上有一个LED灯D1,编写程序点亮该灯。 2.硬件电路连接 在开发板上,D1与STM32F103ZE芯片上的引脚PF6相连,如下图所示。 3.软件程序设计

根据任务要求,程序内容主要包括: 1、配置Reset and clock control (RCC)以使能GPIOF端口模块的时钟 2、配置GPIOF端口的PF6引脚(50MHz,推挽输出) 3、调用STM32标准固件库函数GPIO_WriteBit以令PF6引脚输出高电平,从而点亮LED灯D1。 整个工程用户只需要实现源代码文件:main.c,其他工程文件由MDK和STM32标准固件库提供。 main.c文件的内容如下: [cpp] /** ********************************************************** ******************** * @file main.c * @author Max Liao * @version * @date 02-Novenber-2012 * @brief Main program body ********************************************************** ******************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/

DSP课程设计---液晶显示器控制显示

一、设计题目:液晶显示器控制显示 (1) 二、设计目的与步骤: (1) 2.1、 (1) 2.2、 (1) 三、设计原理: (2) 3.1、扩展IO接口: (2) 3.2、液晶显示模块的访问、控制是由VC5416 DSP对扩展接口的操作完成.. 2 3.3、液晶显示模块编程控制: (2) 3.4、控制I/O口的寻址: (2) 3.5、显示控制方法: (2) 3.6.液晶显示器与DSP的连接: (4) 3.7、数据信号的传送: (4) 四、 CCS开发环境 (5) 4.1、 (5) 4.2、 (6) 五、C语言程序 (8) 六、实验结果和分析 (15) 6.1、 (15) 6.2、 (16) 6.3、 (16) 6.4、 (16) 七、设计收获及体会 (17)

一、设计题目:液晶显示器控制显示 二、设计目的与步骤: 2.1、设计目的 通过实验学习使用VC5416 DSP的扩展I/O端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 2.2、设计步骤 1.实验准备: ⑴连接实验设备:请参看本书第三部分、第一章、二。 2.设置Code Composer Studio 2.21在硬件仿真(Emulator)方式下运行: 3.启动Code Composer Studio 2.21: 选择菜单Debug→Reset CPU。 4.打开工程文件:浏览LCD.c文件的内容,理解各语句作用 工程目录:C:\ICETEK\VC5416AES61\VC5416AES61\Lab0403-LCD\LCD.pjt。5.编译、下载程序。 6.运行程序观察结果: 7将内层循环中的 “CTRLCDLCR=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);”语句改为“CTRLCDRCR=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);”,重复步骤5-6,实现在屏幕右侧显示。 8.更改程序中对页、列的设置,实现不同位置的显示。

很好用的12864驱动程序

/////////////////////////////////////////////////////////// #include #include #define uchar unsigned char #define uint unsigned int //////////单片机与液晶显示的引脚连接///////// sbit P32=P3^2; //RST sbit P33=P3^3; //CS2 sbit P34=P3^4; //CS1 sbit P35=P3^5; //E sbit P36=P3^6; //rs&DI sbit P37=P3^7; // R/W ////////延时///////// void delay(uint v) { while(v!=0)v--; } ////////复位/////////// void reset() { P32=0; delay(10); P32=1; delay(10); } ////////write code写指令/////// void wcode(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=0; P36=0; P1=c; P35=0; delay(10);

P35=1; delay(10); P35=0; } /////////write data写数据/////////////// void wdata(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=1; P36=0; P1=c; P35=0; delay(10); P35=1; delay(10); P35=0; } ////////////set start设置起始行///////////// void set_startline(uchar i)//起始行。11A5A4A3A2A1A0 共有64行 // 液晶显示器的最底层为第一行 { i=0xc0+64-i;//此算法为把最顶层做为第一层 wcode(i,1,1); } ////////////set 页值设置,起始列值函数///////////// void set_adr(uchar x,uchar y) { x=x+0xb8;//页地址设置。10111A2A1A0 DDRAM的8行为一页,A0~A2为页码,LCD为64行8页 y=y+0x40;//列地址设置。01A5A4A3A2A1A0 两半屏分别有64列,A0~A5送入列地址计数器, //作为列(Y)地址指针。每读写一次其自动加一,指向下一列DDRAM单元wcode(x,1,1); wcode(y,1,1); } ///////////on/off开/关显示函数//////////////

dsp实验报告 哈工大实验三 液晶显示器控制显示实验

实验三液晶显示器控制显示实验 一. 实验目的 通过实验学习使用2407ADSP 的扩展I/O 端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 二. 实验设备 计算机,ICETEK-LF2407-EDU 实验箱。 三.实验原理 ICETEK-LF2407-A 是一块以TMS320LF2407ADSP 为核心的DSP 扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。 液晶显示模块的访问、控制是由2407ADSP 对扩展I/O 接口的操作完成。 控制I/O 口的寻址:命令控制I/O 接口的地址为0x8001,数据控制I/O 接口的地址为0x8003 和0x8004,辅助控制I/O 接口的地址为0x8002。 显示控制方法: ◆液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的象素,向其中写入数 值将改变显示,写入“1”则显示一点,写入“0”则不显示。其地址与象素的对应 方式如下: ◆发送控制命令:向液晶显示模块发送控制命令的方法是通过向命令控制I/O 接口 写入命令控制字,然后再向辅助控制接口写入0。下面给出的是基本命令字、解释 和 C 语言控制语句举例。 ?显示开关:0x3f 打开显示;0x3e 关闭显示; ?设置显示起始行:0x0c0+起始行取值,其中起始行取值为0 至63; ?设置操作页:0x0b8+页号,其中页号取值为0-7; ?设置操作列:0x40+列号,其中列号为取值为0-63; ◆写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的 数据写入液晶显示模块的缓存。将数据发送到相应数据控制I/O 接口即可。

利用拨码开关控制液晶显示器进行ASIC字符显示

中北大学 课程设计说明书 学生姓名:甘世伟学号:04 学院: 电子与计算机科学技术学院 专业: 微电子学 题目: 利用拨码开关控制液晶显示器进行ASIC字符显示 指导教师:王红亮职称: 讲师 2010 年 6 月 25 日 目录

表—1:OCMJ2X8(128X32)引脚说明....................- 12 -硬件接口 ..................................................................................................................................................................... - 13 -四、电性能参数 ......................................................................................................................................................... - 13 -1)表—1模块时间参数表.........................- 13 -2)表—2模块主要电气参数表.......................- 14 -用户命令 ..................................................................................................................................................................... - 14 -外型尺寸图(图11) .............................................................................................................................................. - 15 -6.附录:液晶显示器简介 (13) 1、课程设计目的 (1)学习操作数字电路设计实验开发系统,掌握液晶显示器的工作原理及应用。 (2)掌握组合逻辑电路、时序逻辑电路的设计方法。 (3)学习掌握可编程器件设计的全过程。 2、课程设计内容和要求: 、设计内容 用VHDL语言编写程序,利用拔码开头控制液晶显示器进行ASIC字符显示。 、设计要求 (1)学习掌握拔码开头控制模块、液晶显示模块的工作原理及应用; (2)熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑;

led显示屏控制卡-LED显示屏控制器原理

目录 第一章 801型、802型卡功能简介 (1) 第二章硬件参数 (5) 第二章第8代控制系统使用手册 (6) 第三章国标网线制作方法 (25) Index Chapter I Model 801 and 802 functions and features (27) Chapter II Model 801 and 802 manual (30) Chapter III Communication cable making method (49) 深圳三鑫维科技是一家专业生产制造LED显示屏的知名企业,20年的led行业研究经验,如还有不理解的请咨询电话:9

第一章 801型、802型卡功能简介 一、完全兼容第七代 基于第七代升级开发,原功能不少,新功能更多更强大,系统更稳定更可靠。可与七代系统混合使用。 二、支持10位颜色 旧系统的8位颜色只能显示256X256X256=1677216种颜色,新系统颜色数为1024X1024X1024=1073741824种颜色,新系统颜色数是旧系统的64倍。 三、智能连接功能 同一块显示屏的多块接收卡/箱体(含备用的)可以任意交换而不需重新设置,接收卡能智能地动识别需显示的内容。 四、智能监控 每块接收卡均有温度检测和四路风扇监控输出,可根据用户设定的温度上限智能地控制四路风扇转速。 五、公司图标显示 当发送卡电源没开启时显示屏自动显示设定的公司图片,图片像素为128X128,颜色数为16K色。 六、支持16以内的任意扫描方式 原系统只支持1、2、4、8、16扫描,新系统为1、2、3、4、5、6、 7、8、9、10、11、12、13、14、15、16扫描。 七、支持模块宽度为64以内的任意数

无字库12864液晶的驱动方法

无字库12864液晶的驱动方法 在制作单片机系统时,一般都需要用显示器件来显示单片机的工作状态并显示输出结果,如LED、数码管和液晶显示器等。LED最简单,但能给出的信息很少。数码管能清晰地显示数字和部分字母,但是耗电较大,不适合使用电池供电的装置。 常见的液晶显示器有段式液晶、字符液晶和图形液晶等。其中,段式液晶最省电,但对于通用显示使用起来不很方便,只能显示固定式数字或符号,而且需要专用驱动电路或特殊的单片机。 字符液晶(如1602)用得比较多,容易和单片机配合,但是一般都需要5V工作电压,虽然现在也有3V就可以工作的模块,但是体积还是较大,而且只能显示数字和西文字符,无法显示图形和汉字。 点阵液晶模块既可以显示ASCII字符,又可以显示汉字和图形,相对于前面几种,具有更大的灵活性,所以使用得越来越多。不过常用的图形液晶因为显示面积增加,体积比字符液晶(如1602)更大,价格也更贵。初学者要注意的是,12864图形点阵液晶随着厂家设计使用的驱动芯片不同,驱动程序有所区别,不像1602那样基本通用。 几种常见的12864图形点阵模块 12864点阵液晶模块分为带汉字库和不带汉字库两大类,目前带汉字库的通常是ST7920驱动,它可以工作在汉字字符方式和图形点阵方式,很多制作都用它,如果需要显示较多汉字,用它最为方便。 在显示汉字数量很少的场合,我们可以使用更加廉价的、不带字库的点阵液晶模块,这正是本文重点介绍的。它们的控制电路有KS0108和ST7565两种:KS0108很简单,一共只有7条指令,可是它没有串行接口;ST7565有20多条指令(最常用的也就几条),有串行接口,可选串行或并行工作。KS0108和ST7565的指令和上述带字库的ST7920区别较大,所以初学者买液晶时一定要搞清楚是哪种驱动电路。即使同样的驱动电路,不同厂家或者不同型号的产品,具体细节仍可能不同。例如有的片选信号是高电平有效,有的却是低电平有效,有的把显示区分为左右两半分别选取,有的却不加区分。所以使用前要仔细看厂家说明,如果没有,就要看液晶模块背面给出的具体型号,根据这个型号去查找使用手册。 笔者最近在淘宝网上搜寻到一款12864的图形点阵液晶,只有4cm宽、3.5cm高,显示面积为3.2cm宽、1.95cm高,非常小巧。更加难能可贵的是它可以在3V低电压工作,很适合我们制作小型便携装置。该液晶模块型号是SP12864FPD-12CSBE,由北京集粹电子设备公司出品,它的外形见图1。

LED驱动程序设计

LED驱动程序设计 分类:ARM系统进阶班(arm裸机程序)2012-08-24 13:23 1561人阅读评论(0) 收藏举报 首先声明,此文章是基于对国嵌视频教程中tiny6410有关视频教程的总结,为方便大家的复习。再次予以感谢,感谢国嵌各位老师为我们提供如此好的视频教程,为对于想要迈入嵌入式大门却迟迟找不到合适方法的学子们指引一条光明的方向。好了,接下来步入正题,此处将介绍tiny6410 LED驱动程序的设计。

2 下面来看看tiny6410关于LED 的原理图如图(1)所示:

图1 LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c [cpp]view plaincopy 1./********************************************************** 2.*实验要求:用Tiny6410上的4个LED资源实现跑马灯程序。 3.*功能描述: Tiny6410用下面4个引脚连接了LED发光二极管,分别是 4.* GPK4--LED1 5.* GPK5--LED2 6.* GPK6--LED3 7.* GPK7--LED4 8.* 本程序将控制这四个管脚的输出电平,实现跑马灯的效果 9.*日期: 2011-3-10 10.*作者:国嵌 11.**********************************************************/ 12.#include "def.h" 13.#include "gpio.h" 14. 15.#define LED1_ON ~(1<<4) 16.#define LED2_ON ~(1<<5) 17.#define LED3_ON ~(1<<6) 18.#define LED4_ON ~(1<<7) 19. 20.#define LED1_OFF (1<<4)

嵌入式LED灯显示

【设计题目】 矩阵LED字符显示控制系统设计 【设计目的】 1.掌握无操作系统下的硬件软件设计原理和方法; 2.进一步熟悉ARM 处理器的基本结构、指令集、存储系统以及基本接口编程; 3.熟悉嵌入式系统各部件的硬件初始化过程以及基本IO控制方法。 4.掌握矩阵LED 的应用原理 【设计内容】 1.利用sys_init初始化程序,利用串口实现PC和开发板的数据通信; 2.编写S3C2410X 处理器的点阵屏驱动程序; 3.编写S3C2410X 处理器的点阵屏应用程序。 4. 当程序运行等待要求从串口输入学生姓名的字符串在矩阵LED上显示出来。【实验环境】 硬件:Embest EduKit-IV 平台,ULINK2 仿真器套件,PC 机; 软件:μVision IDE for ARM 集成开发环境,Windows XP。 【相关知识综述】 背景知识、原理算法等 一、硬件部分 1.点阵屏的结构电路

图1点阵屏的结构电路 图上QL1-QL16为行驱动信号,每个信号控制一行, LR1~LR16 是点阵屏的列驱动信号,每一个信号控制一列。当行信号为高电平而列信号为低电平,对应的LED 就会亮。 2,S3C2410与点阵屏的连接 LL1 LL8 LL7 LL9

图2 S3C2410ARM处理器与两片CD4094连接得到16位行选信号图以上电路可以通过S3C2410GPIO口把CPU的并行数据(16位两个字节的数据)打入到两个CD4094芯片中并锁存起来变成LL1-LL16的行选信号。 各信号的作用如下表1;

3.点阵屏的保护电路 图3 点阵屏的保护电路图 为了保护LED 屏加了对应的电阻实现行限流作用,即LL1-LL16变为RQ1-RQ16 4.LED 的驱动 加入行驱动电路的目的是实现LED 灯的驱动。这样由RQ1-RQ16变为行驱动信号QL1-QL16。Q11-QL16为图1中的行驱动信号。

LED显示屏控制系统方案

LED显示屏控制系统的分析与设计 摘要 本文根据LED图文显示屏系统的具体要求,通过查阅资料,分析并归纳出具体设计方案。即系统体系结构、系统整体工作流程、软件控制系统的设计以及串行通信设计。这个系统的工作流程是:通过软件控制系统提供的编辑工具完成图文编辑工作,对编辑的信息实现字模提取,然后可以根据系统提供的显示模式加载显示效果,确认为欲显示信息后保存文件,然后通过程序调用Windows函数,并采用RS-232C串口通信,实现数据到无线发射机的传输。 本文具体设计了三个模块:编辑功能模块,字模提取模块,效果添加及预览模块。系统是否需要更新以及现有设计是否能够满足要求都有待于进一步的研究。 关键词:LED 字模串行通信

目录 1 绪论 1.1 LED显示屏的研究背景及意义 (5) 1.2 软件开发工具C++概述 (6) 2 LED显示屏控制系统的系统分析 2.1 整体分析 (8) 2.2 计算机软件模块分析与设计 (8) 3 串行接口 3.1 串行通信的工作原理 (10) 3.2 RS-232C串行通信简介 (10) 3.3 RS-232C引脚及使用 (11) 3.4 MAX-232介绍 (12) 4 软件控制系统设计与实现 4.1编辑功能设计与实现 (14) 4.2字模提取 (16) 4.3效果添加与预览功能的设计与实现 (18) 4.4控制系统软件设计 (20) 5 总结 26 参考文献 (27)

致 (28) 1 绪论 1.1 LED显示屏的研究背景及意义 在当今现代信息化社会的高速发展过程中,大屏幕显示已经从公共信息展示等商业应用向消费类多媒体应用渗透。随着宽带网络的发展,数字化的多媒体容将在信息世界中占据主流,新型的大屏幕显示设备将代替传统电视机成为人们享受信息和多媒体容的中心。 与传统的显示设备相比,这种未来的巨大需求让大屏幕显示技术成为众人目光的焦点: (1) LED显示屏色彩丰富,显示方式变化多样(图形、文字、三维、二维动画、电视画 面等)、亮度高、寿命长,是信息传播设施划时代的产品。 (2) LED显示屏是集光电子技术、微电子技术、计算机技术、信息处理技术于一体的 高技术产品,可用来显示文字、计算机屏幕同步的图形。它以其超大画面、超强视觉、灵活多变的显示方式等独居一格的优势,是目前国际上使用广泛的显示系统。 (3) LED显示屏应用广泛,金融证券、银行利率、商业广告、文化娱乐等方面,有巨 大的社会效益和丰厚的经济效益。 在其历史的演变过程中,出现了多种信息传播媒体:但就其性能看:如阴级管(crt)或石英管(dv)大型电视,成本非常昂贵,在不需要超大画面且在室使用时效果尚可;彩色液晶显示同样成本昂贵、电路复杂,面积有限,受视频角的影响非常大,可视角度很小;影象投影设备亮度小、清晰度差(画面受光不均匀);电视墙表面有分割线,视觉上有异物感,室外应用时亮度效果差。而LED显示屏以其受空间限制较小,并可以根据用户要求设计屏的大小,具有全彩色效果,视角大,可以用于显示文字、图案、图象、动画、视频、录象信号等各种信息的特点得到了突飞猛进的发展。 LED显示屏的发展主要经历了三个阶段: 1、1990年以前LED显示屏的成长时期。一方面,受LED材料器件的限制,LED显示屏的应用领域没有广泛开展;另一方面,显示屏控制技术基本上是通讯控制方式,客观上影响了显示效果。这一时期的LED显示屏在国外应用较广,国很少,产品以红、绿双基色为主,控制方式为通讯控制,灰度等级为单点4级调灰,成本较高。 2、1990-1995年,这一段是LED显示屏迅速发展的时期。进入九十年代,全球信息产业高速增长,信息技术各个领域不断突破,LED显示屏在LED材料和控制技术方面也不断出现新的成果。蓝色LED晶片研制成功,全彩色LED显示屏进入市场;电子计算机及微电子领域的技术发展,在显示屏控制技术领域出现了视频控制技术,显示屏灰度等级实现16

12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

这个程序写得很好,自己也是看的别人写的很好的程序,但是它代码不够完整,注释不详细,经过自己的修改加以完善。另外我发现很多的测试代码都没有附上测试代码效果图,在本人的代码下面有自己拍的效果图,填补不足之处。 自己在找资料的过程中花掉很多的财富值,如果大家看得起该代码请评五分加以下载,在下感激不尽! /******************************************* 程序名称:12864液晶经典驱动程序(带中文字库) 功能:12864测试程序 修改作者:王程 修改时间:2014年2月5日23:22:32 ********************************************/ #include #define uchar unsigned char #define uint unsigned int // P0 为数据口 sbit LCD_RS=P2^0; //数据、命令选择端口 sbit LCD_RW=P2^1; //液晶读写控制 sbit LCD_EN=P2^2; //液晶使能控制 sbit PSB = P2^4; //模式选择1为并行0为串行 sbit RES = P2^5; //复位端口低电平复位,上电之前进行复位,为了稳定!unsigned char code DAT[] = "我爱我家"; //测试显示的汉字,下面的A为测试显示的英文 /******************************************* 函数名称:Delay_1ms (晶振为12M) 功能:延时约1ms的时间 参数:无 返回值:无 ********************************************/ void delay_1ms(uint x) { uinti,j; for(j = 0;j

LED显示屏控制系统介绍

LED显示屏控制系统介绍 LED显示屏控制系统引言 目前显示屏按数据的传输方式主要有两类:一类是采用与计算机显示同一内容的实时视频屏;另一类为通过USB、以太网等通信手段把显示内容发给显示屏的独立视频源显示屏,若采用无线通信方式,还可以随时更新显示内容,灵活性高。此外,用一套嵌入式系统取代计算机来提供视频源,既可以降低成本,又具有很高的可行性和灵活性,易于工程施工。因此,独立视频源LED显示系统的需求越来越大。 本系统采用ARM+FPGA的架构,充分利用了ARM的超强处理能力和丰富的接口,实现真正的网络远程操作,因此不仅可以作为一般的LED显示屏控制器,更可以将各显示节点组成大型的户外广告传媒网络。而FPGA是一种非常灵活的可编程逻辑器件,可以像软件一样编程来配置,从而可以实时地进行灵活而方便的更改和开发,提高了系统效率。 1 独立视频LED显示屏控制系统 LED显示屏的主要性能指标有场扫描频率、分辨率、灰度级和亮度等。分辨率指的是控制器能控制的LED管的数量,灰度级是对颜色的分辨率,而亮度高则要求每个灰度级的显示时间长。显然,这3个指标都会使得场扫描频率大幅度降低,因此需要在不同的场合对这些指标进行适当的 取舍。通常灰度级、亮度和场扫描频率由单个控制器决定,而分辨率可以通过控制器阵列的方式得到很大的提高。这样,每个控制器的灰度和亮度很好,场扫描频率也适当,再通过控制器阵列的形式,实现大的控制面积,即可实现颜色细腻的全彩色超大屏幕的LED显示控制器。 独立视频LED系统完全脱离计算机的控制,本身可以实现通信、视频播放、数据分发、扫描控制等功能。为了实现大屏幕、全彩色、高场频,本系统采用控制器阵列模式,如图1所示。 系统可以通过网络接口(以太网接口)由网络服务器端更新本地的数据,视频播放部分则通过对该数据进行解码,获得RGB格式的视频流。再通过数据分发单元,将这些数据分别发送到不同的LED显示控制器上,控制器将播放单元提供的数据显示到全彩色大屏幕LED上。 2 LED显示屏控制系统通信接口和视频播放单元 本系统的通信接口和视频播放部分由ARM+uClinux实现。ARM(Advanced RISC Machine)是英国ARM公司设计开发的通用32位RISC微处理器体系结构,设计目标是实现微型化、低功耗、高性能的微处理器。Linux作为一种稳定高效的开放源码式操作系统,在各个领域都得到了广泛的应用,而uClinux则是专门针对微控制领域而设计的Linux系统,具有可裁减、内核小、完善的网络接口协议和接口、优秀的文件系统以及丰富的开源资源等优点,正被越来越多的嵌入式系统采

基于STM32--LCD12864驱动程序

基于STM32--LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟

#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平

液晶显示器控制显示实验

实验二液晶显示器控制显示实验 一、实验目的 通过实验学习使用VC5416DSP的扩展端口控制外围设备的方法,了解液晶显示器的显示控制原理及编程方法。 二、实验设备 计算机、ICETEK-VC5416-EDU实验箱(或ICETEK仿真器+ICETEK-VC5416-A系统板+相关连接线及电源)。 三、实验原理 1、扩展IO接口: ICETEK-VC5416-A是一块以TMS320VC5416ADSP为核心的DSP扩展评估板,它通过扩展接口与实验箱的显示/控制模块连接,可以控制其各种外围设备。 2、液晶显示模块的访问、控制时由VC5416 DSP对扩展接口的操作完成。 控制口的寻址:命令控制接口CTRLCDCMDR的地址为0x8001,数据控制接口的地址为CTRLCDLCR:0x8003和CTRLCDRCR:0x8004,辅助控制接口CTRLCDCR的地址为0x8002。 3、显示控制方法: 液晶显示模块中有两片显示缓冲存储器,分别对应屏幕显示的像素,向其中写入数值将改变显示,写入“1”则显示这一点,写入“0”则不显示。其地址与像素的对应方式如下: ——发送控制命令:方法是通过向命令控制接口写入命令控制字,然后再向辅助控制接口写入0。下面给出的是基本命令字、解释和C语言控制语句举例: 显示开关:0x3f打开显示;0x3e关闭显示; CTRLCDCMDR=0x3f;CTRLCDLCR=0;//将液晶显示打开 CTRLCDCMDR=0x3e;CTRLCDLCR=0;//将液晶显示关闭 设置显示起始行:0x0c0+起始行取值,其中起始行取值为0至63;

CTRLCDCMDR=0x0c0;CTRLCDLCR=0;//设置从存储器第0行开始显示 CTRLCDCMDR=0x0c8;CTRLCDLCR=0;//设置从存储器第8行开始显示设置操作页:0x0b0+页号,其中页号取值为0至7; CTRLCDCMDR=0x0b0;CTRLCDLCR=0;//设置即将操作的存储器第0页 CTRLCDCMDR=0x0b2;CTRLCDLCR=0;//设置即将操作的存储器第2页设置操作列:0x40+列号,其中列号取值为0至63; CTRLCDCMDR=0x40;CTRLCDLCR=0;//设置即将操作的存储器第0列 CTRLCDCMDR=0x44;CTRLCDLCR=0;//设置即将操作的存储器第4列 ——写显示数据:在使用命令控制字选择操作位置(页数、列数)之后,可以将待显示的数据写入液晶显示模块的缓存。将数据发送到相应数据控制I/O接口即可。由于液晶模块相对于DSP来讲是慢速设备,在命令之间可能需要增加延时语句。C语言语句举例说明: CTRLCDLCR=0x80;CTRLCDLCR=0;//向左侧屏幕缓存存入0x80,若显示行、页号 //和列号均为0时,屏幕上第8行第1列将显示 //黑色像素 CTRLCDRCR=0x01;CTRLCDLCR=0;//向右侧屏幕缓存存入0x01,若显示行、页号 //和列号均为0时,屏幕上第1行第65列将显 //示黑色像素 4、液晶显示器与DSP的连接: 5、数据信号所传送 由于液晶显示模块相对运行在高主频下的DSP属于较 为慢速设备,连接时需要考虑数据线上信号的等待问题; 电平转换:由于DSP为3.3V设备,而液晶显示模块 属于5V设备,所以在连接控制线、数据线时需要加电平隔 离和转换设备,如ICETEK-CTR板上使用了74LS245。 6、实验程序流程图: 四、实验步骤 1、实验准备: ⑴连接实验设备: ①连接电源:打开实验箱,将电源线的一端插入实验 箱外部左侧箱壁上的电源插孔中。确认实验箱面板上电源 总开关(位于实验箱底板左上角)处于“关”的位置,连接电源线的另一端至220V交流供电插座

相关文档
相关文档 最新文档