一个用keil 51c实现的单片机系统程序

源代码在线查看: 12864.c

软件大小: 42 K
上传用户: wang8310733
关键词: keil 51c 单片机系统 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*------------------------------------------------------------------------------------------
				[文件名] 12864.c
				[功能] 128X64驱动程序
				===========================================================================================*/
				
				#include "12864.h"
				#include "ASCII816.h"
				
				
				/*----------------------------------------------------------------------------------------------------*/
				/* ****函数列表****
				
				//开关显示
				void SetOnOff(unsigned char onoff)
				
				//选择屏幕
				//screen: 0-全屏,1-左屏,2-右
				void SelectScreen(unsigned char screen)
				
				//清屏
				//screen: 0-全屏,1-左屏,2-右
				void ClearScreen(unsigned char screen)
				
				//显示8*8点阵
				//旋转90度:字模被竖着切分
				//lin:行(0-7), column: 列(0-15)
				//address : 字模区首地址
				void Show88(unsigned char lin,unsigned char column,unsigned int address)
				
				//显示8*16字符
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				//character:字符代码(标准ASCII码)
				void ShowChar(unsigned char lin,unsigned char column,unsigned char character)
				
				//显示8*16字符串
				//!!!只能显示在一行上即: 串长+column 				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				//address : 字模区首地址
				void ShowString(unsigned char lin,unsigned char column, unsigned char *string)
				
				//显示一个汉字
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				//hzcode: 汉字代码(自定义的)
				void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
				
				//显示图片
				//旋转90度 :字模被竖着切分
				//startline :开始行
				//startcolumn:开始列
				//linechar :图片行点除8(图片以8*8点阵为单位)
				//columnchar :图片列点除8(图片以8*8点阵为单位)
				//address : 字模区首地址
				void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
				//!!问题大户
				//显示一行汉字
				//lin:行
				//lineheadaddr: 此行汉字代码区首地址
				void ShowLine(unsigned char lin,unsigned int lineheadaddr)
				
				//显示一屏汉字
				//pageheadaddr:此屏汉字代码地址区首地址
				void ShowPage(unsigned int pageheadaddr)
				
				//反显一个8*8字块
				//lin:行(0-3), column: 列(0-7)
				void ReverseShow88(unsigned char lin,unsigned char column)
				
				
				//反显一个字符
				//lin:行(0-4), column: 列(0-15)
				void ReverseShowChar(unsigned char lin,unsigned char column)
				
				
				//反显一个汉字
				//lin:行(0-3), column: 列(0-7)
				ReverseShowHZ(unsigned char lin,unsigned char column)
				
				//反显一行汉字
				//lin:行
				ReverseShow(unsigned char lin)
				
				//初始化LCD
				void InitLCD()
				
				****函数列表结束**** */
				/*----------------------------------------------------------------------------------------------------*/
				/*--基本函数源程序------------------------------------------------------------------------------------*/
				//延时
				void LCDdelay()
				{
				unsigned int i=500;
				while(i--) {;}
				}
				/*----------------------------------------------------------------------------------------------------*/
				//状态检查
				void CheckState()
				{
				unsigned char dat;
				di=0;
				rw=1;
				do{
				LCD12864DataPort=0xff;
				en=1; dat=LCD12864DataPort; en=0;
				dat=0x90 & dat; //仅当第4,7位为0时才可操作
				}while(!(dat==0x00));
				}
				/*----------------------------------------------------------------------------------------------------*/
				//写显示数据
				//dat:显示数据
				void WriteByte(unsigned char dat)
				{
				CheckState();
				di=1; rw=0;
				LCD12864DataPort=dat;
				en=1; en=0;
				}
				/*-----------------------------------------------------------------------------------------------------*/
				//向LCD发送命令,主要被以下几个函数调用
				//command :命令
				SendCommandToLCD(unsigned char command)
				{
				CheckState();
				rw=0;
				LCD12864DataPort=command;
				en=1; en=0;
				}
				/*----------------------------------------------------------------------------------------------------*/
				//设定行地址(页)--X 0-7
				void SetLine(unsigned char line)
				{
				line=line & 0x07; // 0				line=line|0xb8; //1011 1xxx
				SendCommandToLCD(line);
				}
				//设定列地址--Y 0-63
				void SetColumn(unsigned char column)
				{
				column=column &0x3f; // 0=				column=column | 0x40; //01xx xxxx
				SendCommandToLCD(column);
				}
				//设定显示开始行--XX
				void SetStartLine(unsigned char startline) //0--63
				{
				startline=startline & 0x07;
				startline=startline|0xc0; //1100 0000
				SendCommandToLCD(startline);
				}
				//开关显示,1为开, 0为关。
				void SetOnOff(unsigned char onoff)
				{
				onoff=0x3e | onoff; //0011 111x
				SendCommandToLCD(onoff);
				}
				/*---------------------------------------------------------------------------------------------------*/
				//选择屏幕
				//screen: 0-全屏,1-右屏,2-左屏
				void SelectScreen(unsigned char screen)
				{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
				switch(screen)
				{ case 0: cs1=0;//全屏
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				cs2=0;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				break;
				case 1: cs1=1;//左屏
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				cs2=0;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				break;
				case 2: cs1=0;//右屏
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				cs2=1;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				break;
				}
				}
				/*---------------------------------------------------------------------------------------------------*/
				//清屏
				//screen: 0-全屏,1-左屏,2-右
				void ClearScreen(unsigned char screen)
				{ unsigned char i,j;
				SelectScreen(screen);
				for(i=0;i				{ SetLine(i);
				for(j=0;j				{
				WriteByte(0x00);
				}
				}
				}
				/*--------------------------------------------------------------------------------------------------*/
				//显示8*8点阵
				//旋转90度:字模被竖着切分
				//lin:行(0-7), column: 列(0-15)
				//address : 字模区首地址
				void Show88(unsigned char lin,unsigned char column,unsigned int address)
				{ unsigned char i;
				if(column>16) {return;}
				if(column				else {
				SelectScreen(1); //否则 (8,9,10,11,12,13,14,15)写在第一屏上
				column=column & 0x07; //防止越界
				}
				SetLine(lin);
				SetColumn(column				for(i=0;i				}
				/*--------------------------------------------------------------------------------------------------*/
				//显示8*6点阵
				//旋转90度:字模被竖着切分
				//lin:行(0-7), column: 列(0-15)
				//address : 字模区首地址
				void Show86(unsigned char lin,unsigned char column,unsigned int address)
				{ unsigned char i;
				if(column>16) {return;}
				if(column				else {
				SelectScreen(1); //否则 (8,9,10,11,12,13,14,15)写在第一屏上
				column=column & 0x07; //防止越界
				}
				SetLine(lin);
				SetColumn(column*6);//column*8
				for(i=0;i				}
				/*------------------------------------------------------------------------------------------------*/
				//显示8*16字符
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				//character:字符代码(标准ASCII码)
				void ShowChar(unsigned char lin,unsigned char column,unsigned char character)
				{ lin=lin				Show88(lin ,column,character );
				Show88(lin+1,column,character+8 );//页地址选择。
				} 
				//显示0~99数字,主要是为进位考虑的
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				void ShowNum(unsigned char lin,unsigned char column,unsigned char num)
				{ unsigned char tmp;
				  if((num&0x0f)>9)
				  num=num+6;
				  tmp=(num>>4)&0x0f; 
				  ShowChar(lin,column,tmp*16);//高位
				  tmp=num&0x0f;  
				  ShowChar(lin,column+1,tmp*16);//低位
				} 
				//显示0~99数字,输入为正经的十六进制数字
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				void ShowNum2(unsigned char lin,unsigned char column,unsigned char num)
				{ unsigned char tmp;
				  tmp=num/10; 
				  ShowChar(lin,column,tmp*16);//高位
				  tmp=num%10;  
				  ShowChar(lin,column+1,tmp*16);//低位
				} 
				//显示6*16字符
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-15)
				//character:字符代码(标准ASCII码)
				void ShowChar_6(unsigned char lin,unsigned char column,unsigned char character)
				{ lin=lin				Show86(lin ,column,character );
				Show86(lin+1,column,character+6 );//页地址选择。
				} 
				//显示一个16*16汉字
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-7)
				//hzcode: 汉字代码(自定义的)
				//uchar code HZtable
				void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
				{
				lin=lin				
				Show88(lin,column,hzcode);
				Show88(lin,column+1,hzcode+8);
				Show88(lin+1,column,hzcode+16);
				Show88(lin+1,column+1,hzcode+24);
				}
				//显示一个16*12汉字
				//旋转90度:字模被竖着切分
				//lin:行(0-3), column: 列(0-7)
				//hzcode: 汉字代码(自定义的)
				//uchar code HZtable	
				void ShowHZ_6(unsigned char lin,unsigned char column,unsigned int hzcode)
				{
				lin=lin				
				Show86(lin,column,hzcode);
				Show86(lin,column+1,hzcode+6);
				Show86(lin+1,column,hzcode+12);
				Show86(lin+1,column+1,hzcode+18);
				} 	
				/*----------------------------------------------------------------------------------------------*/
				//显示图片
				//旋转90度 :字模被竖着切分
				//startline :开始行
				//startcolumn:开始列
				//linechar :图片行点除8(图片以8*8点阵为单位)
				//columnchar :图片列点除8(图片以8*8点阵为单位)
				//address : 字模区首地址
				void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
				{ unsigned char i,j;
				for(i=0;i				for(j=0;j				Show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 );
				}
				/*----------------------------------------------------------------------------------------------*/
				//显示一行字符串(汉字,字母混排,一行16字节)
				//lin:行
				//lineheadaddr: 此行汉字代码区首地址
				void ShowLine(unsigned char lin,unsigned char linehead[])
				{ unsigned char i;
				unsigned char byte;
				unsigned int hzcode;
				for( i=0; i				{ byte=linehead[i];
				if(byte < 0x80) //字母
				{
				if(i>15) return; //!!编译器有问题,须强制退出
				
				ShowChar(lin, i , byte);
				i=i+1;
				
				}
				else // byte >= 0x80(汉字)
				{
				if(i>15) return; //!!编译器有问题,须强制退出
				
				byte=byte & 0x7f; //最高位置0,即:减去0x8000
				hzcode=(unsigned int)byte				hzcode=hzcode+linehead[i+1]; //加低8位,组合成整型数地址
				ShowHZ( lin,i,hzcode);
				i=i+2;
				}
				}
				}
				/*----------------------------------------------------------------------------------------------------*/
				//显示一屏汉字
				//pageheadaddr:此屏汉字代码地址区首地址
				void ShowPage(unsigned char pagehead[][16])
				{ unsigned char i;
				for(i=0;i				}
				/*----------------------------------------------------------------------------------------------------*/
				//读显示数据
				unsigned char ReadByte()
				{
				unsigned char dat;
				CheckState();
				di=1; rw=1;
				LCD12864DataPort=0xff;
				en=1; dat=LCD12864DataPort; en=0;
				return(dat);
				}
				
				/*----------------------------------------------------------------------------------------------------*/
				//反显一个8*8字块
				//lin:行(0-3), column: 列(0-7)
				void ReverseShow88(unsigned char lin,unsigned char column)
				{ unsigned char i;
				unsigned char tab[8];
				
				if(column				else SelectScreen(2); //否则 (4,5,6,7), 写在第二屏上
				//读上部8列
				column=column				SetLine(lin);
				SetColumn(column);
				tab[0]=ReadByte(); //空读!!!!! //?
				for(i=0;i				//写回
				SetLine(lin);
				SetColumn(column);
				for(i=0;i				}
				/*----------------------------------------------------------------------------------------------------*/
				/*----------------------------------------------------------------------------------------------------*/
				//反显一个字符
				//lin:行(0-4), column: 列(0-15)
				void ReverseShowChar(unsigned char lin,unsigned char column)
				{ lin=lin				ReverseShow88(lin ,column);
				ReverseShow88(lin+1,column);
				}
				/*----------------------------------------------------------------------------------------------------*/
				//反显一个汉字
				//lin:行(0-3), column: 列(0-7)
				ReverseShowHZ(unsigned char lin,unsigned char column)
				{
				lin=lin				column=column				ReverseShow88(lin ,column );
				ReverseShow88(lin ,column+1);
				ReverseShow88(lin+1,column );
				ReverseShow88(lin+1,column+1);
				}
				/*----------------------------------------------------------------------------------------------------*/
				//反显一行汉字
				//lin:行
				ReverseShow(unsigned char lin)
				{ unsigned char i;
				for(i=0;i				}
				/*----------------------------------------------------------------------------------------------------*/
				void InitLCD() //初始化LCD
				{ unsigned char i=250; //延时
				while(i--);
				
				//reset=0;//复位
				//reset=1;
				SelectScreen(0);
				SetOnOff(0); //关显示
				
				ClearScreen(1);//清屏
				ClearScreen(2);
				
				SelectScreen(0);
				SetOnOff(1); //开显示
				SelectScreen(1);
				SetStartLine(0); //开始行:0
				}
				/*----------------------------------------------------------------------------------------------------*/
				
				void Reset() //液晶复位
				{
				//reset 低复位 _|-
				reset=0;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				reset=1;
				
				//全屏
				cs1=0;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				cs2=0;
				_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
				SendCommandToLCD(0x3F);
				
				}
							

相关资源