串行1602的四位数据线程序-avr单片机

发布者:huanguu最新更新时间:2015-06-26 来源: 51hei关键字:串行1602  数据线  avr单片机 手机看文章 扫描二维码
随时随地手机看文章
1602的四位数据线程序,节省了IO。单片机用的是Atmega16,编译环境ICC6.31A,1602驱动头文件。


1602Driver.h
/*********************LCD模块1602底层驱动库***********************
*  LCD模块与单片机的硬件连接:
*           /端口名称 /端口符号 /MCU端口 / LCD引脚号/
*
*          RS数据/指令选择线
*            RS    PD3  4
*          R/W读写选择线   
*            R/W   GND  5
*          EN写使能线
*            EN    PD2    6
*          三态双向数据总线   
*           D0-D3    NC  7-10
*           D4          PD4  11
*           D5          PD5  12
*           D6          PD6  13            
*           D7          PD7       14
*                          
*  其他端口连接:
*    电源负     VSS             1
*    电源正+4.5--+5.5V   VDD         2
*    对比度调节    VL    GND  3
*    背光负     BLK   NC  15     
*    背光正              BLA   NC  16
*  说明:采用节省端口的4线线连接方式,即将8位的数据分两次传输;同
*        时将R/W接地RW(只用W不需要R,所以可以省一根线)
*  日期:2006/02/03


*****************************************************************/

 

/*****************定义MCU与LCD的接口******************/
#define LCD_EN_PORT      PORTC         //写使能。高有效,下降沿时锁定数据
#define LCD_RS_PORT      PORTC         //指令/数据选择
#define LCD_DATA_PORT    PORTC                        //数据总线

 

#define LCD_EN           0x04                          //PORTD2         out
#define LCD_RS           0x08                          //PORTD3   out
#define LCD_DATA         0xf0                       //PORTD4/5/6/7   out


#define Data_Write       LCD_RS_PORT |=  LCD_RS      //写数据模式
#define Command_Write    LCD_RS_PORT &= ~LCD_RS     //写指令模式


#define Write_En         LCD_EN_PORT |=  LCD_EN     //写使能
#define Write_Lock      LCD_EN_PORT &= ~LCD_EN     //锁定数据


//#define Graph_Right_Run  LCD_Write_Char(0x02,0)     //画面右移


 


const char CHR[16] = {'0','1','2','3','4','5','6','7','8'
                     ,'9','a','b','c','d','e','f'};
unsigned char LCD_Buff[] = {0,0,0,0,0,0,0,0};    


/*******************N us延时函数**********************/
void Delay_nus(unsigned int j)                        
{
   unsigned int i="0";
   for(i=j;i>0;i--)
   {
      asm("nop");
   }   
}


/********************N ms延时函数*********************/
void Delay_nms(unsigned int n)                         
{
   unsigned int m = 0;
   unsigned int k = 0;
   for (m=n;m>0;m--)
   {
      for (k=1140;k>0;k--)
   {  
      Delay_nus(1);
      }   
   }   
}

 

/******读写使能(高电平有效,下降沿锁定数据 )********/
void Write_Enable(void)
{
   Write_En;
   Delay_nus(1);
   Write_Lock;
}

 

/*---------------------------------------------------------------------
* LCD_Write_Char      :英文单字符显示函数

* 向LCD发送数据/指令。  Command="1"    发送显示数据
*       Command=0    发送指令数据
*
* 输入参数     :Command         数据/指令寄存器选择
*      Data   显示内容   
*                         
-----------------------------------------------------------------------*/
void LCD_Write_Char(char Command,char Data)            
{
   unsigned Command_Temp,Data_Temp;
   Command_Temp = Command;
   Data_Temp    = Data;
   Delay_nms(1);                     //延时1ms,以避开"写繁忙"时期
 
 
   if (Command == 0)        //数据输入模式
   {
      Data_Write;
   LCD_DATA_PORT &= 0x0f;                   //数据口清零
   LCD_DATA_PORT |= Data_Temp&0xf0;       //先送高4位
   }   
   else                //指令输入模式
   {
      Command_Write;
   LCD_DATA_PORT &= 0x0f;
   LCD_DATA_PORT |= Command_Temp&0xf0;
   }
   Write_Enable();

[page]
 Command_Temp=Command_Temp << 4;               
    Data_Temp=Data_Temp       << 4;
  
    LCD_DATA_PORT &= 0X0F;                   //数据口清零 
    if (Command==0)                //再送低4位
 {
       LCD_DATA_PORT |= Data_Temp&0xf0;
 }
    else
    {
    LCD_DATA_PORT |= Command_Temp&0xf0;
 }  
    
 Write_Enable(); 
}


/***********LCD模块初始化**************/
void LCD_Init(void)                                   
{
 Delay_nms(5);
 
 LCD_Write_Char(0x28,0);          //4位数据线格式
 Delay_nus(10);
 LCD_Write_Char(0x0d,0);              //显示开,光标闪烁
 Delay_nus(10);
 LCD_Write_Char(0x01,0);          //清屏
 Delay_nms(1);
 LCD_Write_Char(0x06,0);          //光标模式设置
}

 

/*-----------------------------------------------------------------------
* Locate              : 设置LCD显示的起始位置
*
* 输入参数:x、y      : 显示字符串的位置,X:0-1,Y:0-15
*                      LCD第一行显示寄存器地址:0X80-0X8F
*                      LCD第一行显示寄存器地址:0XC0-0XCF  
-----------------------------------------------------------------------*/
void Locate( unsigned char x, unsigned char y )
{
    unsigned char  Address;
 if (x == 0) 
     Address = 0x80 + y;                   //第一行显示的地址
    else 
     Address = 0xc0 + y;           //第二行显示的地址
    LCD_Write_Char(Address,0);
}


/*-----------------------------------------------------------------------
* LCD_Write_String    : 英文字符串显示函数
*
* 输入参数:*s        :英文字符串指针
*          X、Y       :显示字符串的位置
-----------------------------------------------------------------------*/
void LCD_Write_String(unsigned char X,unsigned char Y,unsigned char *String)
  {
 Locate( X, Y);                        //先送显示起始坐标
    
    while (*String)                 //再依次送显示字符
      {
        LCD_Write_Char( 0, *String );
     String ++;
      }
   
  }


