内容发布更新时间 : 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
#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)