📄 display.c
字号:
#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 + -