stm32_12864带字库液晶_反白_闪烁_字位控制

合集下载

12864液晶显示汉字 (1)

12864液晶显示汉字 (1)

摘要因为汉字本身的特点,显示汉字始终是计算机在我国应用普及的一个障碍。

随着单片机和显示技术的发展,加上人们不满足单片机系统采用LED 数码管的简单显示,利用单片机控制液晶显示成为当前显示系统的主流。

本文主要介绍了89S52 单片机为控制设备,液晶显示器为显示设备。

实现的一个可以显示汉字、字符和动态显示汉字的液晶显示器设备。

通过汉字显示程序的地址,接着运行相应的程序取汉字机内码和西文字符的ASCII 码,并在存储器中进行寻址找出相对应的显示代码或汉字字模,提取后作为阵显示信息送液晶显示器显示。

再者通过按键控制可以实现显示的汉字左右移动。

利用液晶显示器显示汉字操作灵活,汉字显示果可以大大提高。

关键词液晶显示点阵显示单片机Because of the characteristics of Chinese characters, displaying Chinese characters itself isalways computer is applied in our country popularity of an obstacle. With single-chip microcomputerand display technology development, and people don't satisfy SCM system using LED digital display,use simple tube of single-chip microcomputer control LCD display currently become the mainstreamof the display system. This article mainly introduced the 89S52 of control equipment, LCD monitorsfor display device. Implements a can display Chinese characters, characters and dynamic display ofChinese LCD equipment. Through Chinese displaying a program's address, and then run thecorresponding program take Chinese characters Machine code and cataloguing of ASCII characters,and in storage addressing find corresponding display code or Chinese character, after extractionword-model as Array display information sent LCD display. Moreover through button control can berealized display characters move around. Using LCD display characters operation is flexible andChinese displaying fruit can improve greatly.Keywords LCD dot matrix display button control目录第一章绪论1.1 液晶显示的发展趋势和介绍第二章系统总体设计2.1 简介2.2 电路硬件原理图2.3 软件设计方案2.4 仿真结果第三章ATMEL 89S52系列单片机3.1 A T89S52单片机内部的组成结果图3.2 单片机CPU结构3.3 AT89S52用户系统3.4 引脚介绍第四章液晶12864LCD (8)4.1 12864 液晶显示模块概述 (8)4.2 模块引脚说明 (9)4.3 资料传输与接口时序 (9)4.4 12864LCD模块指令 (11)4.5 显示步骤 (14)3.4 汉字显示设计 (15)3.4.1 开发板的介绍 (15)3.4.2 汉字液晶显示介绍 (15)3.4.3 汉字液晶显示设计分析 (16)3.4.4 程序分析及显示成果 (18)3.4.5 程序及调试 (20)4结论 (21)参考文献 (22)附录一程序 (23)附录二、字符表与地址坐标 (28)附录三、显示结果 (29)3.1 单片机51 单片机:单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

12864中文字库液晶模块使用说明书

12864中文字库液晶模块使用说明书

12864中文字库液晶模块使用说明书第 1 页共16 页一、12864液晶显示模块概述1. 12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

可与CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。

具有多种功能:光标显示、画面移位、睡眠模式等。

2. 外观尺寸:93×70mm(4X8C), 84×44mm(2X8C),110×65mm(2x8 C _2), 116×39mm(2X10),180×65mm(4X16A)3. 视域尺寸:73×39mm(4X8C), 78×25mm(2x8 C _2), 70×20mm(2X8C),85×20mm(2X10), 132×39mm(4X16A),补充说明:外观尺寸可根据用户的要求进行适度调整。

二、模块引脚说明1)表—1:(128X32)、(160X32)模块引脚说明引脚名称 方向 说明 引脚名称方向 说明1 VSS - GND(0V) 11 DB4 I/O 数据42 VDD - Supply Voltage For Logic (+5v) 12 DB5 I/O 数据53 VO - Supply Voltage For LCD (悬空)13 DB6 I/O 数据64 RS(CS) H/L H: Data L: Instruction Code 14 DB7 I/O 数据75 R/W(STD) H/L H: Read L: Write15 PSB H/L 16032此脚为:RESET脚 6 E(SCLK) H,H/L Enable Signal7 DB0 I/O 数据0 16 /RST H/L 16032此脚为空8 DB1 I/O 数据1 17 LEDK - 16032此脚为A9 DB2 I/O 数据2 18 LEDA - 16032此脚为K10 DB3 I/O 数据3 注:以上K为负,A为正4)表—4:(256X64)引脚说明引脚名称 方向 说明引脚名称 方向 说明 1 FG - FRAME GROUND 11 DB0 I/O 数据0 2 VSS - GND(0V)12 DB1 I/O 数据1 3 VDD - Supply Voltage For Logic (+5v) 13 DB2 I/O 数据2 4 NC - 空脚14 DB3 I/O 数据3 5 R/W H/L H: Read L: Write 15 DB4 I/O 数据4 6 E1 H,H/L Enable Signal1 16 DB5 I/O 数据5 7 E2 H,H/L Enable Signal217 DB6 I/O 数据6 8 RS H/L H: Data L: Instruction Code 18 DB7 I/O 数据7 9 NC - 空脚19 NC - 空脚 10 /RST H/L Reset Signal 低电平有效 20 NC - 空脚注 K背光源负极(LED-OV)A背光源正极(LED+5V)三、12864液晶硬件接口1、逻辑工作电压(VDD):4.5~5.5V2、电源地(GND):0V3、LCD 驱动电压(V0):0~-10V4、工作温度(Ta):0~55℃(常温) / -20~70℃(宽温) 保存温度(Tstg):-10~65℃(常温)5、电气特性见附图1 外部连接图(参考附图2)模块有并行和串行两种连接方法(时序如下): 1、8位并行连接时序图MPU 写资料到模块RSR/WEMPU从模块读出资料RSR/WE2、串行连接时序图CS C LS T3、AC电气特性(TA=25℃ VCC=5V)condition Min. Typ. Max. UnitSYMBOL Characteristics Testfrequency Rf=39KΩ480 540 600 KHz Fosc OSCTIME UNIT PARAMETER SYMBOL MESUREFOR WRITE MODE(WRITING DATA FROM MPU TO ST7920)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDSW 1,000 nsData hold time TH 20 nsEnable pulsewidth TPW 1,500 nsEnable rise/fall time TR,TF 25 nsFOR READ MODE(READING DATA FROM ST7920 TO MPU)System cycle time TC 13,000 nsAddress setup time TAS 1,500 nsAddress hold time TAH 1,500 nsData setup time TDDR 1,000 nsData hold time TH 20 ns Enable pulsewidth TPW 1,500 ns Enable rise/fall time TR,TF 25 ns四、用户指令集指令表—2:(RE=1:扩充指令集)指令码指令RS RW DB7 DB6 DB5DB4 DB3 DB2DB1DB0说明执行时间(540KHZ )待命模式 0 0 0 0 0 0 0 0 0 1将DDRAM 填满“20H ”,并且设定DDRAM 的地址计数器(AC )到“00H ” 72us卷动地址或IRAM 地址选择 0 0 0 0 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM 地址72us反白选择 0 0 0 0 0 0 0 1 R1 R0选择4行中的任一行作反白显示,并可决定反白与否 72us 睡眠模式0 0 0 0 0 0 1 SL X XSL=1:脱离睡眠模式 SL=0:进入睡眠模式72us扩充功能设定0 0 0 0 1 1 X1REG 0RE=1:扩充指令集动作RE=0:基本指令集动作G=1 :绘图显示ONG=0 :绘图显示OFF72us设定IRAM地址或卷动地址0 0 0 1 AC5AC4 AC3 AC2AC1AC0SR=1:AC5—AC0为垂直卷动地址SR=0:AC3—AC0为ICON IRAM地址72us设定绘图RAM地址0 0 1 AC6 AC5AC4 AC3 AC2AC1AC0设定CGRAM地址到地址计数器(AC)72us备注:1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

stm32-12864液晶-菜单设计

stm32-12864液晶-菜单设计

/*************menu.h*******************/#ifndef __MENU_H#define __MENU_H#include "stm32f10x.h"#include "SysTick.h"#include <stdlib.h>#include "12864.h"#include "AdcDisplay.h"#include "key.h"#include "spi_tm7705.h"#include "eeprom.h"typedef struct menu//定义一个菜单{u8 range_from,range_to; //当前显示的项开始及结束序号u8 itemCount;//项目总数u8 selected;//当前选择项u8 *menuItems[17];//菜单项目struct menu **subMenus;//子菜单struct menu *parent;//上级菜单,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数}Menu;void MainDisplay(void);void DisplayMenu(u8 line);void func(void);void Unitch1(void);void Unitch2(void);void Unitch3(void);void Unitch4(void);void DiaChange(void);void MlChange(void);u16 NumLoop(u16 num,u8 pm);u8 Change(u8 Sval,uint8_t* title);void MenuInit(void);#endif /* __MENU_H *//*************menu.h*******************//************menu.c*******************//******************** ********************* 文件名:menu.c* 描述:液晶菜单函数库* 实验平台:* 硬件连接----------------------------**** ----------------------------* 库版本:ST3.0.0******************************************************************************** ***/#include "menu.h"//菜单与AD结果显示变量,0为AD,1为菜单extern u8 MenuDis=0;//typedef struct menu//定义一个菜单//{// u8 range_from,range_to; //当前显示的项开始及结束序号// u8 itemCount;//项目总数// u8 selected;//当前选择项// u8 *menuItems[17];//菜单项目// struct menu **subMenus;//子菜单// struct menu *parent;//上级菜单,如果是顶级则为null// void (**func)();//选择相应项按确定键后执行的函数////}Menu;Menu MainMenu = { //定义主菜单0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项{"单位设置\x10","直径设置\x10","模量设置\x10","关于"}};Menu UnitMenu = {//单位设置菜单0,3,4,0,{"应变量ε","锁模力KN ","锁模力Ton","取消"}};u8 UnitCh;//单位选择,0为变形量ε,1为应变量σ,2为锁模力FMenu DiaMenu = {//单位设置菜单0,0,1,0,{"主999 mm"}};Menu MlMenu = {//模量设置菜单0,0,1,0,{"主999 KN/mm2"}};u8 DiaVal;//直径数值u8 MlVal;//模量数值//菜单与AD结果显示变量,0为AD,1为菜单u8 MenuDis;//复位前指数u16 BaseAD[4];//横截面积u16 mianji;//横截直径u16 zhijing;//模量u16 moliang;//按键返回值u8 keyval;uint8_t* title1="单位:MM";uint8_t* title2="单位:KN/MM2";extern u16 ADResult[4];//存储AD结果的数组extern uint16_t VirtAddVarTab[NumbOfVar];//eepromMenu *currentMenu;//当前的菜单void MainDisplay(void){if (MenuDis==0)AdUi();keyval=KeyScan();switch(keyval){case 0://什么都不干{Delay_ms(50);break;}case 1://向上{if(MenuDis==1){if(currentMenu->selected == 0)//到了第一项break;else{currentMenu->selected--;DisplayMenu(currentMenu->selected);}}break;}case 2://向下{if(MenuDis==1){if(currentMenu->selected == currentMenu->itemCount-1)break;else{currentMenu->selected++;DisplayMenu(currentMenu->selected);}}break;}case 3://确认{if(MenuDis==0){MenuDis=1;LCD_Init();DisplayMenu(currentMenu->selected);}else{if(currentMenu->subMenus[currentMenu->selected] !=NULL){LCD_Init();currentMenu = currentMenu->subMenus[currentMenu->selected];DisplayMenu(currentMenu->selected);}else{if(currentMenu->func[currentMenu->selected] != NULL){LCD_Init();currentMenu->func[currentMenu->selected]();//执行相应的函数currentMenu->selected=0;DisplayMenu(currentMenu->selected);//返回后恢复原来的菜单状态}}}break;}case 4://取消{if(MenuDis==1){if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单{LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected);}else{MenuDis=0;//currentMenu = MainMenu;currentMenu->selected=0;LCD_Init();AdUi();Delay_ms(100);}}else{Clr_Scr();Delay_ms(50);Write_Char(0,0x30);//关闭扩展指令//复位归零BaseAD[0]=ADResult[0];BaseAD[1]=ADResult[1];BaseAD[2]=ADResult[2];BaseAD[3]=ADResult[3];AdUi();}break;}default:break;}}//用于显示菜单项void DisplayMenu(u8 line) //显示菜单项并设置选中的项反白{int i;line = 3-(currentMenu->range_to-line);for(i = 0;i<4;i++){LCD_Write_String(i,0,currentMenu->menuItems[i+currentMenu->range_from]); }WhiteLineInit();White_Line(line,0,8);//反白显示指定行}void func(void){uint8_t* s="为人民服务";LCD_Write_String(1,0,s);Delay_ms(3000);}void Unitch1(void){UnitCh=0;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch2(void){UnitCh=1;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch3(void){UnitCh=2;LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void Unitch4(void){LCD_Init();currentMenu = currentMenu->parent;currentMenu->selected=0;DisplayMenu(currentMenu->selected); }void DiaChange(void){uint8_t* s="单位:MM";//测试代码u16 a=0;int i=0;//u16 tmp1;LCD_Init();LCD_Write_String(0,0,s);zhijing=Change(zhijing,title1);mianji=3.14*((zhijing/2)*(zhijing/2));EE_WriteVariable(VirtAddVarTab[0], zhijing);//测试代码//for(i=0;i<99;i++)//{//a=a+1;//LCD_Write_Tri_Value(2,3,a);//Delay_ms(50);//}}void MlChange(void){uint8_t* s="单位:KN/MM2";LCD_Init();LCD_Write_String(0,0,s);moliang=Change(moliang,title2);EE_WriteVariable(VirtAddVarTab[1], moliang);}//数字按键循环,升到9后变0,降到0后变9,参数pm为加减,1为+,0为减u16 NumLoop(u16 num,u8 pm){if (pm==1){if (num>=9)num=0;elsenum=num+1;}else{if (num<=0)num=9;elsenum=num-1;}return num;}//Sval代表直径或模量的默认值,返回修改后直径或模量的值u8 Change(u8 Sval,uint8_t* title){u16 baiwei,shiwei,gewei,Dval;//数字ascii码//char tmpval;//按键返回值u8 keyval=0;//光标位置3为百位、4为十位,5为个位u8 loc=3;//是否选中其中一位u8 clicked=0;//光标闪烁位,是否闪烁u8 flicker=0;baiwei=(u16)(Sval/100);shiwei=(u16)((Sval%100)/10);gewei=(u16)((Sval%100)%10);//tmpval=(char)baiwei + 0x30;//LCD_Write_Char(2,3,tmpval);//tmpval=(char)shiwei + 0x30;//LCD_Write_Char(2,4,tmpval);//tmpval=(char)gewei + 0x30;//LCD_Write_Char(2,5,tmpval);//LCD_Write_Single_Num(2,3,baiwei);//LCD_Write_Single_Num(2,4,shiwei);//LCD_Write_Single_Num(2,5,gewei);LCD_Write_Tri_Value(2,3,Sval);WhiteLineInit();White_Line(2,3,1);//反白显示指定行while(1){keyval=KeyScan();switch(keyval){case 0://什么都不干{if (clicked){if (flicker==0){White_Line(2,loc,1);flicker=1;}else{Shut_White_Line(2,loc,1);flicker=0;}}//else//White_Line(2,loc,1);Delay_ms(300);break;}case 1://向上{if (clicked==0){if (loc>3)loc=loc-1;elseloc=3;WhiteLineInit();White_Line(2,loc,1);}else{switch (loc){case 3:{baiwei=NumLoop(baiwei,1);LCD_Init();break;}case 4:{shiwei=NumLoop(shiwei,1);LCD_Init();break;}case 5:{gewei=NumLoop(gewei,1);LCD_Init();break;}default:break;}}break;}case 2://向下{if (clicked==0){if (loc<5)loc=loc+1;elseloc=5;WhiteLineInit();White_Line(2,loc,1);}else{switch (loc){case 3:{baiwei=NumLoop(baiwei,0);LCD_Init();break;}case 4:{shiwei=NumLoop(shiwei,0);LCD_Init();break;}case 5:{gewei=NumLoop(gewei,0);LCD_Init();break;}default:break;}}break;}case 3://确认{if (clicked)clicked=0;elseclicked=1;break;}case 4://取消{if (clicked)clicked=0;else //返回主菜单{LCD_Init();currentMenu = &MainMenu;currentMenu->selected=0;DisplayMenu(currentMenu->selected);//返回新的数值Dval=baiwei*100+shiwei*10+gewei;return Dval;}break;}default:break;}//LCD_Init();LCD_Write_String(0,0,title);Dval=baiwei*100+shiwei*10+gewei;LCD_Write_Tri_Value(2,3,Dval);Delay_ms(20);}}//初始化菜单:void MenuInit(void){MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);MainMenu.subMenus[0] = &UnitMenu;//第1项没有子菜单置null,选择后程序会调用func中相应项中的函数MainMenu.subMenus[1] = NULL;//&DiaMenu;直接执行设置函数MainMenu.subMenus[2] = NULL;//&MlMenu;直接执行设置函数MainMenu.subMenus[3] = NULL;MainMenu.func = malloc(sizeof(&func)*4);MainMenu.func[0] = &func;MainMenu.func[1] = &DiaChange;MainMenu.func[2] = &MlChange;//当选择了并按了确定,会执行func函数MainMenu.func[3] = NULL;MainMenu.parent = NULL;//表示是顶级菜单UnitMenu.subMenus = malloc(sizeof(&UnitMenu)*4);UnitMenu.subMenus[0] = NULL;UnitMenu.subMenus[1] = NULL;UnitMenu.subMenus[2]= NULL;UnitMenu.subMenus[3]= NULL;UnitMenu.func = malloc(sizeof(&Unitch1)*4);UnitMenu.func[0] = &Unitch1;UnitMenu.func[1] = &Unitch2;UnitMenu.func[2] = &Unitch3;UnitMenu.func[3] = &Unitch4;UnitMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项// DiaMenu.subMenus = malloc(sizeof(&DiaMenu)*1);// DiaMenu.subMenus[0] = NULL;// DiaMenu.func = malloc(sizeof(&func)*1);// DiaMenu.func[0] = &func;// DiaMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项//// MlMenu.subMenus = malloc(sizeof(&MlMenu)*1);// MlMenu.subMenus[0] = NULL;// MlMenu.func = malloc(sizeof(&func)*1);// MlMenu.func[0] = &func;// MlMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项currentMenu = &MainMenu;}/************menu.c*******************/。

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

//12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#include &lt;reg52.h&gt;#include &lt;intrins.h&gt;#define uchar unsigned charvoid lcd_ini();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={23,45,12};uchar code clockname[10]={&quot;北京时间:&quot;};uchar data num[6];/*******主程序*************/void main(){lcd_ini();count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒TMOD=0x01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;IT0=1;EX0=1;TR0=1;while(1){back:ascii_change();disp();delay();if(flag==1)goto back;tkey();shan();delay();}}/****lcd初始化*******/void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}/********定时程序*************/ void timer1() interrupt 1 using 2 {TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;if(clock[2]==60){clock[2]=0;clock[1]++;//分//}if(clock[1]==60){clock[1]=0;clock[0]++;}if(clock[0]==24)//时//clock[0]=0;out:_nop_();}/*******十位个位转换成ASCII码************/ void ascii_change(void){num[5]=clock[2]-(clock[2]/10)*10+0x30;num[4]=clock[2]/10+0x30;num[3]=clock[1]-(clock[1]/10)*10+0x30;num[2]=clock[1]/10+0x30;num[1]=clock[0]-(clock[0]/10)*10+0x30;num[0]=clock[0]/10+0x30;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i&gt;0;i--)for (j=250;j&gt;0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i&lt;=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i&lt;=6;i++) {k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

STM32驱动12864液晶屏

STM32驱动12864液晶屏

STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00 ,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till pll used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。

STM32串行驱动12864液晶

STM32串行驱动12864液晶

自己参考大神们的程序改写的液晶驱动,希望对有需要的人能有帮助#include "stm32f10x.h"static __IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(__IO uint32_t nTime);#define Line1 0x80//液晶第一行#define Line2 0x90//液晶第二行#define Line3 0x88//液晶第三行#define Line4 0x98//液晶第四行#define LCD_IO GPIOE //我用的是E.2 E.3 E.4 E.5 E.6#define CS GPIO_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) //将对应管脚输出高电平#define RESET(n) GPIO_ResetBits(GPIOE,n)//输出低电平#define CMD (uint32_t)0xf8000000 //串行写入的是命令要先写入0xf8 #define DATE (uint32_t)0xfa000000 // 串行写入数据要先写入0xfavoid LCD_IOinit_OUT() //推挽输出模式,管脚配置,不多解释,库函数有{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_IO, &GPIO_InitStructure);}void LCD_Write(uint32_t cmd,uint8_t ddata)//LCD 写函数{uint32_t temp=cmd;uint32_t i;RESET(CS); //片选拉低temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);SET(CS); //片选拉高,开始传输数据for(i=0;i<24;i++){if(temp&0x80000000)SET(RW); //取出最高位,如果是1,那么RW就写1else RESET(RW); //如果是0 RW就写0SET(CLK);//向液晶写数据是在下降沿写入的Delay(2);//稍作延时RESET(CLK);//拉低产生下降沿,写入数据temp=temp<<1;//左移一位,写入下一位}RESET(CS); //拉低片选,写入数据完毕}void Display(uint8_t addr,uint8_t *hz){LCD_Write(CMD,addr);Delay(3);while(*hz!='\0'){LCD_Write(DA TE,*hz);hz++;Delay(3);}}void LCD_init()//液晶初始化{RESET(CS); //拉低片选RESET(PSB);//PSB拉低,表示是串行,拉高则是并行RESET(RST);//拉低RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);//8位数据传输Delay(40);LCD_Write(CMD,0x0c);//显示开,游标开Delay(40);LCD_Write(CMD,0x01);//清屏Delay(40);LCD_Write(CMD,0x06);//进入点设定AC+1Delay(40);}int main(){RCC_Configuration();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次LCD_IOinit_OUT();LCD_init();while(1){Display(Line1,"你妹");Display(Line2,"你妹");Display(Line3,"你妹妹");Display(Line4,"完事了,哈哈哈哈哈");}}void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);}void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/*temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);重点解释一下这里,从串行时序图中可以看出,发送一个指令需要三个字节,第一个是0xf8或者0xfa这个根据你要发送的是命令还是数据而定,然后发送下一个数据的高四位和第四位,但是数据都是在高四位上面,用51的话我们要分三次发送,但是32的话一个字节可以是32位的/所以我们一次就能完成,这也是为什么下面的i<24的原因因为最后的8位没有用,例如:我们发送指令0x35,则应该是这样0xf8然后0x30然后0x50,这个应该很好理解所以看一下上面的语句首先我们cmd的值应该为0xf8000000,这个宏定义有的,这是发送命令然后我们让cmd=temp;在把temp和后面的计算结果做按位或运算.首先看这个(uint32_t)(ddata&(uint8_t)0xf0)<<16)我们的ddtate是0x35他和0xf0按位与之后/变为0x30然后左移16位变成0x30 0000;再强制转换为32位,就把高位补零变为0x00 30 0000再看这句话(uint32_t)(ddata&(uint8_t)0x0f)<<12)我们的ddtate是0x35他和0x0f按位与/之后变为0x05,左移12位0x05 000 强制转换为32位高位补零0x000 05 000 /在和前面的相加就是0x00 30 0000+0x000 05 000=0x0030 5000然后在和前面的0xf8000000按位或变为0xf830 5000 液晶读这个数据的时候是八位八位的读取所以在液晶看来是分四次的0xf8 0x30 0x50 0x00显然后八位没用所以我们只取前面的24位//应该能看懂了把结合时序图还有延时一定要精确大家有看不懂的可以给我留言*/。

stm32f103zet6串行驱动12864

stm32f103zet6串行驱动12864

精心整理12864串行stm32f103zet6战舰V3学习版在资料最下面有工程文件,直接烧录就可以使用。

希望大家尊重我的劳动成果,下载下来。

每个语句注释,在工程文件中都有。

12864相关驱动在key.c和Key.h中经我验证,可以用stm32引脚控制12864如上图为12864串口时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA为数据传送方向控制:H表示数据从LCD到MCU,L表示数据从MCU到LCD B为数据类型选择:H表示数据是显示数据,L表示数据是控制指令C固定为0第二字节:(并行)8位数据的高4位—格式DDDD0000第三字节:(并行)8位数据的低4位—格式0000DDDD以上是说明书给的出的,个人理解从图上可以看出串行传输时需要用到CS,SCLK,SID三根信号线,但是由于CS是高电平有效,所以也可以把CS长接高电平,那样就只需要两根线就OK了,当然当使用12864串行模式时,PSB 引脚必须接低电平,复位RST引脚可以悬空不接,因为12864内部有上电复位电路。

所以电路图如下图所示一定要查资料,看下PSB引脚是否和VCC连接在一起,我在育松上买的QC12864B,液晶屏幕,太垃圾了,资料上都没有说明串行该怎么修改,结果调试时候发现,PSB引脚电平不对,后来一查,PSB引脚和VCC连接在一起了,所以一定要确保引脚电平正确。

串行数据传送共分三个字节完成:——理解就是传输一个字节需要三个字节来确定。

第一个字节:11111ABC11111000单片机写控制指令给LCD11111010单片机写数据给LCD第三个字节:00001111由于数据是传输是以一个字节8bits为单位,所以下面贴出传输一个字节的函数实现voidWrite_Bits(u8bits){u8i,Temp_Data;for(i=0;i<8;i++){Temp_Data=bits<<i;if((Temp_Data&0x80)==0){Reset_SID;Reset_SCLK;Set_SCLK;}else{Set_SID;Reset_SCLK;Set_SCLK;}}}Temp_Data = W_bits<<i ;//把数据依次左移对于这个语句有点迷茫,知道是左移,有点疑惑,赶紧去百度,木有找到我心中的疑问,就去翻C语言书(一本好的C语言书是多重要,我用的是CPrimerPlus),第500页,有这样一句话,该操作产生一个新的位置,但是不改变其运算对象。

12864汉字和图片的显示

12864汉字和图片的显示

12864汉字和图片的显示课程设计报告书设计题目:12864汉字和图片的显示课程名称:单片机快速入门系部:电子信息系专业:应用电子技术班级:电子0901姓名:组长:学号:成绩:2011年6月16日目录任务安排 (3)一、项目介绍 (3)1.1 设计内容 (3)1.2 设计要求 (3)1.3 系统主要功能 (4)二、硬件设计 (4)2.1 原理电路图 (4)2.2主要元件功能说明 (5)三、系统软件设计 (10)3.1 分析论证 (10)3.2 程序流程图 (12)3.3 源程序清单 (13)四、个人心得 (19)五、结束语 (20)六、参考文献 (21)七、12864汉字和图片的显示原理图 (21)任务安排一、项目介绍1.1 设计内容利用单片机和12864液晶显示屏通过按键功能实现汉字和图片的显示1.2 设计要求(1)在12864上第一次显示汉字“安徽财贸职业学院大学城翡翠路900/doc/dd174fd133d4b14e852468a7.ht ml ”(2)在12864上第二次显示汉字“单片机实训周6月11日星期六”(3)第三次显示图片:服装,帽子,鞋,皮包等(4)第四次显示汉字:“这就是我们小组的设计方案谢谢欣赏”1.3系统主要功能:12864LCD指令系统及时序该类液晶显示模块(表1-1)控制信号控制代码指令名称R/W RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 显示开关0 0 0 0 1 1 1 1 1 1/0 起始行设置0 0 1 1 X X X X X X 页设置0 0 1 0 1 1 1 X X X 列地址设置0 0 0 1 X X X X X X 读状态 1 0 BUSY 0 ON/OFF RST 0 0 0 0 写数据0 1 写数据读数据 1 1 读数据二、硬件设计2.1 原理电路图12864显示屏(图2-1a)独立按键原理图(图2-1b)2.2主要元件功能说明1)12864显示屏内部功能器件及相关功能如下指令寄存器(IR): IR是用于寄存指令码,与数据寄存器数据相对应。

stm32_12864液晶_菜单设计

stm32_12864液晶_菜单设计
u8 MlVal;//模量数值
//菜单与AD结果显示变量,0为AD,1为菜单
u8 MenuDis;
//复位前指数
u16 BaseAD[4];
//横截面积
u16 mianji;
//横截直径
u16 zhijing;
//模量
u16 moliang;
//按键返回值
u8 keyval;
uint8_t* title1="单位:MM";
#include "AdcDisplay.h"
#include "key.h"
#include "spi_tm7705.h"
#include "eeprom.h"
typedef struct menu//定义一个菜单
{
u8 range_from,range_to; //当前显示的项开始及结束序号
u8 itemCount;//项目总数
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
}
void Unitch3(void)
{
UnitCh=2;
LCD_Init();
currentMenu = currentMenu->parent;
currentMenu->selected=0;
u8 selected;//当前选择项
u8 *menuItems[17];//菜单项目
struct menu **subMenus;//子菜单
struct menu *parent;//上级菜单,如果是顶级则为null

12864显示文字+图像

12864显示文字+图像

引用12864液晶原理分析3他山之石2010-07-21 20:52:05 阅读7 评论0 字号:大中小小峰的12864液晶原理分析3一、ST7920控制IC的LCD12864实现反白显示从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。

但是ST7920 控制器的128×64 点阵液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接第二行。

所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,第三行必然也反白显示;第二行反白,第四行也必然反白。

其实还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。

其理论支持在于:在ST7920中,字符显示的DDRAM和图形的GDRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。

具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。

假如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。

所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图!这样一来可以实现任何地方、任意大小的反白显示,反而比原指令中的单行反白的功能更好更强大。

二、对于整屏既有图象又有文本,则可以用两种方式实现:1、首先文本DDRAM写入要写的字符,其余全部空格(即0X00),然后再在没有字符的地方(即非点亮的晶格中,0X00)绘入图象。

DDRAM与GDRAM异或后就可以整屏实现图象与文本。

参见程序实例1。

带字库12864液晶详解

带字库12864液晶详解

12864液晶一、概述带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

基本特性:l 低电源电压(VDD:+3.0--+5.5V)l 显示分辨率:128×64点l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)l 内置128个16×8点阵字符l 2MHZ时钟频率l 显示方式:STN、半透、正显l 驱动方式:1/32DUTY,1/5BIASl 视角方向:6点l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10l 通讯方式:串行、并口可选l 内置DC-DC转换电路,无需外加负压l 无需片选信号,简化软件设计l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC 3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5R/W(SID)H/L R/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6E(SCLK)H/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)16NC-空脚17/RESET H/L复位端,低电平有效(见注释2)18VOUT-LCD驱动电压输出端19A VDD背光源正端(+5V)(见注释3)20K VSS背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。

12864液晶显示资料及程序

12864液晶显示资料及程序

12864液晶显示资料及程序硬件连接方式是:并口直接访问。

这是汉字显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[]={" 浙江大学" //第一行,第一页"04级通信工程一班" //第三行" 宁波理工学院" //第二行" 竞赛小组" //第四行"128X64液晶显示器" //第一行,第二页" 测试程序" //第三行" 07年07月25日" //第二行" Tornado "}; //第四行void set12864();void write_command(uchar command);void write_page(uchar data_add);void read_page(uchar data_add);void delays(uchar cont);void main(){while(1){set12864(); //初始化12864write_page(0); //写入一页数据read_page(0x30); //读出一页数据到内部RAMdelays(2); //延时2swrite_page(64); //写入下一页数据delays(2); //延时2s}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//写控制命令子程序void write_command(uchar command){bit flag=1; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}//写一页子程序void write_page(uchar data_add){bit flag=1; //12864空闲标志位uchar num=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//读一页子程序void read_page(uchar data_add){bit flag=1; //12864空闲标志位uchar num=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据}}//延时cont秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}这是图象显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[] = // 数据表{0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ,0x00,0x00,0x00,0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00 ,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00 ,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00 ,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00 ,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00 ,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x0 0,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x8 0,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0 3,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0 0,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8 0,0x00,0x0B,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8 0,0x00,0x00,0x1F,0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC 0,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xF3,0x79,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC 0,0x00,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xE6,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE 1,0x60,0x00,0x68,0x01,0xFF,0xFF,0xFE,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1 ,0x00,0x00,0x0E,0x01,0xFF,0xFF,0xF8,0x00,0x4B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0 ,0x8E,0x08,0x79,0x07,0xFF,0xFF,0xF0,0x00,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6 ,0xC0,0x07,0x61,0xC3,0xFF,0xFE,0xC0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xED,0xEF,0x3F,0x83,0xFF,0xFE,0x60,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xC0,0xFF,0xFD,0xFC,0x6C,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xF0,0x7F,0xF3,0xFF,0xFE,0x60,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0x50,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xC9,0xFB,0xFF,0xF1,0xF8,0x8C,0xD8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFB,0x6F,0xD9,0xC2,0x3F,0xF8,0x40,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6 ,0xDF,0x1E,0xFF,0xFF,0x7F,0xFC,0x38,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x64 ,0x2F,0x6F,0xFF,0xFD,0x7B,0xFC,0x1F,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x5 F,0x7C,0xEE,0xFF,0xC7,0xFF,0xBC,0x0F,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xD F,0xFE,0xEF,0xFF,0xFF,0xE7,0xDC,0x07,0xE7,0xF8,0x12,0x7F,0xFF,0xFF,0xFF,0xFF,0x4 7,0xFF,0xFF,0xFF,0xFF,0xE7,0x80,0x03,0xF4,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0xFE,0xE30xFF,0xFE,0xC0,0x01,0xC0,0x00,0x00,0x1B,0xFF,0xFF,0xFB,0xFF,0xF F,0xFF,0xFF,0xFF,0x7F,0xEE,0xC0,0x00,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFE,0x98,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xEF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x20,0x0E,0x60,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x8F,0xFF,0xFF, 0xFF,0xFF,0xFF,0x05,0x80,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFD,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x09,0x80,0xA0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0xFF, 0xFF,0xFF,0xFF,0x85,0x2A,0xC0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFB,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0xBF,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF7,0xFF,0xFF,0xFF, 0xFF,0xFF,0xF8,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0xFF,0xFF,0xFF, 0xFF,0xFF,0x00,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0xFF,0xFF,0xFF, 0xFF,0xC0,0x1F,0xFF,0xFF,0x80,0x00,0x40,0x00,0x00,0x00,0xFF,0x80,0xFF,0xFF,0xFF, 0x80,0x07,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0x00,0x01,0xFF,0x01,0xFF,0xFF,0xF8 ,0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0x63,0x80,0x00,0x00,0x01,0xFE,0x01,0xFF,0x18,0x00, 0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x01,0xCC,0x01,0xFE,0x00,0x07, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xA0,0x03,0xFC,0x00,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x05,0xC0,0x03,0xC8,0x00,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x88,0x0C,0x07, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0, 0x7F,0xFF,0xFF,0xFF,0xFF,0xF8,0x07,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0 x0F,0xFF,0xFE,0xFF,0xFF,0xD0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F, 0x03,0xFF,0xF8,0xFF,0xFC,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x3F,0xFF,0xC0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,00xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0 x00,0x1F,0xFE,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0 x00,0x0F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x78,0x00,0x00,0x00,0x00,0 x00,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00, 0x00,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00, 0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0 x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x27,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x01};void set12864();void setxy(uchar x,uchar y);void write_command(uchar command);void write_16byte(uint data_add);void delays(uchar count);void main(){uchar x,y,i;while(1){y="0x80"; //设置液晶上半部分坐标x="0x80";delays(2); //延时2sset12864(); //初始化12864delays(2);for(i=0;i<32;i++) //写入液晶上半图象部分{ //写入坐标setxy(x,y);write_16byte(i*16); //连续写入16字节数据y++; //y轴地址加1}y="0x80"; //设置液晶下半部分坐标x="0x88";for(i=0;i<32;i++) //写入液晶下半图象部分{setxy(x,y); //写入坐标write_16byte((32+i)*16);//连续写入16字节数据y++; //y轴地址加1}write_command(0x34); //写入扩充指令命令write_command(0x36); //显示图象}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//设置绘图坐标void setxy(uchar x,uchar y){write_command(0x34); //写入扩充指令命令write_command(y); //写入y轴坐标write_command(x); //写入x轴坐标write_command(0x30); //写入基本指令命令}//写控制命令子程序void write_command(uchar command){bit flag="1"; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}void write_16byte(uint data_add){bit flag="1"; //12864空闲标志位uchar num="16"; //16个循环,连续写入16个字节for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//延时count秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}圣斗士之家2009-07-28 23:13:30#include#include#define uchar unsigned char#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100; //读忙通道uchar code disp_data[]={" 浙江大学 " //第一行,第一页"04级通信工程一班" //第三行" 宁波理工学院 " //第二行" 竞赛小组 " //第四行"128X64液晶显示器" //第一行,第二页" 测试程序 " //第三行" 07年07月25日 " //第二行&nbsp; " Tornado "}; //第四行void set12864();void write_command(uchar command);void write_page(uchar data_add);void read_page(uchar data_add);void delays(uchar cont);void main(){while(1){set12864(); //初始化12864write_page(0); &nbsp; //写入一页数据read_page(0x30); //读出一页数据到内部RAMdelays(2); //延时2swrite_page(64); //写入下一页数据delays(2); //延时2s}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//写控制命令子程序void write_command(uchar command){bit flag="1"; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}//写一页子程序void write_page(uchar data_add){bit flag="1"; //12864空闲标志位uchar num="64"; //64个循环,连续写入32个汉字或是64个西文字符 write_command(0x80);for(;num>0;num--){while(flag)//检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//读一页子程序void read_page(uchar data_add){bit flag="1"; //12864空闲标志位uchar num="64"; //64个循环,连续写入32个汉字或是64个西文字符 write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据}}//延时cont秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}这是图象显示程序:#include#include#define uchar unsigned char#define uint unsigned int#define datawr 0x1200 //写数据通道#define comwr 0x1000&nbsp; //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[] = // 数据表{0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00, 0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00, 0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00, 0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x80,0x00,0x00, 0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xF F,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x07,0xF F,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x0 B,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00, 0x1F,0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x0 0,0x00,&nb14#inc lude <stdio.h>#inc lude <conio.h>int main(void){int c;int a;a = getchar();printf ("%c",a);/* Note that getc har reads from stdin andis line buffered; this means it w illnot return until you press ENTER. */while ((c = getc har()) != '\n'){printf("%c", c);}return 0;}注:可以利用getchar()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面,用法:在主函数结尾,return 0;之前加上getchar();即可getchar 的用途是从从标准输入流读取一个字符,读回车符时退出getchar();永远只向缓存中输入一个字符,getchar();的用法很多;一种就是清空回车符这种情况一般发生在在循环中涉及到输入的情况还有一种是某些编译平台(IDE)在运行程序时并没有在程序运行后给人看结果的时间这时候在程序最后加上getchar()就能造成程序的暂停给程序员度结果的机会用getchar时,在键盘上按一个字符后,要按回车才能读取进去;用getch时,在键盘上按一个字符马上就被读取进去,不用按回车,因此可以作为“按任意键继续”的执行语句。

12864串行驱动

12864串行驱动

/*-------------------------------------------------------------------------------------
* 功能:
向 LCD12864 写入 1Byte 数据
--------------------------------------------------------------------------------------*/
由于串行操作12864无法读取内部ram所以画图操作在单片机内部开辟1664字节ram充当缓存经测试整屏刷新速度大于5接线方法
STM32 单片机 12864 串行驱动
说明:测试单片机型号 STM32F103C8T6,由于单片机 IO 资源不充分, 故采用串行驱动 12864。由于串行操作 12864 无法读取内部 RAM,所 以画图操作在单片机内部开辟 16*64 字节 RAM 充当缓存,经测试整 屏刷新速度大于 5 次/s。 接线方法: PSB 接地
* 说明:
LCD12864 PSB(15 脚)需接低电平,RS(4 脚)需接高电平
* 文件调用: 需调用 Delay_us()、Delay_ms()
--------------------------------------------------------------------------------------*/
extern unsigned char PicBuff[16*64];
void LCD12864_ClearPicBuff(unsigned char *Buff); void LCD12864_DisPlayFont(sFont *font, unsigned char x, unsigned char y, unsigned char len, unsigned char *pData); void LCD12864_DisPlayPic(unsigned char *Buff,PicStruct *Pic,unsigned char x,unsigned char y); void LCD12864_DrawCircle(unsigned char *Buff,unsigned char x0,unsigned char y0,unsigned char r); void LCD12864_DrawPoint(unsigned char *Buff, unsigned char x, unsigned char y, unsigned char color); void LCD12864_Line_X(unsigned char *Buff,unsigned char X0,unsigned char X1,unsigned char

学习笔记:12864液晶模块的详细使用

学习笔记:12864液晶模块的详细使用

学习笔记:12864液晶模块的详细使用备注:这篇文章是对12864操作的具体介绍,仅限刚接触12864的新手,大神请拍砖,文章写的较散,建议先参考12864手册及控制驱动器ST7920英文手册有个初步理解之后再阅读该篇文章,将会有更深的认识。

强烈建议阅读ST7920英文手册,细节内容里面有详细介绍,中文的12864也是从中译过来的。

本文分三个步骤介绍12864的内部资源原理,指令集详细讲解,以及应用例子。

对12864的所有操作概括起来有4种:1)、读忙状态(同时读出指针地址内容),初始化之后每次对12864的读写均要进行忙检测。

2)、写命令:所有的命令可以查看指令表,后续讲解指令的详细用法。

