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

📄 display.c

📁 针对philips的51单片机LPC931的具体应用的例子。实现对uart, spi, i2c等硬件资源的操作。还有针对小内存单片机操作系统的实现。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "REG931.H"
#include "memory.h"
#include "system.h"
#include "key.h"
#include "vfd.h"
#include "display.h"


unsigned int code CharTbl_16S[ ]={

	0xc446, // 0
	0x1010,	// 1
	0x85c2,	// 2
	0x8586,	// 3
	0x4584,	// 4
	0xc186,	// 5
	0xc1c6,	// 6
	0x8810,	// 7     ==0x8404
	0xc5c6,	// 8
	0xc586,	// 9
	
	0xc5c4,	// A  // 10
	0x41c6,	// B
	0xc042,	// C
	0x05c6,	// D
	0xc1c2,	// E
	0xc1c0,	// F   // 15
	0xc0c6,	// G
	0x45c4,	// H
	0x9012,	// I
	0x840c,	// J
	0x4948,	// K   // 20
	0x4042,	// L
	0x6c44,	// M
	0x644c,	// N
	0xc446,	// O
	0xc5c0,	// P   // 25
	0xc44e,	// Q
	0xc5c8,	// R
	0xc186,	// S
	0x9010,	// T
	0x4446,	// U   // 30
	0x4860,	// V
	0x446C,	// W
	0x2828,	// X
	0x4586,	// Y
	0x8822,	// Z	 [35]
	     0x0,      // Null, space	// [36]
	0x0180,  // Line: ' -'
	0x0002,  // under-line: ' _'
	0xfdfe,  // '*' : all segment on    [39]
	0x0182,  // '='    // [40]
	0x0820,  // ' /'   // [41]
	0x2008,  // ' \'   // [42]
	0x0200,  // '@' 摄氏度符号 // [43]
	0x0001  // '%'    // [44]

};

uint code CharTbl_8S_Even[]={		// relative even posit digital
	10794, // 0x2a2a:    0  // 0
	   520, // 0x208 :     1  // 1
	10378, // 0x :      2
	  8842, // 0x :      3
	   680, // 0x :      4
	  8866, // 0x :      5
	10914, // 0x :      6
	   522, // 0x :      7
	 10922, // 0x :     8
	 8874, // 0x :      9
	 2730, // 0x :      A    // 10
	10912, // 0x :      B
	10274, // 0x :      C
	10888, // 0x :      D  // 13
	10402, // 0x :      E
	 2210, // 0x :      F   // 15

	0x0,  // Null
	0x2aaa,  // ' *'       // 17
	0x0080,  // ' -'
	0x2000  // ' _'      // 19
};

uint code CharTbl_8S_Odd[]={		// relative Odd posit digital
	5397, // 0x1515:    0
	260	, // 0x104 :      1
	5189, // 0x :      2
	4421, // 0x :      3
	340	, // 0x :      4
	4433, // 0x :      5
	5457, // 0x :      6
	261	, // 0x :      7
	5461, // 0x :      8
	4437, // 0x :      9
	1365, // 0x :      A     // 10
	5456, // 0x :      B
	5137, // 0x :      C
	5444, // 0x :      D    // 13
	5201, // 0x :      E
	1105, // 0x :      F    // 15

	0x0,  // Null
	0x1555,  // ' *'       // 17
	0x0040,  // ' -'
	0x1000  // ' _'        // 19
};
//////////////////////////////////////////////////////
void BuffAccess16S(uchar start, uchar posit, uchar Offset, bit bFront){
	if(bFront){
		VFD.FrontBuff[start+posit*2] &=0x01;	// reserve bit0
		VFD.FrontBuff[start+posit*2+1] &=0x02;	// reserve bit9

		VFD.FrontBuff[start+posit*2] =  (uchar)CharTbl_16S[Offset];
		VFD.FrontBuff[start+posit*2+1] =  (uchar)(CharTbl_16S[Offset]>>8);
	}
	else{
		VFD.BakupBuff[start+posit*2] &=0x01;	// reserve bit0
		VFD.BakupBuff[start+posit*2+1] &=0x02;	// reserve bit9

		VFD.BakupBuff[start+posit*2] =  (uchar)CharTbl_16S[Offset];
		VFD.BakupBuff[start+posit*2+1] =  (uchar)(CharTbl_16S[Offset]>>8);
	}
}
//////////////////////////////////////////////////////
void BuffAccess8S_Odd(uchar addr, uchar Offset, bit bFront){
	if(bFront){
		VFD.FrontBuff[addr] &=0xaa;
		VFD.FrontBuff[addr+1] &=0xea;

		VFD.FrontBuff[addr] |=  (uchar)(CharTbl_8S_Odd[Offset]);
		VFD.FrontBuff[addr+1] |=  (uchar)(CharTbl_8S_Odd[Offset]>>8);
	}
	else{
		VFD.BakupBuff[addr] &=0xaa;
		VFD.BakupBuff[addr+1] &=0xea;

		VFD.BakupBuff[addr] |=  (uchar)(CharTbl_8S_Odd[Offset]);
		VFD.BakupBuff[addr+1] |=  (uchar)(CharTbl_8S_Odd[Offset]>>8);
	}
}
void BuffAccess8S_Even(uchar addr, uchar Offset, bit bFront){
	if(bFront){
		VFD.FrontBuff[addr] &=0x55;
		VFD.FrontBuff[addr+1] &=0xd5;

		VFD.FrontBuff[addr] |=  (uchar)(CharTbl_8S_Even[Offset]);
		VFD.FrontBuff[addr+1] |=  (uchar)(CharTbl_8S_Even[Offset]>>8);
	}
	else{
		VFD.BakupBuff[addr] &=0x55;
		VFD.BakupBuff[addr+1] &=0xd5;

		VFD.BakupBuff[addr] |=  (uchar)(CharTbl_8S_Even[Offset]);
		VFD.BakupBuff[addr+1] |=  (uchar)(CharTbl_8S_Even[Offset]>>8);
	}
}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////


