12864并行显示中文讲解 下载本文

内容发布更新时间 : 2024/12/27 16:57:28星期一 下面是文章的全部内容请认真阅读。

以下是我写的12864LCD并行口显示程序,矩阵键盘接的是P1口,P0口接LCD上DB0~ DB7。

/***************头文件******************************/ #define _12864_h

/*****包含头文件**************/

#include

/********定义I/0口**********/ #define LCD12864_DATA P0 #define GPIO_KEY P1 sbit LCD12864_E = P2^7; sbit LCD12864_RW = P2^5; sbit LCD12864_RS = P2^6; sbit LCD12864_RET= P2^0; sbit LCD12864_PSB =P2^2;

/*声明全局变量*/

extern unsigned char keyvalue; /******声明全局函数*********/

void Delay1ms(unsigned int); //声明延时函数 unsigned char KeyDown(void);

void BusyChk_12864(void); //声明忙检测函数 void WrCom(unsigned char); //声明写入命令函数 //unsigned char ReDat(void); //声明读数据函数 void WrDat(unsigned char); //声明写数据函数 void LcdInit(void); //12864初始化函数

void SetAddress(unsigned char ,unsigned char); //设置地址转换

void DisplayString(unsigned char ,unsigned char,unsigned char *p);//行显示字符 #endif

//***************************12864.c文件*****************************// #include\#include #include\

#define LCM_ST7920_FIRST_LINE_ADDRESS 0x80 #define LCM_ST7920_SECOND_LINE_ADDRESS 0x90 #define LCM_ST7920_THIRD_LINE_ADDRESS 0x88 #define LCM_ST7920_FOURTH_LINE_ADDRESS 0x98

/*定义全局变量*/

unsigned char keyvalue=0;

/*******************************************************************************

* 函 数 名 : Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 e : 无

* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。

*******************************************************************************/

void Delay1ms(unsigned int i) //误差 0us {

unsigned char a; for (i; i>0; i--) { for (a=199;a>0;a--) ; } }

/*******************************************************************************

* 函 数 名 : KeyDown() * 函数功能 : 按键 * 输 入 : key

* 输 出 e : keyvalue

* 说 名 : P1口接矩阵按键

*******************************************************************************/

unsigned char KeyDown(void) {

GPIO_KEY=0xf0; if(GPIO_KEY!=0xf0) { switch(GPIO_KEY) { case 0xe0: keyvalue=1;break; case 0xd0: keyvalue=2;break; case 0xb0: keyvalue=3;break; case 0x70: keyvalue=4;break; } GPIO_KEY=0x0f;

switch(GPIO_KEY) { case 0x0e: keyvalue=keyvalue;break; case 0x0d: keyvalue+=4;break; case 0x0b: keyvalue+=8;break; case 0x07: keyvalue+=12;break; } while(GPIO_KEY!=0x0f) { Delay1ms(10); } }

return keyvalue; }

/**************************************************************************** 函数名字:void BusyChk() 函数功能:12864LCD忙检测 * 输 入 : 无 * 输 出 : 无

*******************************************************************************/

void BusyChk(void) {

unsigned int timeout=0;

LCD12864_E=0; //E=0 使能关闭 LCD12864_RS=0; //0 指令;1 数据

LCD12864_RW=1; //1 读数据;0写数据 Delay1ms(50); //延时100ms

LCD12864_E=1; //1 开使能,读数据

while(((LCD12864_DATA & 0x80) && ++timeout));//判断 1表示内部在工作; 0表示正常

LCD12864_E=0; //E=0 使能关闭 }

/**************************************************************************** 函数名字:void WrDat(usnigned char data) 函数功能:写入数据

* 输 入 : data * 输 出 : 无

*******************************************************************************/

void WrDat(unsigned char bTemp)