📄 程序.txt
字号:
#include<reg51.h>
#include<absacc.h>
#define LEDLen 6
#define OUTBIT XBYTE[0XB002]
#define OUTSEG XBYTE[0XB004]
#define IN XBYTE[0XB001] //键盘
#define ADMODE1 XBYTE[0X9001] //选择0809的模拟输入通道1 注意两个模拟输入口的选择
#define ADMODE0 XBYTE[0X9000] //通道0
#define DAMODE XBYTE[0xA000] //D/A转换片选
#define PD1 61 // 122/2 分成左右两半屏(122x32)
unsigned char LEDBuf[LEDLen]; // 显示缓冲
unsigned char Column;
unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址
unsigned char Code_ ; // 字符代码寄存器 ==
unsigned char ncode; //数字码码号 ==
unsigned char a;
unsigned char Command; // 指令寄存器
unsigned char LCDData; // 数据寄存器
xdata unsigned char CWADD1 _at_ 0x8000; // 写指令代码地址(E1)
xdata unsigned char DWADD1 _at_ 0x8001; // 写显示数据地址(E1)
xdata unsigned char CRADD1 _at_ 0x8002; // 读状态字地址(E1)
xdata unsigned char DRADD1 _at_ 0x8003; // 读显示数据地址(E1)
xdata unsigned char CWADD2 _at_ 0x8004; // 写指令代码地址(E2)
xdata unsigned char DWADD2 _at_ 0x8005; // 写显示数进地址(E2)
xdata unsigned char CRADD2 _at_ 0x8006; // 读状态字地址(E2)
xdata unsigned char DRADD2 _at_ 0x8007; // 读显示数据地址(E2)
//英文字模库 8x8 点阵
code unsigned char CCTAB[][32] =
{{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,},//温
{0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,}, //度
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,},//:
{0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,},//压
{0x00,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,
0x00,0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,} //力
} ;
code unsigned char number[][16]= {{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,}, //0
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,},//1
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,}, //2
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,},//3
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,},//4
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,},//5
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,},//6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,},//7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,},//8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,},};//9
code unsigned char LEDMAP[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; // 八段管显示码
// 1.写指令代码子程序(E1)
void WriteCommandE1()
{
while(CRADD1 & 0x80);
CWADD1 = Command;
}
// 2.写显示数据子程序(E1)
void WriteDataE1()
{
while(CRADD1 & 0x80);
DWADD1 = LCDData;
}
// 3.读显示数据子程序(E1)
void ReadDataE1()
{
while(CRADD1 & 0x80);
LCDData = DRADD1;
}
// 4.写指令代码子程序(E2)
void WriteCommandE2()
{
while(CRADD2 & 0x80);
CWADD2 = Command;
}
// 5.写显示数据子程序(E2)
void WriteDataE2()
{
while(CRADD2 & 0x80);
DWADD2 = LCDData;
}
// 6.读显示数据子程序(E2)
void ReadDataE2()
{
while(CRADD2 & 0x80);
LCDData = DRADD2;
}
// 初始化程序
void Init()
{
Command = 0xe2;
WriteCommandE1();
WriteCommandE2();
Command = 0xa4;
WriteCommandE1();
WriteCommandE2();
Command = 0xa9;
WriteCommandE1();
WriteCommandE2();
Command = 0xa0;
WriteCommandE1();
WriteCommandE2();
Command = 0xc0;
WriteCommandE1();
WriteCommandE2();
Command = 0xaf;
WriteCommandE1();
WriteCommandE2();
}
// 清屏
void Clear()
{
unsigned char i,j;
i = 0;
do {
Command = (i + 0xb8); // 页地址设置
WriteCommandE1();
WriteCommandE2();
Command = 0x00; // 列地址设置为"0"
WriteCommandE1();
WriteCommandE2();
j = 0x50; // 一页清 80个字节
do {
LCDData = 0x00; // 显示数据为"0"
WriteDataE1();
WriteDataE2();
}while(--j !=0); // 页内字节清零循环
}while(++i !=4); // 页地址暂存器加一
// 显示区清零循环
}
// 延时程序
void Delay()
{
unsigned char i,j;
i = 20;
j = 0;
do{
do{
}while(--j !=0);
}while( --i != 0 );
}
// 中文显示子程序
void WriteCHN16x16()
{
unsigned char i,j,k;
i = 0;
j = 0;
while(j<2) {
Command = ((Page_ + j) & 0x03) | 0xb8; // 设置页地址
WriteCommandE1();
WriteCommandE2();
k = Column; // 列地址值
while(k < Column + 16){
if (k < PD1) { // 为左半屏显示区域(E1)
Command = k;
WriteCommandE1(); // 设置列地址值
LCDData = CCTAB[Code_][i]; // 取汉字字模数据
WriteDataE1(); // 写字模数据
} else{ // 为右半屏显示区域(E2)
Command = k-PD1;
WriteCommandE2(); // 设置列地址值
LCDData = CCTAB[Code_][i]; // 取汉字字模数据
WriteDataE2(); // 写字模数据
};
i++;
if( ++k >= PD1 * 2) break; // 列地址是否超出显示范围
} ;
j++;
};
}
// 数字显示子程序
void disnumber()
{
unsigned char i,j,k;
i = 0;
j = 0;
while(j<2) {
Command = ((Page_ + j) & 0x03) | 0xb8; // 设置页地址
WriteCommandE1();
WriteCommandE2();
k = Column; // 列地址值
while(k < Column + 8){
if (k < PD1) { // 为左半屏显示区域(E1)
Command = k;
WriteCommandE1(); // 设置列地址值
LCDData = number[ncode][i]; // 取汉字字模数据
WriteDataE1(); // 写字模数据
} else{ // 为右半屏显示区域(E2)
Command = k-PD1;
WriteCommandE2(); // 设置列地址值
LCDData = number[ncode][i]; // 取汉字字模数据
WriteDataE2(); // 写字模数据
};
i++;
if( ++k >= PD1 * 2) break; // 列地址是否超出显示范围
} ;
j++;
};
}
unsigned char ad08090() //(温度)模数转换模子函数 压力的初始值为0x14 温度传感器的初始值为0x6a
{ unsigned char i,j=0;
for(;;)
{
ADMODE0=0; //启动0809
for(i=0;i<125;i++) ;
j=ADMODE0;
for(i=0;i<125;i++) ;
return(j) ;
}
}
unsigned char ad08091()//压力函数,模数转换
{ unsigned char i,j=0;
for(;;)
{
ADMODE1=0; //启动0809
for(i=0;i<125;i++) ;
j=ADMODE1;
for(i=0;i<125;i++) ;
return(j) ;
}
}
//键盘的子程序
void Dellay(unsigned char CNT)
{
unsigned char i;
while (CNT-- !=0)
for (i=100; i !=0; i--);
}
void DisplayLED()
{
unsigned char i;
unsigned char Pos;
unsigned char LED;
Pos = 0x20; // 从左边开始显示
for (i = 0; i < LEDLen; i++) {
OUTBIT = 0; // 关所有八段管
LED = LEDBuf[i];
OUTSEG = LED;
OUTBIT = Pos; // 显示一位八段管
Dellay(1);
Pos >>= 1; // 显示下一位
}
}
code unsigned char KeyTable[] = { // 键码定义
0x16, 0x15, 0x14, 0xff,
0x13, 0x12, 0x11, 0x10,
0x0d, 0x0c, 0x0b, 0x0a,
0x0e, 0x03, 0x06, 0x09,
0x0f, 0x02, 0x05, 0x08,
0x00, 0x01, 0x04, 0x07
};
unsigned char TestKey()
{
OUTBIT = 0; // 输出线置为0
return (~IN & 0x0f); // 读入键状态(高四位不用)
}
unsigned char GetKey()
{
unsigned char Pos;
unsigned char i;
unsigned char k;
i = 6;
Pos = 0x20; // 找出键所在列
do {
OUTBIT = ~ Pos;
Pos >>= 1;
k = ~IN & 0x0f;
} while ((--i != 0) && (k == 0));
// 键值 = 列 x 4 + 行
if (k != 0) {
i *= 4;
if (k & 2)
i += 1;
else if (k & 4)
i += 2;
else if (k & 8)
i += 3;
OUTBIT = 0;
do Dellay(10); while (TestKey()); // 等键释放
return(KeyTable[i]); // 取出键码
} else return(0xff);
}
void main()
{ unsigned char b,s,g,z,k;
int i;
while (1) {
DisplayLED();
if (TestKey()) {LEDBuf[5] = LEDMAP[GetKey() & 0x0f]; a=LEDBuf[5];}
switch(a){
case 0x66:{ Init();
Clear();
Page_ = 0x02;
Column = 0x00; //第一行
Code_ = 0x00; //温
WriteCHN16x16();
Page_ = 0x02;
Column = 0x10;
Code_ = 0x01; //度
WriteCHN16x16();
Page_ = 0x02;
Column = 0x20;
Code_ = 0x02;
WriteCHN16x16(); //:
Page_=2;
ncode=7;
Column=0x38;
disnumber();
z=ad08090(); //==============================温度显示
//z=100;
b=z/100; s=z%100/10;g=z%10;
Page_=2;Column=0x30;
if(b!=0){ncode=b;disnumber();Column+=8;}
if(b!=0){ncode=s;disnumber();Column+=8;}else
if (s!=0){ncode=s;disnumber();Column+=8;}
ncode=g;disnumber();
for(i=0;i<32000;i++); }break;
case 0x6d:{ Init();
Clear();
Page_ = 0x02;
Column = 0x00;
Code_ = 0x03;
WriteCHN16x16(); //压
Page_ = 0x02;
Column = 0x10;
Code_ = 0x04;
WriteCHN16x16(); //力
Page_ = 0x02;
Column = 0x20;
Code_ = 0x02;
WriteCHN16x16(); //:
Page_=2;
ncode=7;
Column=0x38;
disnumber();
z=ad08091(); //z=115; =============================压力显示
b=z/100; s=(z%100)/10;g=z%10;
Page_=2;Column=0x30;
if(b!=0){ncode=b;disnumber();Column+=8;}
if(b!=0){ncode=s;disnumber();Column+=8;}else
if (s!=0){ncode=s;disnumber();Column+=8;}
ncode=g;disnumber();
for(i=0;i<32000;i++);}break;
case 0x7d:{ k=0x90;
DAMODE=k;
for(i=0;i<1250;i++) ;}break;
case 0x07:{ k=0xa0;
DAMODE=k;
for(i=0;i<1250;i++) ;}break;
case 0x7f:{ k=0xb0;
DAMODE=k;
for(i=0;i<1250;i++) ;}break;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -