AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①

发布者:rocky96最新更新时间:2017-11-21 来源: eefocus关键字:AVR单片机  ATMEGA16  驱动12864 手机看文章 扫描二维码
随时随地手机看文章

十一、ATMEGA16驱动12864液晶(驱动器为HD61202)

十一—(01)、今天只是个简单的动态的驱动~~(以后还会更新的~~移位什么的~~毕竟这些显示屏还是挺重要的~~而且更重要的是赶紧买板子~~AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①

先上图片~~

AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①
这个是用ATMEGA16仿真的(我真的很疼~~对比一下下面51仿真的,数据被压缩,完全不能理解~~数据完全一样~~)
AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①

AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①

然后是程序:

IAR11_1.c

//------------------------------------------------------------------------------
//main
#include"ioavr.h"
#include"intrinsics.h"
#include"Lcd12864Init.h"
#include"MacroAndConst.h"
#include"ZiMo.h"
#include"Lcd12864Display.h"
//------------------------------------------------------------------------------
//端口初始化函数
void port_init()
{
  DDRC=0XFF;
  PORTC=0XFF;
 
  DDRD=0XFF;
  PORTD=0XFF;
}
//------------------------------------------------------------------------------
//main
void main()
{
        port_init();
 lcd_init();
 lcd_set_row(0);    //这里怎么不设置行也可以~~难道是默认的~~ 
 lcd_display_static(qianming);
 while(1);
}

LCD12864Init.c

//------------------------------------------------------------------------------
//LCD12864初始化函数—可调用—ATMEGA16单片机
//这里面的lcd_check_busy竟然还不能用~~
#include"ioavr.h"
#include"intrinsics.h"
#include"MacroAndConst.h"
#include"delayics.h"
#include"bitics.h"
//------------------------------------------------------------------------------
//RS、RW、EN、CS1、CS2引脚输出高低电平的宏定义
#define lcd_rs_1  SET_BIT(PORTD,2)          //数据命令选择端
#define lcd_rs_0  CLR_BIT(PORTD,2)
#define lcd_rw_1  SET_BIT(PORTD,1)          //读写命令选择端         
#define lcd_rw_0  CLR_BIT(PORTD,1)
#define lcd_en_1  SET_BIT(PORTD,0)          //使能信号
#define lcd_en_0  CLR_BIT(PORTD,0)
#define lcd_cs1_1 SET_BIT(PORTD,4)          //左半屏CS1
#define lcd_cs1_0 CLR_BIT(PORTD,4)
#define lcd_cs2_1 SET_BIT(PORTD,3)          //右半屏CS2
#define lcd_cs2_0 CLR_BIT(PORTD,3)
//------------------------------------------------------------------------------
#define data_port PORTC         //数据传输端口宏定义
#define busy  0x80
//------------------------------------------------------------------------------
//读“忙”函数;读取数据线的最高位DB7为1则为Busy
void lcd_check_busy()
{
  uchar temp;
  lcd_rs_0;
  lcd_rw_1;                                 //读指令
  data_port=0x00;
  lcd_en_1;
  while(1)
  {
    lcd_en_1;                              //使能
    DDRC=0x00;
    temp=PINC;
    if(temp<0x80)                          //如果数据口读入的数据小于0x80,说明最高位为0,LCD空闲,执行break跳出循环
      break;
    delay_us(1);
    lcd_en_0;                              //禁能
  }
  DDRC=0xff;        //在E的下降沿数据被锁存(写)入它们的控制驱动器
  lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD写指令函数
void lcd_write_command(uchar com)
{    
//  lcd_check_busy();
  lcd_rs_0;
  lcd_rw_0;
  data_port=com;
  lcd_en_1;
  delay_us(1);
  delay_us(1);
  lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD写数据函数
void lcd_write_data(uchar dat)
{
//  lcd_check_busy();
  lcd_rs_1;
  lcd_rw_0;
  data_port=dat;
  lcd_en_1;
  delay_us(1);
  delay_us(1);
  lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD设置页函数。DB7~DB3为器件固定的位!为10111;然后DB2~DB0是设置8页的(一共就8页~~)
//起始页为0xB8,显示的RAM共64行,分为8页,每页8行~~
void lcd_set_page(uchar page)
{
 page=0xb8|page;    //用页的首地址或上你要显示的页数,就是当前显示的页
 lcd_write_command(page);      
}
//------------------------------------------------------------------------------
//LCD设置行函数
//DB6和DB7为器件固定位(感觉应该是为了和以后的器件兼容才这么设定的吧~~),都是1;其中DB5~DB0是用户设定的行,总共64行
//起始行的首地址为0xC0
void lcd_set_row(uchar row)
{
 row=0xc0|row;
 lcd_write_command(row);   //用来写入指令,从哪一行开始~~
}
//------------------------------------------------------------------------------
//LCD设置列函数
//DB6和DB7为器件的固定位!是1、0。DB5~DB0是用户设定的列,总共64列,但是要注意:CS1和CS2选中左右两个屏幕,每个64列,两个就是128列了
//起始列为0x40
void lcd_set_column(uchar column)
{
 column=0x40|column;
 lcd_write_command(column);  //写入列的首地址的指令~~
}
//------------------------------------------------------------------------------
//显示开关函数。0x3e为关显示;0x3f为开显示
void lcd_set_switch(uchar on_off)
{
 on_off=0x3e|on_off;   //其中只能为0或者1
 lcd_write_command(on_off);
}
//------------------------------------------------------------------------------
//LCD选择屏幕的函数
//CS1和CS2都是低电平有效,CS1选择左半屏;CS2选择右半屏
void lcd_select_screen(uchar screen)
{
 switch(screen)
 {
  case 0: lcd_cs1_0; lcd_cs2_0; break;   //选中全屏
  case 1: lcd_cs1_0; lcd_cs2_1; break;  //选中左半屏
  case 2: lcd_cs1_1; lcd_cs2_0; break;         //选中右半屏
  default: break;
 }
}
//------------------------------------------------------------------------------
//LCD清屏函数
void lcd_clear_screen(uchar screen)
{
 uchar i,j;
 lcd_select_screen(screen);     //清楚选中的屏幕
 for(i=0;i<8;i++)       //一共有8页,所以循环8次
 {
  lcd_set_page(i);    //设置页,这里从第0页,第0行开始
  lcd_set_column(0);    //设置列,从第0列开始
  for(j=0;j<64;j++)    //控制列数0~63
  {
   lcd_write_data(0x00);     //都清除为0,同时地址指针加1
  }
 }
}
//------------------------------------------------------------------------------
//LCD初始化函数
void lcd_init()
{
// lcd_check_busy();
 lcd_select_screen(0);      //选中全屏
 lcd_set_switch(0);     //关显示
 lcd_select_screen(0);
 lcd_set_switch(1);
 lcd_select_screen(0);
 lcd_clear_screen(0);
}

LCD12864Display.c

//------------------------------------------------------------------------------
//LCD12864显示函数—可以调用
//改变LCD显示函数的显示方法可以实现屏幕的左移~~上移~~等等~~
#include"ioavr.h"
#include"Lcd12864Init.h"
#include"MacroAndConst.h"
//------------------------------------------------------------------------------
//LCD静态显示函数 
void lcd_display_static(uchar __flash *p)
{
 uchar i,j;
 uchar page;
 for(page=0;page<8;page++)     //8页
 {
  lcd_select_screen(1);     //选中左半屏
  lcd_set_page(page);    //设置页
//  lcd_set_row(0);     //在这里设置行也可以~~晕了~~datasheet上写着是0~63行,难道可以理解为每页的第一行
        //这个有待考虑
  lcd_set_column(0);    //设置列,共64列,从左半屏的第一列开始
  for(i=0;i<64;i++)
  {
   lcd_write_data(p[page*128+i]);  //显示数据,同时列的指针加1
  }
  lcd_select_screen(2);     //选中右半屏
  lcd_set_page(page);     //设置页
  lcd_set_column(0);    //设置列,从右半屏的第一列开始
  for(j=0;j<64;j++)
  {
   lcd_write_data(p[page*128+i+j]);        //显示数据,同时列的指针加1
  }
 }  
}              


关键字:AVR单片机  ATMEGA16  驱动12864 引用地址:AVR单片机(学习ing)—(十一)、ATMEGA16驱动12864—01—①

上一篇:AVR单片机(学习ing)—(一)、ATMEGA16的I\0端口的使用—01
下一篇:AVR单片机(学习ing)—(十)、ATMEGA16的同步串行接口SPI—03

推荐阅读最新更新时间:2024-03-16 15:46

AVR单片机IO仿真I2C
#include iom88v.h #define EEP_PORT PORTC //定义是使用PROTC口 #define EEP_DDR DDRC //定义是使用PROTC口 #define SDA 0X10 //定义sda连接的是portd1 #define SCL 0X20 //定义scl连接的是portd0 //#define WP 0X04 //定义wp连接的是portd2 #define EEP_ADD_R 0xa1 //写I2C从器件地址和读方式 a0,a1接地 #define EEP_ADD_W 0xa0 //写I2C从器件地址和写方式 a0,a1接地 void delay(u
[单片机]
AVR单片机和LCD液晶模块对信息监控终端的设计
目前,随着信息产业的迅猛发展,各类船舶亟需配备更多质优价廉的中小型信息监控终端,用于监控气象状况、获取导航信息以便保证航行安全。以ARM、MIPS等领衔的32位处理器在信息监控终端应用中,显示出极大优势,但是一般以32位处理器构建的嵌入式系统往往需要配置外部FLASH和SDRAM,这样就使得开发和维护整个系统的成本较高,本设计采用高性能低功耗的AVR单片机和LCD液晶模块来设计信息监控终端,具有价格低廉、性能稳定、显示清晰、人机界面良好等优点,能够满足船舶对中小型信息监控终端的需求。 1 总体设计 信息监控终端主要由显示控制板、键盘、通信接口和液晶显示模块构成,具有数据收发、数据显示、人机交互和屏幕亮度调整等功能,其组成如图1
[单片机]
<font color='red'>AVR单片机</font>和LCD液晶模块对信息监控终端的设计
51单片机三线串行驱动12864液晶
以前写12864的液晶程序都是用的并行的方式,这种方式焊接起来很麻烦,而且占用的IO口比较多。 今天尝试使用串行方式来驱动该模块。 本程序是基于STC89C52的12864串行模式的程序,硬件电路连接只需要5根线,VCC GND RS RW E , 只需要三个个IO 口就可以显示,大大节省了资源。 12864液晶芯片是st7920。自带中文字库。 该程序功能:实现使用12864液晶显示字符、汉字(程序有详细的中文注释)。 已经调试通过,很好用。 下面是电路原理图 其时序图如下: 根据其时序图写出其代码如下: #include reg52.h #include stdlib.h #include intrins.h
[单片机]
51单片机三线串行<font color='red'>驱动</font><font color='red'>12864</font>液晶
AVR单片机综合流水灯C程序
自己焊了块实验板,就是研究了一下AVR单片机,因为前面一年时间里一直苦战51单片机,有了一定的基础,所以看了一下视频,原来 AVR单片机主要有三个寄存器设置IO口,DDR(X)、PORT(X) BIT(X)等寄存器,至于其它的编程思想,我认为和51那些差不多,看来前辈说得对啊, 学会了一种单片机,学其它的很容易入手 ,今天总算得到了验证,于是写出了下面的流水灯程序! #include iom16v.h //AVR单片机头文件包含 #define uchar unsigned char//宏定义 #define uint unsigned int// /*****************************************
[单片机]
AVR单片机(学习ing)—(KZ)、电源管理及睡眠模式—01
电源管理及睡眠模式 睡眠模式可以使应用程序关闭MCU 中没有使用的模块,从而降低功耗。AVR 具有不同 的睡眠模式,允许用户根据自己的应用要求实施剪裁。 进入睡眠模式的条件是置位寄存器MCUCR 的SE,然后执行SLEEP 指令。具体哪一种 模式( 空闲模式、ADC 噪声抑制模式、掉电模式、省电模式、Standby 模式和扩展Standby 模式) 由MCUCR 的SM2、SM1 和SM0 决定,如Table 13 所示。使能的中断可以将进 入睡眠模式的MCU 唤醒。经过启动时间,外加4 个时钟周期后, MCU 就可以运行中断 例程了。然后返回到SLEEP 的下一条指令。唤醒时不会改变寄存器文件和SRAM 的内 容。如果在睡眠过程
[单片机]
<font color='red'>AVR单片机</font>(学习ing)—(KZ)、电源管理及睡眠模式—01
AVR汇编初探之一《AVR单片机的CPU内部结构》
学单片机那么久了,感觉想要深入,还得看汇编语言,至少得了解单片机内部结构。 下面就以ATmega16为例,介绍一下AVR单片机结构和汇编语言。 AVR单片机的CPU内核结构 如上两图,左图是虚线框内AVR CPU的内核结构,右图是AVR单片机内核结构的方框图,可以看出AVR单片机的数据总线(CPU字长)是8位的,也就说它是8位单片机。 AVR采用了Harvard结构,具有独立的数据和程序总线,CPU在执行一条指令的同时,就将PC中指定的下一条指令取出,构成了一级流水线运行方式,实现了一个时钟周期执行一条指令,数据吞吐量高达1MIPS/MHz。 AVR CPU内核由几个重要的部分组成,它们分别是: A.算数逻辑单元ALU(Ari
[单片机]
AVR汇编初探之一《<font color='red'>AVR单片机</font>的CPU内部结构》
AVR单片机外部中断INT0示例
*AVR单片机外部中断INT0示例程序晶振为1 MHz INT0最好接一个4.7K的上拉电阻,按键对地有效 没有使用延时/通信语句,所以使用内部/外部时钟都可以 每按动INT0按键一次,PD3的电平就翻转一次 本例子没有考虑太多的按键防抖动功能*/ #include mega48.h interrupt void INT0_isr(void) //INT0的中断向量是2,请参考M48数据手册的48页 { PORTD.3=~PORTD.3; //电平取反 EIFR|=1; //清除INT0中断触发标记,防止按键抖动 } void main(voi
[单片机]
嵌入式电网分析仪中双CPU间的通信
   1 引言   在我国目前电力紧缺的形势下,监控电力以确保安全用电非常重要。对电网分析仪的研究和改造一直是当前研究的热点。如果电网分析仪采用一个DSP,既采样计算电网参数,又负责控制部分的运转,由于在实际应用中要求DSP处理的信息可能很多,工作量很大,这样将会影响分析仪的处理速度,降低其工作效率。因此,这里提出一种新一代的电网分析仪,采用DSP和AVR单片机构成双CPU处理器平台,并充分利用DSP处理大容量数据和复杂算法的能力.以及单片机接口的控制能力。ATmegal28单片机负责外围电路控制,包括开关量输出报警与控制、监测输入开关量、模拟量的输出、与上位机的通信以及计时和存储参数,参数是由TMS320F2812 DSP采样
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved