⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1602.c

📁 用AVR单片机Mega16控制的1602液晶屏显示
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>			//标准输入输出头文件
#define uchar unsigned char
#define uint  unsigned int

//uchar DATA[16] = {'W','e','l','c','o','m','e',' ','t','o',' ','C','U','M','T','!'};
uchar DATA1[] = {"   Welcome to   "};
uchar DATA2[] = {"           CUMT!           "};
/********** LCD1602接线引脚定义 ***********/
//E  -- PD4
//RW -- PD5
//RS -- PD6
//DB0~7  --  PC0~7

/****************** 延时函数 *****************/
void delay(uint t)
{
  while(t--);
}

void delay_ms(uint t)
{
 uint i,j;
 for(i=t;i>0;i--)
    for(j=0;j<1140;j++);
}

/****************** 端口初始化 *****************/
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0xFF;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00;
 DDRC  = 0xFF;
 PORTD = 0x00;
 DDRD  = 0xFF;
}

/****************** mega16 初始化 *****************/
void init_devices(void)
{
 CLI();
 port_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00;
 SEI();
}

/****************** 检查忙信号 *****************/
void lcd_busy()
{
 DDRC = 0X00;  		   //PC 口改为输入
 PORTD = 0X20;
 delay(10);
 PORTD = 0X30;
 while(PINC & 0X80);  //lcd 忙,则在此循环
 PORTD = 0X20;
 DDRC = 0XFF;  		   //PC 口改为输出
}

/****************** 写命令函数 *****************/
void lcd_cmd(uchar cmd)
{
 lcd_busy();
 PORTD = 0X00;
 delay(1);
 PORTC = cmd; 	   	   //PC 口输出命令
 delay(1);
 PORTD = 0X10;
 delay(1);	  		   //延时
 PORTD = 0X00;
}

/****************** 写数据函数 *****************/
void lcd_data(uchar data)
{
 lcd_busy();
 PORTD = 0X40;
 delay(1);
 PORTC = data;		//写要显示的字
 delay(1);
 PORTD = 0X50;
 delay(1);
 PORTD = 0X40;
}

/****************** 显示函数 *****************/
void lcd_DAT(uchar x,uchar y,uchar DAT)
{
 if(y) x += 0x40;
 x |= 0x80;
 lcd_cmd(x);	   //写要显示的地址
 lcd_data(DAT);	   //写显示的内容
}

/****************** lcd 初始化 *****************/
void lcd_init()
{
 lcd_cmd(0x38);
 lcd_cmd(0x08);
 lcd_cmd(0x01);
 lcd_cmd(0x06);
 lcd_cmd(0x0c);
}

/****************** 主函数 *****************/
void main(void)
{
 uchar i,p=1;  		//p 的初始值必须是 1 ,若是 0 则第一次向左移动,滚动屏显示出界
 char m = 11;
 init_devices();	//单片机 I/O 口初始化
 delay_ms(100);		//延时一段时间,等待 LCD 进入工作状态
 lcd_init();		//LCD 初始化				
 
 /*lcd_DAT(0,0,'G');
 lcd_DAT(1,0,'O');
 lcd_DAT(2,0,'O');
 lcd_DAT(3,0,'D');
 lcd_DAT(5,1,'B');
 lcd_DAT(6,1,'Y');
 lcd_DAT(7,1,'E');*/
 lcd_cmd(0x80);
 for(i=0;DATA1[i] != '\0';i++)
  {
   lcd_DAT(i,0,DATA1[i]);
  }
 while(1)
 {  
  for(i=0;i<16;i++)
  {
   lcd_DAT(i,1,DATA2[i+m]);
  }
  delay_ms(700);		   	  //滚动屏
  if(p == 1) m --;
  else if(p == 0) m++;
  if(m >= 11) p = 1;
  else if(m <= 0) p = 0;
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -