当前位置:首页 > 单片机 > 单片机
[导读]开发目标平台:linux-2.6.28+S3C2440+CRAMFS/YAFFS2  开发环境:UBUNTU-9.04+arm-linux-gcc-3.4.1  这次需要在s3c2440上开发一个简单的字符型LCD驱动,具体情况如下:  LCD1602共有16根管脚,控制信号3根RS,RW

开发目标平台:linux-2.6.28+S3C2440+CRAMFS/YAFFS2

  开发环境:UBUNTU-9.04+arm-linux-gcc-3.4.1

  这次需要在s3c2440上开发一个简单的字符型LCD驱动,具体情况如下:

  LCD1602共有16根管脚,控制信号3根RS,RW,RE,数据线8根DB0~DB7,可以支持8位数据格式和4位数据格式。

  RS:寄存器选择1:数据;0:指令【由GPIO控制】

  R/W:读、写操作选择1:读;0:写【我的硬件里直接置低电平】

  RE:使能信号【由GPIO控制】

  数据线DB4~DB7,分别连接4根GPIO口,DB0~DB3置高。

  首先内核注册驱动函数:

  static int __init mylcd_init(void)

  {

  int i;

  int ret = 0;

  for(i = 0;i < MAX_NUM;i++){

  s3c2410_gpio_cfgpin(plcd[i].pin,plcd[i].pin_out);

  }

  //初始化GPIO为输出

  ret =register_chrdev(LCD_MAJOR,DEVICE_NAME,&mylcd_fops);

  if(ret < 0){

  printk(KERN_WARNING "Cannot register driver of mylcdn");

  return ret;

  }

  printk(DEVICE_NAME " Init Is Okn");

  return 0;

  }

  驱动注销函数

  static void __exit mylcd_exit(void)

  {

  unregister_chrdev(LCD_MAJOR,DEVICE_NAME);

  printk(KERN_INFO " remove driver of myLCDn");

  }

  module_init(mylcd_init);

  module_exit(mylcd_exit);

  MODULE_LICENSE("GPL");

  MODULE_AUTHOR("qlx-1983@163.com");

  MODULE_DESCRIPTION("mylcd driver for s3c2440");

  驱动文件操作结构体,我对外提供IOCTL接口:

  static struct file_operations mylcd_fops = {

  .owner = THIS_MODULE,

  .ioctl = mylcd_ioctl,

  .open = mylcd_open,

  .release = mylcd_release

  };

  驱动的open和release函数的实现:

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

  {

  return 0;

  }

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

  {

  return 0;

  }

ioctl函数的实现:

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

  {

  if(_IOC_TYPE(cmd) != GPIO_IOF_MAGIC)

  {

  return -ENOTTY;

  }

  if(_IOC_NR(cmd) >= GPIO_MAXNR)

  {

  return -ENOTTY;

  }

  switch(cmd)

  {

  case LCD_INIT: //初始化

  myLcd_port_init();

  break;

  case LCD_SCREEN_CLEAR: //清屏

  myLcd_Screen_Clear();

  break;

  case LCD_CURSOR_RETURN: //归位

  myLcd_Cursor_Home();

  break;

  case LCD_DDRAM_AD_SET: //设置DDRAM地址

  myLcd_ddram_ad_set(arg);

  break;

  case LCD_DATA_WRITE: //写数据

  myLcd_data_write(arg);

  break;

  default:

  break;

  }

  return 0;

  }

  因为我对LCD的功能要求比较简单,所以,只是提供了上面这些功能,当然,LCD1602还有很多接口可以对外提供,如果你感兴趣,可以补充一下!

  另外,附上针对这个LCD我写的上层接口函数:

  int OpenLcd(const char *lcd_name)

  {

  int Lcd_fd;

  if(access(lcd_name,F_OK) == 0){

  printf("%s Can Be opened!n",lcd_name);

  }else{

  system("mknod /dev/myLcd c 204 0");

  }

  Lcd_fd = open(lcd_name,O_RDWR);

  if(Lcd_fd < 0){

  printf("Open %s Is Failed!n");

  return 0;

  }

  printf("Open The Screen!n");

  return Lcd_fd;

  }

 void CloseLcd(int Lcd_fd)

  {

  printf("Close The Screen!n");

  close(Lcd_fd);

  }

  void InitLcd(int Lcd_fd)

  {

  printf("Init The Screen!n");

  ioctl(Lcd_fd,LCD_INIT,0);

  }

  void ClearLcd(int Lcd_fd)

  {

  printf("Clear The Screen!n");

  ioctl(Lcd_fd,LCD_SCREEN_CLEAR,0);

  ioctl(Lcd_fd,LCD_CURSOR_RETURN,0);

  }

  void PrintfLcd(int Lcd_fd,const char *src,unsigned int pos)

  {

  int src_len = 0;

  int i;

  src_len = strlen(src);

  if((pos >= 0)&&(pos <= 32)){

  if(src_len <= (32-pos)){

  ioctl(Lcd_fd,LCD_DDRAM_AD_SET,pos);

  for(i = 0;i < src_len ;i++){

  ioctl(Lcd_fd,LCD_DATA_WRITE,src[i]);

  }

  }else{

  printf("The Lcd Is Not Enough Lengthn");

  }

  }else{

  printf("The Pos Is Out Size Of Addressn");

  }

  }

  以下是测试应用程序:

  int main(int argc, char *argv[])

  {

  int Lcd_fd;

  Lcd_fd = OpenLcd(DEV_NAME);

  InitLcd(Lcd_fd);

  PrintfLcd(Lcd_fd,"AAAABBB",0);

  PrintfLcd(Lcd_fd,"FFFFFFFFFFF",16);

  sleep(10);

  ClearLcd(Lcd_fd);

  PrintfLcd(Lcd_fd,"AAAABBB",0);

  PrintfLcd(Lcd_fd,"DDDDDDDD",16);

  CloseLcd(Lcd_fd);

  }


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