写地址也是写指令。

3)、写数据:操作对象有DDRAM、CGRAM、GDRAM。

4)、读数据:操作对象也是DDRAM、CGRAM、GDRAM。

对12864的学习首相要了解其内部资源,知道了它里面有哪些东西,你就可以更加方便的使用它。

先介绍几个英文的名字:DDRAM:(Data Display Ram),数据显示RAM,往里面写啥,屏幕就会显示啥。

CGROM:(Character Generation ROM),字符发生ROM。

里面存储了中文汉字的字模,也称作中文字库,编码方式有GB2312(中文简体)和BIG5(中文繁体)。

笔者使用的是育松电子的QC12864B,讲解以此为例。

CGRAM:(Character Generation RAM),字符发生RAM,,12864内部提供了64×2B的CGRAM,可用于用户自定义4个16×16字符,每个字符占用32个字节。

GDRAM:(Graphic Display RAM):图形显示RAM,这一块区域用于绘图,往里面写啥,屏幕就会显示啥,它与DDRAM的区别在于,往DDRAM中写的数据是字符的编码,字符的显示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中写的数据时图形的点阵信息,每个点用1bit来保存其显示与否。

12864反白

12864反白

12864任意行,列进行反白12864指令上只能对一三行或二四行反白,不能做到任意反白。

利用任意画点可以达到任意地方反白。

