📄 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 + -