仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (155.01 KB, 下載次數(shù): 31)
下載附件
2022-5-24 17:50 上傳
1.png (32.22 KB, 下載次數(shù): 37)
下載附件
2022-5-24 16:06 上傳
單片機程序代碼
#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AD P2
#define lcd P2
#define key P1
sbit a6=P3^0;
sbit a5=P3^1;
sbit a4=P3^2;
sbit A0=P2^0;
sbit A1=P2^1;
sbit A2=P2^2;
sbit A3=P2^3;
sbit n0=P1^0;
sbit n1=P1^1;
sbit n2=P1^2;
sbit n3=P1^3;
sbit n4=P1^4;
sbit n5=P1^5;
sbit n6=P1^6;
sbit n7=P1^7;
uchar code Y1[96]={
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0x42,0xE2,0x52,0x4A,0xC6,0x42,0x40,0xC0,0x00,
0x10,0x60,0x02,0x8C,0x20,0x90,0x8E,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x80,0x00,
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00
};
uchar code Y2[96]={
0x04,0x03,0x00,0xFF,0x00,0x23,0x10,0x8C,0x43,0x20,0x18,0x47,0x80,0x40,0x3F,0x00,
0x04,0x04,0x7E,0x01,0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00
};
uchar code H1[120]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x00,0x00,0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
uchar code H2[120]={
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,
0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x24,0x24,0x12,0x3F,0x20,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void delay(unsigned int i)
{
unsigned char k=200;
while(i>0)
{
i--;
}
}
void OUTMD(uchar i){ //??
A0=1; //??? //????
delay(5);
A1=1;
delay(10);
lcd=i;
delay(5);
A1=0;
}
void OUTSD(unsigned char i){
A0=1; //???//??//????
delay(5);
A2=1;
delay(10);
lcd=i;
delay(5);
A2=0;
}
void OUTMI(uchar i){ //??
A0=0; //???//????
delay(5);
A1=1;
delay(10);
lcd=i;
delay(5);
A1=0;
}
void OUTSI(unsigned char i){
A0=0; //???//??//????
delay(5);
A2=1;
delay(10);
lcd=i;
delay(5);
A2=0;
}
void lcdini(void){ //???
A3=0;
OUTMI(0XE2); OUTSI(0XE2);//??
OUTMI(0XAE); OUTSI(0XAE);//POWER SAVE ??????,?????
OUTMI(0XA4); OUTSI(0XA4);//????
OUTMI(0XA9); OUTSI(0XA9);//1/32???
OUTMI(0XA1); OUTSI(0XA1);//?????,????
OUTMI(0XE0); OUTSI(0XE0);//??-??-???
OUTMI(0XEE); OUTSI(0XEE);//??? ???-??-???
OUTMI(0X00); OUTMI(0XC0);
OUTSI(0X00); OUTSI(0XC0);
OUTMI(0XAF); OUTSI(0XAF);//POWER SAVE ??????,?????
}
void SetPage ( uchar page0,uchar page1)
{
OUTMI(0xB8|page1);
OUTSI(0xB8|page0);
}
void SetAddress ( uchar address0,uchar address1)
{
OUTMI(address1);
OUTSI(address0);
}
void PutCharR(uchar ch)
{
OUTSD(ch);
}
void PutCharL(uchar ch)
{
OUTMD(ch);
}
void clrscr(void)
{
uchar i;
uchar page;
for (page=0;page<4;page++)
{
SetPage ( page, page);
SetAddress(0,0);
for (i=0;i<61;i++)
{
PutCharR(0);
PutCharL(0);
}
}
}
void Draw_wordh (uint d_where, uint x_add, bit layer, uchar width,uchar *p)
{ //???????
uchar x, address; //address?????????
bit window=0; //window??????
d_where = d_where*2*width;
for (x=width;x>0;x--){
if (x_add>=61) {window=1;address=x_add%61;}
else address=x_add;
if(layer==0){ //??????????
SetPage(0,0);
SetAddress(address,address);
if(window==1)PutCharR(p[d_where]);
else PutCharL(p[d_where]);
}
else{ //????????????
SetPage(2,2);
SetAddress(address,address);
if(window==1)PutCharR(p[d_where]);//??
else PutCharL(p[d_where]);
}
x_add++;
d_where++;
}}
void Draw_wordh2 (uint d_where, uint x_add, bit layer, uchar width,uchar *p)
{ //???????
uchar x, address; //address?????????
bit window=0; //window??????
d_where = d_where*2*width;
for (x=width;x>0;x--){
if (x_add>=61) {window=1;address=x_add%61;}
else address=x_add;
if(layer==0){ //??????????
SetPage(1,1);
SetAddress(address,address);
if(window==1)PutCharR(p[d_where]);
else PutCharL(p[d_where]);
}
else{ //????????????
SetPage(3,3);
SetAddress(address,address);
if(window==1)PutCharR(p[d_where+width]);//??
else PutCharL(p[d_where+width]);
}
x_add++;
d_where++;
}
}
uint ReadADC() //把模擬電壓值轉(zhuǎn)換成12位二進制數(shù)并返回
{
uint ad = 0; // 電壓:3.3V
// 數(shù)字:1010 0011 1011
uchar l; // 1:ad:0000 0000 0000
// DA: 0000 0000 0001
a5=0; // ad: 0000 0000 0001
a4=0; // 2: ad: 0000 0000 0010
_nop_(); // DA: 0
_nop_(); // ad: 0000 0000 0010
_nop_(); // 3: ad: 0000 0000 0100
_nop_(); // DA: 1
_nop_(); // ad: 0000 0000 0101
_nop_(); // 4: ad: 0000 0000 1010
_nop_();
a5=1;
_nop_();
_nop_();
a5=0;
_nop_();
_nop_();
for(l=0;l<12;l++)
{
ad <<= 1;
a5=1;
_nop_();
_nop_();
a5=0;
_nop_();
_nop_();
ad |= a6;
}
a4=1;
return ad;
}
uchar temp()
{
}
uchar key()
{
uchar temp;
// while(1)
// {
P1=0xff; //向P1口輸入1表示這個I/O口作為輸入端口
P1=0xf0; //先將行全置0,列全置1
temp=P1; //實時采取P1端口的數(shù)據(jù)
if(temp!=0xf0)
{
delay(1000);//消抖
temp=P1; //實時采取P1端口的數(shù)據(jù)
if(temp!=0xf0) //再判斷
{
P1=0xfe;//列已判斷,將進行逐行掃描,即將某一行置0其余行置1,逐列掃描,對該行進行判斷!
temp=P1;
switch(temp)
{
case(0xee):return 7;break;
case(0xde):return 8;break;
case(0xbe):return 9;break;
case(0x7e):return 10;break;
}
P1=0xfd;
temp=P1;
switch(temp)
{
case(0xed):return 4;break;
case(0xdd):return 5;break;
case(0xbd):return 6;break;
case(0x7d):return 11;break;
}
P1=0xfb;
temp=P1;
switch(temp)
{
case(0xeb):return 1;break;
case(0xdb):return 2;break;
case(0xbb):return 3;break;
case(0x7b):return 12;break;
}
P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):return 13;break;
case(0xd7):return 0;break;
case(0xb7):return 14;break;
case(0x77):return 15;break;
}
}
}
else
return 16;
}
void main()
{
uint i=0,jiaodu=0;
uchar keynum[3],keyc,keyval,keyd,tgc;
// uchar keynum[]={5,2,1};
lcdini();
while(1)
{
keyval=key1();
if(keyval!=16) //有鍵按下
{
if(keyd==0)
{ keyd=1;
if(keyval==13) //取消鍵
{
for(i=0;i<3;i++)
{
keynum[ i]=0;
}
jiaodu=0;
keyc=0;
}
if(keyval<10) //數(shù)字鍵盤
{
keynum[keyc]=keyval;
keyc++;
switch(keyc)
{
case 0:break;
case 1:jiaodu=keynum[0];break;
case 2:jiaodu=keynum[0]*10+keynum[1];break;
case 3:jiaodu=keynum[0]*100+keynum[1]*10+keynum[2];break;
}
}
}
}
else
keyd=0;
}
}
Keil代碼與Proteus仿真下載:
實驗二.7z
(57.73 KB, 下載次數(shù): 14)
2022-5-24 17:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|