// Input:  Line=1~4; Position=1~8; unchar=0~9 or ascii;
//           bFront=1--to FrontBuff, 0--BackupBuff
// when display one char, it will be clear the '.' or ':' or % or '@' of the char     
void DisplayChar(uchar Line, uchar Position, uchar unChar,bit bFront){
	uchar StartAddr;// , LowByte,HighByte, BLowByte,BHighByte;
	bit OddPosit;
	if(Line<1||Line>4)
		return;
	if(Line==4){		// 16 Segments Char
		if(Position<1 || Position>8)
			return;
		Position--;  // 0 ~ 7
		if((unChar>=0&&unChar<10)||(unChar>='0'&&unChar<='9')
		    ||(unChar >= 'a' && unChar <= 'z')||(unChar >= 'A' && unChar <= 'Z')){
			if(unChar>='0'&&unChar<='9')    unChar -= '0';
			else if(unChar >= 'a' && unChar <= 'z')  unChar = unChar - 'a' + 10;
			else if(unChar >= 'A' && unChar <= 'Z')  unChar = unChar - 'A' + 10;
			BuffAccess16S(20, Position, unChar,bFront);
		}
		else{
			switch(unChar){
				case ' ':
					BuffAccess16S(20, Position, 36, bFront);
					break;
				case '-':
					BuffAccess16S(20, Position, 37, bFront);
					break;
				case '_':
					BuffAccess16S(20, Position, 38, bFront);
					break;
				case '*':
					BuffAccess16S(20, Position, 39, bFront);
					break;
				case '=':
					BuffAccess16S(20, Position, 40, bFront);
					break;
				case '/':
					BuffAccess16S(20, Position, 41, bFront);
					break;
				case '\\':     // '\\'= '\' = 0x5C
					BuffAccess16S(20, Position, 42, bFront);
					break;
				default:    	// recover
					break;
			}
		}
	}
	else{		// 8 Segments char in line1 ~ line3
		if(Position<1||Position>4)
			return;
		Position--;		// 0 ~ 3
		if(Line==LN1)			StartAddr=4;
		else if(Line==LN2)	StartAddr=10;
		else if(Line==LN3)	StartAddr=14;
		StartAddr += (Position<2)? 0:2;
		OddPosit =Position%2;
		if((unChar>=0&&unChar<10)||(unChar>='0'&&unChar<='9')
		   ||(unChar >= 'a' && unChar <= 'f')||(unChar >= 'A' && unChar <= 'F')){
			if(unChar>= '0' && unChar <= '9')   unChar -= '0';
			else if(unChar >= 'a' && unChar <= 'f')  unChar = unChar - 'a' + 10;
			else if(unChar >= 'A' && unChar <= 'F')  unChar = unChar - 'A' + 10;
			if(OddPosit){		// clear position 1 or 3
				BuffAccess8S_Odd(StartAddr, unChar,bFront);
			}
			else{		// clear position 2 or4
				BuffAccess8S_Even(StartAddr, unChar, bFront);
			}
			return;
		}
		else {
			switch(unChar){
			case ' ':
				if(OddPosit)
					BuffAccess8S_Odd(StartAddr, 16, bFront);
				else
					BuffAccess8S_Even(StartAddr, 16, bFront);
				break;
			case '*':
				if(OddPosit){
					BuffAccess8S_Odd(StartAddr, 17, bFront);
				}
				else{
					BuffAccess8S_Even(StartAddr, 17, bFront);
				}
				break;
			case '_':
				if(OddPosit){		// clear position 1 or 3
					BuffAccess8S_Odd(StartAddr, 19, bFront);
				}
				else{		// clear position 2 or4
					BuffAccess8S_Even(StartAddr, 19, bFront);
				}
				break;
			case '-':
				if(OddPosit){		// clear position 1 or 3
					BuffAccess8S_Odd(StartAddr, 18, bFront);
				}
				else{		// clear position 2 or4
					BuffAccess8S_Even(StartAddr, 18, bFront);
				}
				break;
			 default:  	// recover
				break;
			}
		}
	}
}

