#include
#include"12864.h"
#define BIT(bit) (1<<(bit))
uchar L[]="L 我想你了";
uchar L7[]="Miss You Much";
void display()//显示函数
{
set_position(0,0);
show_string(L);//显示字符串
set_position(1,0);
show_string(L7);//显示字符串
set_position(2,0);
show_string("L I Miss You");
set_position(3,0);
show_string("很想你");
}
void Bee()
{
uchar i,j;
for(j=0;j<3;j++)
{
for(i=0;i<100;i++)
{
PORTB^=BIT(PB0);
_delay_ms(3);
}
}
}
void init()//初始化函数
{
DDRC=0xff;//全部设置为输出
DDRA|=(1<<7)|(1<<6)|(1<<5);//设置PA口的第6位(12864的rs控制脚)和第7位(12864的en控制脚)为输出
DDRB|=BIT(PB0);//设置PB0口为输出,控制蜂鸣器和LED
PORTB&=~BIT(PB0);//PB0口输出0,关闭蜂鸣器和LED
init_12864();//12864液晶初始化
}
int main()
{
init();
display();
Bee();
while(1);
}
//12864液晶显示头文件
#define uchar unsigned char
#define uint unsigned int
//PA口的第5位(12864的并/串接口选择控制脚)
#define PSB PORTA |= (1 << 5)//第5位输出高电平 并口方式
//PA口的第6位(12864的rs控制脚)和第7位(12864的en控制脚)
//数据命令端
#define lcdrs_L PORTA &= ~(1 << 6)//第6位输出低电平 命令
#define lcdrs_H PORTA |= (1 << 6)//第6位输出高电平 数据
//使能端
#define lcden_L PORTA &= ~(1 << 7)//第7位输出低电平 关使能
#define lcden_H PORTA |= (1 << 7)//第7位输出高电平 开使能
void write_com(uchar com)//写命令函数
{
lcdrs_L;
PORTC=com;
_delay_ms(5);
lcden_H;
_delay_ms(5);
lcden_L;
}
void write_date(uchar date)//写数据函数
{
lcdrs_H;
PORTC=date;
_delay_ms(5);
lcden_H;
_delay_ms(5);
lcden_L;
}
void init_12864()//12864液晶初始化函数
{
PSB;//并口方式
lcden_L;//先关使能
write_com(0x30);//基本指令集 扩充指令集为0x34
_delay_ms(5);
write_com(0x01);//清屏
_delay_ms(5);
write_com(0x0c);//开显示,不显示光标,光标不闪烁
_delay_ms(5);
write_com(0x02);//把地址计数器清零,把光标放回原点
_delay_ms(5);
write_com(0x80);//从该地址开始显示 从原点开始显示
_delay_ms(5);
//write_com(0x18);执行一次,整屏左移一次
//write_com(0x1c);执行一次,整屏右移一次
}
void set_position(uchar x, uchar y)
{
uchar position=0;
switch(x%4)
{
case 0: position=0x80;break; //第一行开始地址
case 1: position=0x90;break; //第二行
case 2: position=0x88;break; //第三行
case 3: position=0x98;break; //第四行
}
position+=y;//要显示的坐标
write_com(position);
}
void show_string(uchar *string)//显示字符串函数
{
while(*string)
{
write_date(*string++);
}
}
上一篇:Atmega16的串口通信使用
下一篇:Atmega16的1602液晶使用
推荐阅读最新更新时间:2024-03-16 15:17