📄 avrlcd4.c
字号:
#include <avr/io.h>
//#incl lcd12864_init(void)ude <macros.h>
#include <avr/delay.h>
//宏定义:定义各种操作的管脚
//使用前应由主程序配置其输入、输出
//LCD控制端口
#define lcd_kz PORTD
//串行时钟端:PD4输出
#define clk 4
#define set_lcd_clk lcd_kz |= (1<<clk) //置高
#define clr_lcd_clk lcd_kz &= (~(1<<clk))//清0
//片选控制端CS操作:PC6输出
#define cs 6
#define set_lcd_cs PORTC |= (1<<cs) //置高
#define clr_lcd_cs PORTC &= (~(1<<cs)) //清0
//串行数据输入端SID操作:PD3输出
#define sid 3
#define clr_lcd_sid lcd_kz &= (~(1<<sid)) //清0
#define set_lcd_sid lcd_kz |= (1<<sid) //置位
//8/4位选择控制PSB操作:PD6输出
#define psb 6
#define clr_lcd_psb lcd_kz &= (~(1<<psb)) //清0:4位
#define set_lcd_psb lcd_kz |= (1<<psb) //置位:8位
//复位端RST操作:PD7输出
#define rst 7
#define clr_lcd_rst lcd_kz &= (~(1<<rst)) //清0
#define set_lcd_rst lcd_kz |= (1<<rst) //置位
//背光控制端:PC7
#define led_on PORTC &= ~(1<<7) //开背光
#define led_off PORTC |= 1<<7 //关背光
//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int
/************************************
* 模拟串口专用延时函数 *
************************************/
const unsigned char data[]={
0x00, 0x00, 0x00, 0x00, 0x00, // sp
0x00, 0x00, 0x2f, 0x00, 0x00, // !
0x00, 0x07, 0x00, 0x07, 0x00, // "
0x14, 0x7f, 0x14, 0x7f, 0x14, // #
0x24, 0x2a, 0x7f, 0x2a, 0x12, // $
0x62, 0x64, 0x08, 0x13, 0x23, // %
0x36, 0x49, 0x55, 0x22, 0x50, // &
0x00, 0x05, 0x03, 0x00, 0x00, // ’
0x00, 0x1c, 0x22, 0x41, 0x00, // (
0x00, 0x41, 0x22, 0x1c, 0x00, // )
0x14, 0x08, 0x3E, 0x08, 0x14, // *
0x08, 0x08, 0x3E, 0x08, 0x08, // +
0x00, 0x00, 0xA0, 0x60, 0x00, // ,
0x08, 0x08, 0x08, 0x08, 0x08, // -
0x00, 0x60, 0x60, 0x00, 0x00, // .
0x20, 0x10, 0x08, 0x04, 0x02, // /
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
0x00, 0x42, 0x7F, 0x40, 0x00, // 1
0x42, 0x61, 0x51, 0x49, 0x46, // 2
0x21, 0x41, 0x45, 0x4B, 0x31, // 3
0x18, 0x14, 0x12, 0x7F, 0x10, // 4
0x27, 0x45, 0x45, 0x45, 0x39, // 5
0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
0x01, 0x71, 0x09, 0x05, 0x03, // 7
0x36, 0x49, 0x49, 0x49, 0x36, // 8
0x06, 0x49, 0x49, 0x29, 0x1E, // 9
0x00, 0x36, 0x36, 0x00, 0x00, // :
0x00, 0x56, 0x36, 0x00, 0x00, // ;
0x08, 0x14, 0x22, 0x41, 0x00, // <
0x14, 0x14, 0x14, 0x14, 0x14, // =
0x00, 0x41, 0x22, 0x14, 0x08, // >
0x02, 0x01, 0x51, 0x09, 0x06, // ?
0x32, 0x49, 0x59, 0x51, 0x3E, // @
0x7C, 0x12, 0x11, 0x12, 0x7C, // A
0x7F, 0x49, 0x49, 0x49, 0x36, // B
0x3E, 0x41, 0x41, 0x41, 0x22, // C
0x7F, 0x41, 0x41, 0x22, 0x1C, // D
0x7F, 0x49, 0x49, 0x49, 0x41, // E
0x7F, 0x09, 0x09, 0x09, 0x01, // F
0x3E, 0x41, 0x49, 0x49, 0x7A, // G
0x7F, 0x08, 0x08, 0x08, 0x7F, // H
0x00, 0x41, 0x7F, 0x41, 0x00, // I
0x20, 0x40, 0x41, 0x3F, 0x01, // J
0x7F, 0x08, 0x14, 0x22, 0x41, // K
0x7F, 0x40, 0x40, 0x40, 0x40, // L
0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
0x7F, 0x04, 0x08, 0x10, 0x7F, // N
0x3E, 0x41, 0x41, 0x41, 0x3E, // O
0x7F, 0x09, 0x09, 0x09, 0x06, // P
0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
0x7F, 0x09, 0x19, 0x29, 0x46, // R
0x46, 0x49, 0x49, 0x49, 0x31, // S
0x01, 0x01, 0x7F, 0x01, 0x01, // T
0x3F, 0x40, 0x40, 0x40, 0x3F, // U
0x1F, 0x20, 0x40, 0x20, 0x1F, // V
0x3F, 0x40, 0x38, 0x40, 0x3F, // W
0x63, 0x14, 0x08, 0x14, 0x63, // X
0x07, 0x08, 0x70, 0x08, 0x07, // Y
0x61, 0x51, 0x49, 0x45, 0x43, // Z
0x00, 0x7F, 0x41, 0x41, 0x00, // [
0x55, 0x2A, 0x55, 0x2A, 0x55, // 55
0x00, 0x41, 0x41, 0x7F, 0x00, // ]
0x04, 0x02, 0x01, 0x02, 0x04, // ^
0x40, 0x40, 0x40, 0x40, 0x40, // _
0x00, 0x01, 0x02, 0x04, 0x00, // ’
0x20, 0x54, 0x54, 0x54, 0x78, // a
0x7F, 0x48, 0x44, 0x44, 0x38, // b
0x38, 0x44, 0x44, 0x44, 0x20, // c
0x38, 0x44, 0x44, 0x48, 0x7F, // d
0x38, 0x54, 0x54, 0x54, 0x18, // e
0x08, 0x7E, 0x09, 0x01, 0x02, // f
0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g
0x7F, 0x08, 0x04, 0x04, 0x78, // h
0x00, 0x44, 0x7D, 0x40, 0x00, // i
0x40, 0x80, 0x84, 0x7D, 0x00, // j
0x7F, 0x10, 0x28, 0x44, 0x00, // k
0x00, 0x41, 0x7F, 0x40, 0x00, // l
0x7C, 0x04, 0x18, 0x04, 0x78, // m
0x7C, 0x08, 0x04, 0x04, 0x78, // n
0x38, 0x44, 0x44, 0x44, 0x38, // o
0xFC, 0x24, 0x24, 0x24, 0x18, // p
0x18, 0x24, 0x24, 0x18, 0xFC, // q
0x7C, 0x08, 0x04, 0x04, 0x08, // r
0x48, 0x54, 0x54, 0x54, 0x20, // s
0x04, 0x3F, 0x44, 0x40, 0x20, // t
0x3C, 0x40, 0x40, 0x20, 0x7C, // u
0x1C, 0x20, 0x40, 0x20, 0x1C, // v
0x3C, 0x40, 0x30, 0x40, 0x3C, // w
0x44, 0x28, 0x10, 0x28, 0x44, // x
0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y
0x44, 0x64, 0x54, 0x4C, 0x44, // z
0x00, 0x08, 0x36, 0x41, 0x00, // {
0x00, 0x00, 0x7F, 0x00, 0x00, // |
0x00, 0x41, 0x36, 0x08, 0x00, // }
0x08, 0x10, 0x08, 0x04, 0x08 // ~
};
#define uchar unsigned char
#define uint unsigned int
/********************************
* 器件端口初始化函数 *
********************************/
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0xFF;
PORTD = 0x20; //PD5为高电平:蜂鸣器不导通
DDRD = 0xFF;
}
/*****************************************
* 写指定位数到12864的函数 *
* 入口参数:n写入位数,data写入数据 *
* 说 明:将data的高n位写入 *
*****************************************/
void wr_bit(uchar n,uchar data)
{
for(;n;n--) //写入位数
{
if(data&0x80) //判断应写入1或0
{set_lcd_sid;}
else
{clr_lcd_sid;}
data=data<<1; //左移一位,准备写入下一位
_delay_ms(50);
set_lcd_clk; //产生上升沿,写入
_delay_ms(50);
clr_lcd_clk;
}
}
/*****************************************
* 写指令或数据到12864函数 *
*入口参数:a=1写显示数据,a=0写指令数据 *
* b需写入的数据 *
*时 序:按手册时序进行 *
*****************************************/
void wr_12864(uchar a,uchar b)
{
clr_lcd_clk;
wr_bit(5,0xFF); //写入五个1
wr_bit(1,0x00); //写入R/W=0,写入数据
if(a==0) //根据a值写入RS值
wr_bit(1,0x00); //如果a为1,写指令(RS=0)
else
wr_bit(1,0x80); //如果a不为1,写数据(RS=1)
wr_bit(1,0x00); //写入一个0
wr_bit(4,b); //写入数据的高4位
wr_bit(4,0x00); //写入4个0
wr_bit(4,(b<<4)); //写入数据的低4位
wr_bit(4,0x00); //写入4个0
set_lcd_sid; //非数据传送状态数据端置高
}
/*****************************************
* LCD12864初始化函数 *
*****************************************/
void lcd_init(void)
{
clr_lcd_psb; //串行工作方式
_delay_ms(50);
led_on; //开背光
clr_lcd_rst; //复位
_delay_ms(100);
set_lcd_rst;
_delay_ms(200);
set_lcd_cs; //片选高电平有效
wr_12864(0,0x30); //设置数据方式:8位
_delay_ms(200);
wr_12864(0,0x30); //设置数据方式:8位
_delay_ms(80);
wr_12864(0,0x0C); //开显示
_delay_ms(80);
wr_12864(0,0x40); //开显示
_delay_ms(200);
wr_12864(0,0x01); //清屏
_delay_ms(200);
}
/************************************
* LCD12864显示字符串函数 *
************************************/
//入口:待显示的字符串
void lcd(char *s)
{
while(*s)
{
wr_12864(1,*s);
s++;
}
}
/************************************
* LCD12864显示定位函数 *
* 入 口:h定位的行数,V列数 *
************************************/
void locate(uchar h,uchar v)
{
switch(h)
{
case 1:
wr_12864(0,(0x80+v-1)); //写第一行V列地址
break;
case 2:
wr_12864(0,(0x90+v-1)); //写第二行V列地址
break;
case 3:
wr_12864(0,(0x88+v-1)); //写第三行V列地址
break;
case 4:
wr_12864(0,(0x98+v-1)); //写第四行V列地址
break;
default:break;
}
}
/************************************
* LCD12864显示清屏函数 *
************************************/
void cls(void)
{
_delay_ms(200);
wr_12864(0,0x01); //清屏
_delay_ms(20);
}
/********************************
* 显示公司广告语函数 *
********************************/
void guanggao(void)
{
locate(1,3);
lcd("欢迎光临");
locate(2,1);
lcd(" AVR开发讨论网!");
locate(3,1);
lcd(" www.iccavr.com");
locate(4,1);
lcd("深圳市龙岗区坂田");
}
/******************************
* 主函数 *
******************************/
int main(void)
{
port_init(); //端口定义
_delay_ms(50);
lcd_init(); //液晶初始化
_delay_ms(50);
guanggao(); //显示欢迎内容
_delay_ms(3000); //显示时间5秒
cls(); //清屏
_delay_ms(20);
locate(1,1); //定位于第一行第一列
lcd(" FYD12864-0402B");
locate(2,2); //定位于第二行第二列
lcd("汉字液晶测试");
while(1)
{
locate(3,1); //定位于第三行第一列
lcd("这里显示的是汉字");
locate(4,2); //定位于第四行第二列
lcd(" 欢迎试用!");
_delay_ms(2000);
locate(3,1); //定位于第三行第一列
lcd(" 作者:铜 河 ");
locate(4,2); //定位于第四行第二列
lcd(" AVR开发网 ");
_delay_ms(2000);
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -