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

📄 avrlcd4.c

📁 通过12864,实现AVR单片机输出的液晶显示
💻 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 + -