AVR单片机ATMEGA161602液晶驱动程序及心得.docxVIP

  • 4
  • 0
  • 约3.1千字
  • 约 12页
  • 2023-08-05 发布于上海
  • 举报

AVR单片机ATMEGA161602液晶驱动程序及心得.docx

AVR 单片机 ATMEGA16 1602 液晶驱动程序 及心得 首先,祝福各位同仁,光棍节快乐! 今天,给我最好的节日礼物就是,我自己研发的 AVR 微控制器芯片开发板,1602 液晶屏实验成功!我很欣慰. 写了一整天的程序,反复实验,最终在凌晨 0 点.终于成功了. 在此过程中,最大的问题莫过于那个所谓配套的 1602 液晶屏数据手册!这个手册简直是误人子弟,里面资料写的很含糊.并且有错误,而导致我反复试验失败,最终, 我使用了通用的 1602 液晶屏数据手册,才得以成功. 我自制的 AVR 开发板尺寸和我买的 51 开发板差不多大小,ATmega16 最小系统,8 位数码管,蓝光流水灯,isp 编程接口.过载保护保险丝,两个 74hc573 锁存器.1602 液晶屏都已焊接完成,万用板是 12X18cm 的单孔玻纤板(质量不太好,便宜没好货).现在我才发现不够用,模块数量相同的两块实验板,手工焊接的一定要比机器印刷的大 2~3 倍才行..... 没办法,我只能用 5X7cm 的万用板做小模块,ADC 模块,DS1302 时钟模块,激光二极管模块等等,然后用杜邦线把它们和 AVR 核心板链接起来,目前计划是这样的,往往计划很丰满,实际很骨感,伤脑筋啊,,, 此次,首次接触了 12864 大液晶,能显示中文,和超声波测距传感器,这得好好研究一下,我一直想要了解一下2.4g 无线传输模块,和陀螺仪传感器,还有GPS 模块,不过那些还早,把 AVRATMEGA16 学的差不多了,再了解,也不迟. /* Program name: AVR ATMEGA16 1602 驱动程序 初次实验通过时间: 2013-11-11 00:04:01 ^_^ ; 注意:在bysy()函数中严重出错!下次注意! while((PINA0x80)==0x80); 此语句检测到 PA7 为零时终止循环;表明空 闲状态 心得: AVR 单片机的 IO 口位操作比较复杂, 由三个寄存器控制 IO 口的输出与输入; DDRn(输出/输入控制) 寄存器; PORTn(输出时控制数据,输入时控制内部上拉电阻)寄存 器; PINn(用于读取 IO 口数据)寄存器; 最终校验通过时间: 2013 年 11 月 12 日 15:12:28 */ #include ; #include ; #define uint8 unsigned char #define uint16 unsigned int //========IO 口位操作 ======================================== void rs(uint8 h) //数据/指令选择操作; { if(h) PORTB|=13; //置一; else PORTB=~(13); //清零; } void rw(uint8 h) //读/写选择操作; { if(h==0) { PORTB=~(14); //清零; } else { DDRA=0X00; PORTA=0XFF; PORTB|=14; //置一; } } void e(uint8 h) //传输使能位; { if(h) { PORTB|=15; //置一; } else PORTB=~(15);//清零; } //=============================================== ========= void ddra(uint8 h) //PA 口输入输出函数; { if(h) { DDRA=0XFF; //输出模式; PORTA=0xff; } else {DDRA=0X00; PORTA=0XFF; } //输入模式并且有上拉; } void busy() //繁忙检测; { ddra(0); //设置PA 口为输入,有上拉; do { e(0); //传输使能为 0; rs(0); //指令; rw(1); //读; e(1); //e 为高电平; }while((PINA0x80)==0x80);//如果读到数据表示空闲状态,跳出循环; e(0); ddra(1); //PA 口输出状态; } void delay() //小延时; { uint8 j=0; j=1; } void w_cmd(uint8 cmd) { busy(); //繁忙检测通过时,PA 口为输出状态,默认输出 0xff; PORTA=cmd; //向PA 口装载数据; rs(0); //指令; rw(0); //写入; e(1); //传输使能脉冲高; delay(); //延时; e(0); //传输使能脉冲低; } void w_dat(uint8 dat) { busy(); //繁忙检测通

文档评论(0)

1亿VIP精品文档

相关文档