hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 237|回复: 0

自学AVR单片机二十五(12864)

[复制链接]

925

主题

1136

帖子

3583

积分

超级版主

Rank: 8Rank: 8

积分
3583

论坛头条论坛元老谋士数据帝优秀版主超级版主见习版主论坛版主

发表于 2024-2-25 17:08:49 | 显示全部楼层 |阅读模式
一、电路实现
本实例电路图如下

二、控制流程
本实验采用TS12864-3型液晶,这种液晶自带汉字库,可直接显示汉字,采用的驱动电路是ST7290。其他兼容ST7290电路的12864液晶都可利用此方法进行控制。
液晶使用手册请查阅相关资料。
12864液晶的初始化设置与1602相似,在本实验中用到的160212864两种液晶的时序图是一致的,所以他们的清屏,显示设置操作是完全一样的。
12864液晶是指这种液晶有64行,每行有128个点。要显示一个完整的汉字,需要16*16的点阵,即要显示一个汉字需要16行,每行有16个点.而显示一个字符只需要8*8点阵(或者5*7点阵等)。这样12864液晶可以显示4行汉字,每行能显示8个汉字。如果显示字符的话,每行能显示16个字符。再上一个例子中,每显示一个字符需要向液晶数据端口发送一个8位的单字节字符,而一个汉字的字码有两个字节;也就是说显示一个汉字要比显示一个字符多传送一个字节。
需要特别注意的是12864液晶的第一二三四行的地址是不连续的,实际连续顺序是1324,第一行起始地址是0X80,结束地址是0X87,第二行起始地址是0X88,结束地址是0X8F,第三行起始地址是0X90,结束地址是0X97,第四行起始地址是0X98,结束地址是0X9F,编写程序的时候一定要弄清楚。


三、程序代码
这个程序实现显示的效果是在液晶屏幕上显示4行汉字和字符:第一行显示" AVR单片机学习板";第二行显示" 12864液晶显示";第三行显示"程序设计: 慧龙";第四行显示" WWW.MCUZX.COM";
  1. #include <avr/io.h> //io端口寄存器配置文件,必须包含#include <util/delay.h> //GCC中的延时函数头文件//端口位定义#define RS PG0 //数据/命令控制端 0命令,1数据#define RW PG1 //读/写选择控制端 0写,1读#define E PG2 //使能端 下降沿读,高电平写#define PSB PA0 //数据传输方式选择端,H,8位或4位并口方式;L,串口方式 //全局变量声明//unsigned char LCD_DispBuff1[]="Let's study AVR";unsigned char LCD_DispBuff1[]=" AVR单片机学习板";unsigned char LCD_DispBuff2[]=" 12864液晶显示";unsigned char LCD_DispBuff3[]="程序设计: 慧龙";unsigned char LCD_DispBuff4[]=" MCUZX-AVR ";//函数声明void Port_Init(void); //端口初始化void LCD_Init(void); //LCD初始化void Write_Com(unsigned char LCD_Com); //LCD写指令void Write_Data(unsigned char LCD_Data); //LCD写数据void Check_Busy(void); //读写检测函数,每次对液晶操作前都要进行读写检测int main(void) {unsigned char Disp_Number;Port_Init(); //端口初始化LCD_Init(); //LCD初始化//下面这段程序演示在LCD上显市字符Write_Com(0X80+0X00);for(Disp_Number = 0;Disp_Number < 16;Disp_Number++){Write_Data(LCD_DispBuff1[Disp_Number]);_delay_ms(15);}Write_Com(0X90+0X00);for(Disp_Number = 0;Disp_Number < 14;Disp_Number++){Write_Data(LCD_DispBuff2[Disp_Number]);_delay_ms(15);}Write_Com(0X88+0X00);for(Disp_Number = 0;Disp_Number < 16;Disp_Number++){Write_Data(LCD_DispBuff3[Disp_Number]);_delay_ms(15);}Write_Com(0X98+0X00);for(Disp_Number = 0;Disp_Number < 14;Disp_Number++){Write_Data(LCD_DispBuff4[Disp_Number]);_delay_ms(15);}//PORTB = 0xff; ////DDRB = 0xff; //配置端口PB全部为输出口,LCD数据端口 while(1){}}void Port_Init(){ //LCD数据端口设置PORTB = 0x00; //DDRB = 0xff; //配置端口PB全部为输出口,LCD数据端口//LCD控制端口设置//DDRA |= (1 << PSB) | (1 << PA2);PORTG = 0X00;DDRG |= (1 << RS) | (1 << RW) | (1 << E);_delay_ms(15);}void LCD_Init(){PORTA |= (1 << PSB) | (1 << PA2);Write_Com(0x01); //清屏_delay_ms(15);Write_Com(0x38); //显示模式设置 16x2显示,5x7点阵,8位数据接口_delay_ms(15);//Write_Com(0x0f); //显示开关控制,开显示,光标显示,光标闪烁Write_Com(0x0c); //显示开关控制,开显示,光标不显示,光标不闪烁_delay_ms(15);Write_Com(0x06); //光标设置,读或写一个字符后,地址指针加一,光标加一,整屏不移动_delay_ms(15);}void Write_Com(unsigned char LCD_Com){//Check_Busy();PORTG &= ~(1 << RS); //RS=0,写命令PORTG &= ~(1 << RW); //RW=0,写指令PORTG |= (1 << E); //E=1,写操作_delay_ms(15);PORTB = LCD_Com; //指令送数据端口PORTG &= ~(1 << E); //E=0,停止写操作_delay_ms(15);}void Write_Data(unsigned char LCD_Data){//Check_Busy();PORTG |= (1 << RS); //RS=1,写数据PORTG &= ~(1 << RW); //RW=0,写指令PORTG |= (1 << E); //E=1,写操作_delay_ms(15); PORTB = LCD_Data; // 数据送数据端口 PORTG &= ~(1 << E); //E=0,停止写操作_delay_ms(15);}void Check_Busy(){DDRB = 0x00; //PB口置为输入口,准备读取数据PORTG &= ~(1 << RS); //RS=0,读命令PORTG |= (1 << RW); //RW=1,读指令PORTG |= (1 << E); //E=1,使能while(0X80 & PINB); //监测忙信号,直到忙信号为0,才能进行读写操作PORTG &= ~(1 << E); //E=0DDRB = 0xff; //PB口置为输出口,准备向端口发送数据}
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
世界上最遥远的距离,不是生与死的距离,而是我站在你面前,你却不知道我爱你
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-2 11:02 , Processed in 0.055398 second(s), 23 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表