/////////////////////////////////////////////////////////////////////
void IconBuffBit0On(uchar posit, bit bFront){
	if(bFront){
		VFD.FrontBuff[20+posit*2] |= 0x01;	// set bit0
		VFD.FrontBuff[20+posit*2+1] &= ~0x02;	// clear bit9
	}
	else{
		VFD.BakupBuff[20+posit*2] |= 0x01;	// set bit0
		VFD.BakupBuff[20+posit*2+1] &= ~0x02;	// clear bit9
	}
}

// 
// Input:  Position=1~8; Line=1~4; OnOff=1--on, =0--off
void DisplayDigitalIcon(uchar Line, uchar Position, uchar DigitIcon, bit OnOff, bit bFront){
	uchar StartAddr,OddPosit;
	if(Line==LN4){
		if(Position<1||Position>8)
			return;
		Position--;
		switch(DigitIcon){
		case '.':		// ' .'
			if(OnOff){
				IconBuffBit0On(Position, bFront);
			}
			else	{
				if(bFront)
					VFD.FrontBuff[20+Position*2] &= ~0x01;	// clear bit0	
				else
					VFD.BakupBuff[20+Position*2] &= ~0x01;	// clear bit0	
				}
			break;
		case ':':		// ' :'
			if(OnOff){
				if(bFront){
					VFD.FrontBuff[20+Position*2] &= ~0x01;	// clear bit0	
					VFD.FrontBuff[20+Position*2+1] |= 0x02;	// set bit9
				}
				else{
					VFD.BakupBuff[20+Position*2] &= ~0x01;	// clear bit0	
					VFD.BakupBuff[20+Position*2+1] |= 0x02;	// set bit9
				}
			}
			else	{
				if(bFront)
					VFD.FrontBuff[20+Position*2+1] &= ~0x02;	// clear bit9
				else
					VFD.BakupBuff[20+Position*2+1] &= ~0x02;	// clear bit9
				}
			break;
		case '%':	// ' %'
			if(Position != 7)
				break;
			if(OnOff){
				IconBuffBit0On(Position, bFront);
			}
			else	{
				if(bFront)
					VFD.FrontBuff[20+Position*2] &= ~0x01;	// clear bit0	
				else
					VFD.BakupBuff[20+Position*2] &= ~0x01;	// clear bit0	
			}
			break;
		case '@':	// "摄氏度符号"
			if(Position != 6)
				break;
			if(OnOff){
				if(bFront)
					VFD.FrontBuff[20+Position*2+1] |= 0x02;	// set bit0	
				else
					VFD.BakupBuff[20+Position*2+1] |= 0x02;	// set bit0	
			}
			else{
				if(bFront)
					VFD.FrontBuff[20+Position*2+1] &= ~0x02;	// clear bit0	
				else
					VFD.FrontBuff[20+Position*2+1] &= ~0x02;	// clear bit0	
			}
			break;
		}
	}
	else{
		if(Line==LN1)		StartAddr=4;
		else if(Line==LN2)	StartAddr=10;
		else if(Line==LN3)	StartAddr=14;
		else
			return;
		if(Position<1||Position>4)
			return;
		Position--;
		StartAddr += (Position<2)? 0:2;
		OddPosit =Position%2;
		if(DigitIcon=='.'){
			if(OnOff){
				if(OddPosit){		// position 1, 3
					if(bFront)
						VFD.FrontBuff[StartAddr+1] |=(Position==1)?0x80:0x40;	// posit 1 set b7, or set b6
					else
						VFD.BakupBuff[StartAddr+1] |=(Position==1)?0x80:0x40;	// posit 1 set b7, or set b6
				}
				else	{		// position 0, 2
					if(bFront)
						VFD.FrontBuff[StartAddr+1] |= (Position==2)?0x80:0x40;	// posit 0 is set b6, or set b7
					else
						VFD.BakupBuff[StartAddr+1] |= (Position==2)?0x80:0x40;	// posit 0 is set b6, or set b7
				}
			}
			else{
				if(OddPosit){		// position 1, 3
					if(bFront)
						VFD.FrontBuff[StartAddr+1] &= (Position==1)?0x7f:0xbf;	// posit 1 is clear b7 or clear b6
					else
						VFD.BakupBuff[StartAddr+1] &= (Position==1)?0x7f:0xbf;	// posit 1 is clear b7 or clear b6
					}
				else	{	// position 0, 2
					if(bFront)
						VFD.FrontBuff[StartAddr+1] &= (Position==2)?0x7f:0xbf;	// posit 2 is clear b7 or clear b6
					else
						VFD.BakupBuff[StartAddr+1] &= (Position==2)?0x7f:0xbf;	// posit 2 is clear b7 or clear b6
				}
			}
		}
	}
}


// Input: Line=1~4; posit=1~8; 
void DisplayStr2Buff(uchar Line, uchar posit, uchar *Pt, bit bFillSpace, bit bFront){
	uchar len;
	len = (Line<4)?4:8; 	// 4 char or 8 char
	if(((Line>=4)&&(posit>len))||((Line<4)&&(posit>len)))

⌨️ 快捷键说明

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