下面给出部分程序://读ram,必须有这个函数uchar read_byte(){uchar byte;while(test_busy());rs=1;rw=1;en=1;byte=dport;en=0;return byte;}/******************************************************************** ********///画点void drawpoint(uchar wx,uchar wy,uchar sel){uchar xh,xl;//分离所写地址uchar xadds,yadds;//x轴,y轴地址uchar data_h,data_l;//所读区域数据高低8位xh=wx>>4;//定位地址xl=wx&0x0f;//定位所在地址的具体位if(wy<32)//确定x,y所在地址{yadds=wy;xadds=xh;}//上半部分else{xadds=xh+8;yadds=wy-32;}//下半部分write_byte(com,0x34);// 关闭绘图功能write_byte(com,(yadds+0x80));//写读地址write_byte(com,(xadds+0x80));write_byte(com,0x30);read_byte();//此指令必须,进入读数据data_h=read_byte();//读出所在地址数据高8位data_l=read_byte();//读出所在地址数据低8位write_byte(com,0x34);write_byte(com,(yadds+0x80));write_byte(com,(xadds+0x80));if(xl<8)//数据处于高8位{switch(sel){case 0 : data_h&=(~(1<<(7-xlow))); break;//清除case 1 : data_h|=(1<<(7-xlow)); break;//写1default : break;}}else//数据处于低8位{switch(sel){case 0 : data_l&=(~(1<<(15-xlow))); break;case 1 : data_l|=(1<<(15-xlow)); break;default : break;}}write_byte(com,0x30);write_byte(dat,data_h);//数据写入write_byte(dat,data_l);write_byte(com,0x36);}/******************************************************************** ********/上面为任意画点,下面是反白举例:可以先在任一行写四个字,然后就可以达到反白作用/******************************************************************** ***/for(i=0;i<64;i++)//改变i,j可以任意反白{for(j=0;j<16;j++)drawpoint(i,j,1); /* 任意反白*/}delay_ms(500);//延时函数for(i=0;i<64;i++){for(j=0;j<16;j++)drawpoint(i,j,0);}/******************************************************************** *****/。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void LCD_Write_String(u8 X,u8 Y,uint8_t* s);
void LCD_Write_value(u8 X,u8 Y,u16 value,u8 zhenfu);
void LCD_Write_Single_Num(u8 X,u8 Y,u16 value);
void LCD_Write_Tri_Value(u8 X,u8 Y,u16 value);
void LCD_Init(void);
void Write_Char(u8 start, u8 ddata);
void Send_Byte(u8 bbyte);
void Clr_Scr(void);
//void White_Line(u8 line);
void WhiteLineInit(void);
void White_Line(u8 X,u8 Y,u8 width);
void Shut_White_Line(u8 X,u8 Y,u8 width);
void LCD_Set_XY(u8 X, u8 Y);
void LCD_Write_Char(u8 X,u8 Y,uint8_t c);
/* \u63A7\u5236\u7BA1\u811A\u7535\u5E73 */
#define SCL_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_6)
#define SCL_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_6)
#define dat 1
void Delay_Lcd(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
/*******************************************************************************
Send_Byte(start_data); //发送起始信号
Delay_us(50); //延时是必须的
Send_Byte(Hdata); //发送高四位
Delay_us(50); //延时是必须的
Send_Byte(Ldata); //发送低四位
SCL_LOW;
bbyte <<= 1; //左移1位
}
}
/******************************************************************************************
* 函数名称 :Clr_Scr
* 功能描述 :行反白函数
* 参数 :u8 行号 0-3
* 从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。但是ST7920 控制器的128×64 点阵
* 液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接
初始化12864的接口
*******************************************************************************/
void LCD_Config(void)
{
GPIO_InitTypeDef GPIOB_InitStructure;
Delay_us(200);
Write_Char(0,0x0c); //显示打开,光标关,反白关
Delay_us(200);
Write_Char(0,0x01); //清屏,将DDRAM的地址计数器归零
Delay_ms(300);
}
/******************************************************************************************
/**********12864.h************************/
#ifndef __12864_H
#define __12864_H
#include "stm32f10x.h"
#include "SysTick.h"
#include <stdlib.h>
//#include <malloc.h>
* 示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。
*
* 所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地
* 方的绘图!这样一来可以实现任何地方、任意大小的反白显示
DDRAM 8*16 字节的空间
Line1 80H 81H 82H 83H 84H 85H 86H 87H
/* 配置外设时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/*!< Configure SCL & SDA */
GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
/******************** ********************
* 文件名 :12864.c
* 描述 :12864液晶底层应用函数库
Байду номын сангаас * 实验平台:
* 硬件连接 ----------------------------
*
* 第二行。所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,
* 第三行必然也反白显示;第二行反白,第四行也必然反白。
*
* 其实我们还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。其理论支持在于:在ST7920
* 中,字符显示的CGRAM和图形的GGRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。
*
* 具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的
* 结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。假
* 如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显
#define SDA_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define SDA_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_7)
void Delay_Lcd(vu32 nCount);
void LCD_Config(void);
* 第三个8位是数据的低4位,为DDDD0000
*
******************************************************************************************/
void Write_Char(u8 start, u8 ddata)
Write_Char(0,0x01);
Delay_us(50);
}
/******************************************************************************************
* 函数名称 :White_Line
* 函数名称 :Write_char
* 功能描述 :写指令或数据
* 参数 : start 控制RS/RW;ddata数据 0为写指令,1为写数据
* 12864的串行通讯模式下,每一次操作都要RS/RW的状态,即第一个8位为11111RWRS0
* 第二个8位是数据的高4位,为DDDD0000
for(i=0;i<8;i++)
{
if((bbyte)&0x80)
SDA_HIGH; //取出最高位
else
SDA_LOW;
SCL_HIGH;
t = 0x10;
while(t--); //延时 lcd读取数据
#include "12864.h"
u8 const num_lcd[]={"0123456789 :.-"};//用于输出数字符号
//用于绘图
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
Delay_us(50); //延时是必须的
}
/******************************************************************************************
* 函数名称 :Send_byte
* 功能描述 :发送一个字节
void Display_Img(u8 const *img);
#endif /* __12864_H */
/**********12864.h************************/
/***************12864.c************************/
* PB6--SCL
* PB7--SDA
* ----------------------------
相关文档
最新文档