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

📄 lcd.c

📁 【液晶显示器的C语言程序设计 Freescale 8位微控制器】一书的光盘
💻 C
字号:
//深圳瑞特RT12864M(控制器ST7920A)
//并行连接方式,PTC0-RS,PTC1-RW,PTC2-E
#include "gp32.h"
typedef unsigned int Uint;
typedef unsigned char Uchar;

#define cli() _asm("cli\n") /*开中断*/
#define sei() _asm("sei\n") /*关中断*/

//定义位操作的结构体
typedef struct bits {
	Uchar b0:1;
	Uchar b1:1;
	Uchar b2:1;
	Uchar b3:1;
	Uchar b4:1;
	Uchar b5:1;
	Uchar b6:1;
	Uchar b7:1;
	}BITS;

typedef union bit_char {
	Uchar byte;
	BITS b;
	} BIT_CHAR;

#define BSET(x, y)  ((x).b.b ## y = 1)
#define BCLR(x, y)  ((x).b.b ## y = 0)

@tiny volatile BIT_CHAR PTC @0x02;  //重新定义PTC口,使其能进行位操作

extern void menu(void);

const Uchar delay=40;  //延时时间常数
//延迟1 ms
static void Wait1ms(void) {
  Uchar cnt=0;
  while (cnt<delay) cnt++;
}
//延迟n ms 
void WaitNms(int n){
    Uchar i;
    for(i=1;i<=n;i++)
   		Wait1ms();
}

//读忙标志
void RDBF(void){
	Uchar temp; 
	DDRB=0x00;      //数据线为输入
	DDRC=0x0F;      //控制线为输出
	BCLR(PTC,2);	// E=0
	BSET(PTC,1);	// RW=1
	BCLR(PTC,0);	// RS=0
	while(1){
		BSET(PTC,2);	// E=1 
		temp=PTB;
		BCLR(PTC,2);	// E=0
		if ((temp&0x80)==0) break;
	}	
}
//写数据到指令寄存器
void WRCommand(Uchar comm){
	RDBF();
	DDRB=0xff;
	BCLR(PTC,2);	// E=0
	BCLR(PTC,1);	// RW=0
	BCLR(PTC,0);	// RS=0
	BSET(PTC,2);	// E=1 
	PTB=comm;
	BCLR(PTC,2);	// E=0	
}
//写数据到数据寄存器
void WRData(Uchar data){
	RDBF();
	DDRB=0xff;
	BCLR(PTC,2);	// E=0
	BCLR(PTC,1);	// RW=0
	BSET(PTC,0);	// RS=1
	BSET(PTC,2);	// E=1 
	PTB=data;
	BCLR(PTC,2);	// E=0
}
//初始化LCD-8位接口
void LCDInit(void){	
	WRCommand(0x30);	//基本指令集,8位并行
	WaitNms(10);		//等待时间>37us
	WRCommand(0x06);	//启始点设定:光标右移
	WaitNms(10);		//等待时间>100us
	WRCommand(0x01);	//清除显示DDRAM
	WaitNms(20);		//等待时间>10ms
	WRCommand(0x0C);	//显示状态开关:整体显示开,光标显示关,光标显示反白关
	WaitNms(10);		//等待时间>100us
	WRCommand(0x02);	//地址归零	
}
//显示英文字符串(显示半宽字型16*8点阵)
void ShowEnglish(Uchar addr,Uchar *english,Uchar count){	
	Uchar i;
	WaitNms(1);
	WRCommand(addr);	//设定DDRAM地址
	for(i=0;i<count;i++)
		WRData(english[i]);
}
//显示汉字串(16*16点阵)
void ShowChinese(Uchar addr,Uchar chinese[],Uchar count){
	Uchar i;
	WRCommand(addr);	//设定DDRAM地址
	for(i=0;i<count;i++){
		WRData(chinese[2*i]);
		WRData(chinese[2*i+1]);
	}		
}
//PLL初始化
void PLLInit(void){
	PCTL=0;				//关闭PLL,准备进行设置
    	PBWC=0x80;			//自动带宽模式
   	PCTL=1;				//R=1
    	PMSH=1;    			
   	PMSL=0x2c;			//N=012c
    	PMRS=0x80;			//L=80
    	PCTL=0x22;			//E=2,PLLON=1,启动PLL
    	while(!(PBWC&0x40));		//等待稳定输出
   	PCTL|=0x10;			//频率锁定,选PLL作为时钟源
}
/* 系统集成模块(SIM)初始化,禁止COP(看门狗)*/
void SIMInit(void) {
	CONFIG2=0x01; /* 内部总线时钟用作SCI的时钟*/
	CONFIG1=0x3d; /* 允许LVE复位信号,禁止LVI的电源,LVI工作在5V,*/
                  /* 经过32个CGMXCLK周期退出STOP模式,禁止COP模块 */ 
}
//主函数
void main(void){
	sei();      //关中断
	SIMInit();  //SIM初始化
	PLLInit();  //PLL初始化
		
	DDRC=0x0F;
	PTCPUE=0xFF;	//上拉电阻允许,PTC3-PTC0为高电平,即PSB=1,E=1,RW=1,RS=1
		
	menu();    //主菜单显示
	KeyInit(); //键盘中断初始化
	cli();     //开中断
	for(;;);   //等待键盘中断,并进行处理
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -