当前位置:首页 > 单片机 > 单片机
[导读]开发目标平台: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);

  }


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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