/*-----------------------------------------------------------------------
* DEC_Num_Disp        :10进制数值显示函数
*
* 输入参数            :X     字符起始显示行坐标2
*         Y     字符起始显示列坐标
*      Num   需要显示的数值(最长8位)
*              Bit   有效显示的位数
* 输出                :
-----------------------------------------------------------------------*/
void DEC_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
   unsigned char i   = 0;
   Locate( X, Y );
   for (i=0 ; i    {
   LCD_Buff[i] = CHR[Num%10];
   Num = Num/10;
   }
   for (i=0 ; i    {
      LCD_Write_Char(0,LCD_Buff[Bit-i-1]);   //先写高位再写低位
   }  
}


/*-----------------------------------------------------------------------
* HEX_Num_Disp        :16进制数值显示函数
*
* 输入参数            :X     字符起始显示行坐标
*         Y     字符起始显示列坐标
*      Num   需要显示的数值(最长8位)
*              Bit   有效显示的位数
* 输出                :
-----------------------------------------------------------------------*/
void HEX_Num_Disp(unsigned char X,unsigned char Y,unsigned long Num,char Bit)
{
   char a = 0;
   Locate( X, Y );
   for(a=8-Bit ; a<8 ; a++)
   {
      LCD_Write_Char(0,CHR[(Num<< (a << 2)) >>28]);    
   }
}


1602测试程序LCD.c


/*********************************************
* "1602Driver.h"库测试程序
*********************************************/


#include  
#include "1602Driver.h"

 

void Port_Init(void)
{
   DDRD  = 0xff;
   DDRC  = 0xff;
}
void main (void)
{
   int counter;
   OSCCAL="0XA5";
   Port_Init();
   LCD_Init();
   LCD_Write_Char(0x01,0);               //清屏
   
   HEX_Num_Disp(0,0,13,1);
   DEC_Num_Disp(0,1,4,1);
   //LCD_Write_String(2,0,"T");
   LCD_Write_String(1,0,"Disp");


   while(1);
}

关键字:串行1602  数据线  avr单片机 引用地址:串行1602的四位数据线程序-avr单片机

上一篇:avr单片机串行四线驱动1602液晶
下一篇:研究arduino支持Atmega8作为主控制芯片

推荐阅读最新更新时间:2024-03-16 14:05

AVR单片机教程——串口发送
到目前为止,我们的开发板只能处理很小量的数据:读取几个引脚电平,输出几个LED,顶多用数码管显示一个两位数字。至于输入一个指令、输出一条调试信息,甚至用scanf和printf来输入输出,在已经接触过的这些器件上是难以想象的。而本讲“串口发送”与下一讲“串口接收”,将打开这一扇大门。 硬件 本讲的主题是UART(Universal Asynchronous Receiver-Transmitter,通用异步收发器),俗称串口。实际上串口是串行接口的统称,在单片机领域通常指UART。“串行”的意思是每次传输一个bit,而一个字节的数据被拆成8个bit传输;相比之下并行总线可以一次传输一个或多个字节(这并不意味着并行总线一定优于串行总
[单片机]
<font color='red'>AVR单片机</font>教程——串口发送
AVR单片机外部中断0、1、2 详解
中断基本包含: 1.中断源 2.中断向量(中断入口地址) 3.中断优先级 4.中断函数 除此之外,在单片机中,中断的执行或者中断的触发必须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位 单片机内部中断的触发必须完成,全局中断使能,中断源使能,中断源标志位置一等条件。除此之外,如果是外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。最后呢,就是需要在程序里建立处理中断的中断函数。 在编程的时候的步骤大致如下:(无视INT2) 1. 初始化PD2,PD3 为输入状态。DDRD|=BIT(2)|BIT(3); 2. 设置INT0,1 引脚触发的规则,实验中为低电平
[单片机]
有源晶振恢复法解决AVR单片机熔丝位锁死问题
在很多AVR单片机的初学者在使用AVR单片机中,很容易把熔丝位弄错而造成单片机锁死,比如说JTAGEN置为1后,单片机的JTAG就不能再下载程序进去了,因此给我们带来很多麻烦。 常见的恢复方法是使用并口编程器来恢复,对于初学者来说,很多设备是很欠缺的,所以很难解决。 现为我们初学者介绍一个简单实用可行的方法——有源晶振恢复法。将被锁死的AVR单片机接入最小系统或者开发板中,将系统中的晶振拆下来,在XAIL1接上有源晶振的第三脚(按下图接即可)。 然后通电,使用ISP下载线进行熔丝位编辑,本人使用智峰progisp(Ver 1.6.7)软件,打开软件选择好芯片型号,使用默认的熔丝位设置即可 然后点击自动即可下载。
[单片机]
有源晶振恢复法解决<font color='red'>AVR单片机</font>熔丝位锁死问题
AVR单片机4位数码管计数C程序
AVR单片机4位数码管计数,从0000-5000一直循环。位选端接在PC的低4位,而段选端接在PA口。程序如下: #include iom16v.h //头文件 #include macros.h //头文件 #define uchar unsigned char//宏定义 #define uint unsigned int//宏定义 uchar i;//定义变量 uint num;//定义计数变量 #pragma data:code//数组存放位置 const table ={ 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86
[单片机]
avr单片机 TC1的16位PWM输出程序
********************************************/ * 工作频率:内部8M * * 编 译 器:ICCAVR 6.31A * * 输 出:PD4输出PWMB,PD5输出PWMA * * 产生的PWM频率为8M/65536约122Hz * ********************************************/ #include iom16v.h #include macros.h //延时函数:入口time 需延时的MS数 void delay_ms(unsigned int time) { unsi
[单片机]
AVR单片机SPI的应用(AT25256)
/************************************** 硬件:单片机mega162,EEPROM 25256,晶振3.6864MHZ 编译环境:ICC ****************************************/ #include iom162v.h #define BAUD 9600 //波特率4800 #define CRYSTAL 3686400 //晶振3M #define BAUD_set (unsigned int)( (unsigned long)CRYSTAL/ (16*(unsigned long)BAUD)-1 ) //波特率计算 #define BAUD
[单片机]
<font color='red'>AVR单片机</font>SPI的应用(AT25256)
史上最变态数据线:防弹材质 能拉2吨汽车
苹果官方的Lightning数据线之脆弱让不少用户深受其苦,第三选择又不多,还都贵。那么,有没有一条Lightning数据线能与君长相伴呢?下面就随手机便携小编一起来了解一下相关内容吧。 美国Nonda就打造了一条变态级的数据线“ZUS Kevlar Cable”,拥有非凡的抗压能力: 承受45斤重量而不变形 汪星人随便咬 喵星人随便玩 被椅子来回蹂躏 汽车碾过毫发无伤 甚至能拖动2吨重的汽车 官方宣称,ZUS Kevlar Cable能承受高达1.5万次的高强度弯曲,比价格更贵的Belkin数据线多了足足一半。 除了外层包裹增强型尼龙编织物,这条数据线内部还加入了高强度的凯夫拉(Kev
[手机便携]
基于AVR的LED显示屏的灰度设计与实现
LED点阵块具有亮度高、发光均匀、可靠性好、拼装方便等优点,能构成各种尺寸的显示屏。目前,LED显示屏已被广泛应用于文字显示并取得了很好的效果,但是大部分仅能显示滚动的文字信息而不能显示图像,并且还存在系统复杂等缺点。本文提出了一种主从式单片机的 LED显示屏 解决方案,该设计方案利用AVR单片机自身的FLASH ROM和RAM,外部无需任何存储电路,电路结构简单。该系统实现了图像的16阶灰度显示,可广泛用于商场、车站等公共场合。 1 AVR单片机简介 AVR单片机是增强型内置FLASH的RISC(ReducedInstruction Set CPU)精简指令集高速8位单片机,硬件采用哈佛(Harward)结构
[单片机]
基于AVR的LED显示屏的灰度设计与实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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