屏幕截圖 2024-10-20 172244.png (73.94 KB, 下載次數(shù): 2)
下載附件
2024-10-20 17:23 上傳
/*******************EEPROM記錄大于255的數(shù)*****************
*硬件平臺:STC89C52RC
*開發(fā)環(huán)境:KEIL
*功能:由于24c02是每個存儲地址只對應8個bit的存儲空間,即一個
存儲單元所存儲的數(shù)據(jù)最大為255,該例程介紹了一種當所記憶
數(shù)據(jù)大于255(而小于65536)的存儲方法。即用兩個存儲單元來
存儲一個數(shù)據(jù)。
*********************************************************/
#include<reg52.h>
#include "intrins.h"
#include "i2c.h"
#include "24cxx.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define valdata 5000//計算值
sbit ds=P1^3;
sbit sh_cp=P1^2;
sbit st_cp=P1^4;
sbit dula=P2^6;
sbit wela=P2^7;
sbit k1=P3^3; //設(shè)置/退出
sbit k2=P3^4; //加
sbit k3=P3^5; //減
sbit k4=P3^6; //左移一位
sbit k5=P3^7; //確認
sbit led=P2^0;
uchar diss[8];//595數(shù)碼管8個
uchar mode=0;//模式 0-255
uchar num1;
uchar num2;
uchar num3;
uchar num4;
uchar num5;
uchar num6;
uchar num7;
uchar num8;
uchar num9;
uchar num10;
uchar num11;
uchar num12;
uchar num13;
uchar num14;
uchar num15;
uchar num16; //計算 0-255
bit writedat=0; //寫24C08 的標
unsigned short Val; //mcp4725輸出變量 0-65535
//unsigned short mode0=0;//主顯示0 0-65535
unsigned short mode1=0;//菜單顯示1 0-65535
unsigned short mode2=0;//菜單顯示2 0-65535
unsigned short mode3=0;//菜單顯示3 0-65535
unsigned short mode4=0;//菜單顯示4 0-65535
unsigned short mode5=0;//菜單顯示5 0-65535
unsigned short mode6=0;//菜單顯示6 0-65535
unsigned short mode7=0;//菜單顯示7 0-65535
unsigned short mode8=0;//菜單顯示8 0-65535
//uchar time=0; //系統(tǒng)定時 0-255
uchar code table[]=
{
0x3F,//'0'0
0x06,//'1'1
0x5B,//'2'2
0x4F,//'3'3
0x66,//'4'4
0x6D,//'5'5
0x7D,//'6'6
0x07,//'7'7
0x7F,//'8'8
0x6F,//'9'9
0x77,//'A'10
0x5F,//'a'11
0x7F,//'B'12
0x7C,//'b'13
0x39,//'C'14
0x58,//'c'15
0x3F,//'D'16
0x5E,//'d'17
0x79,//'E'18
0x7B,//'e'19
0x71,//'F'20
0x71,//'f'21
0x7D,//'G'22
0x6F,//'g'23
0x76,//'H'24
0x74,//'h'25
0x06,//'I'26
0x04,//'i'27
0x1E,//'J'28
0x1E,//'j'29
0x38,//'L'30
0x06,//'l'31
0x37,//'N'32
0x54,//'n'33
0x3F,//'O'34
0x5C,//'o'35
0x73,//'P'36
0x73,//'p'37
0x67,//'Q'38
0x67,//'q'39
0x77,//'R'40
0x50,//'r'41
0x6D,//'S'42
0x6D,//'s'43
0x31,//'T'44
0x78,//'t'45
0x3E,//'U'46
0x1C,//'u'47
0x6E,//'Y'48
0x6E,//'y'49
0x5B,//'Z'50
0x5B,//'z'51
0x40,//'-'52
0x08,//'_'53
0x80 //'.'54
};
//數(shù)碼管編碼
void delay1(uint z) //延時為 1ms
{
uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{for(x1=0;x1<1;x1++);}
}
}
//595處理開始
void hc595(uchar dat) //595開始
{
uchar i;
for(i=0;i<8;i++)
{
sh_cp=0;
_nop_();
_nop_();
ds=dat>>7;
dat=dat<<1;
sh_cp=1;
_nop_();
_nop_();
}
}
void ds_dat_txd()//鎖存發(fā)送
{
st_cp=0;
_nop_();
_nop_();
st_cp=1;
_nop_();
_nop_();
}
void display595() //595數(shù)碼管數(shù)據(jù)
{
uchar i=0,dat=0;
for(dat=0xfe;dat!=0xff;dat=dat<<1|0x01)
{
hc595(dat);//先發(fā)送位碼
hc595(table[diss[i++]]);//段碼
ds_dat_txd(); //發(fā)送
if(i==8)i=0;
delay1(1);//適當延時
hc595(0x00); //消隱
ds_dat_txd(); //發(fā)送
}
}
//595處理結(jié)束
void KEY() //按鍵
{
uchar kk; //按鍵 0-255
if(mode>=9) mode=0;
{
if(!k1 &&(kk!=1)) //設(shè)置/確認
{
kk=1;
mode++;
writedat=1; //寫入24C08 的標志;
}
if(mode==1)//模式1
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode1<65535) // 小于65535
mode1++; //自加一次
printf("%dHz\r\n",mode1);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode1>1) //判斷大于1
mode1--; //自減一次
printf("%dHz\r\n",mode1);
}
}
if(mode==2)//模式2
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode2<65535) // 小于65535
mode2++; //自加一次
printf("%dHz\r\n",mode2);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode2>1) //判斷大于1
mode2--; //自減一次
printf("%dHz\r\n",mode2);
}
}
if(mode==3)//模式3
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode3<65535) // 小于65535
mode3++; //自加一次
printf("%dHz\r\n",mode3);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode3>1) //判斷大于1
mode3--; //自減一次
printf("%dHz\r\n",mode3);
}
}
if(mode==4)//模式4
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode4<65535) // 小于65535
mode4++; //自加一次
printf("%dHz\r\n",mode4);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode4>1) //判斷大于1
mode4--; //自減一次
printf("%dHz\r\n",mode4);
}
}
if(mode==5)//模式5
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode5<65535) // 小于65535
mode5++; //自加一次
printf("%dHz\r\n",mode5);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode5>1) //判斷大于1
mode5--; //自減一次
printf("%dHz\r\n",mode5);
}
}
if(mode==6)//模式6
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode6<65535) // 小于65535
mode6++; //自加一次
printf("%dHz\r\n",mode6);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode6>1) //判斷大于1
mode6--; //自減一次
printf("%dHz\r\n",mode6);
}
}
if(mode==7)//模式7
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode7<65535) // 小于65535
mode7++; //自加一次
printf("%dHz\r\n",mode7);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode7>1) //判斷大于1
mode7--; //自減一次
printf("%dHz\r\n",mode7);
}
}
if(mode==8)//模式8
{
if(!k2 &&(kk!=2)) //加
{
kk=2;
if(mode8<65535) // 小于65535
mode8++; //自加一次
printf("%dHz\r\n",mode8);
}
if(!k3 &&(kk!=3)) //減
{
kk=3;
if(mode8>1) //判斷大于1
mode8--; //自減一次
printf("%dHz\r\n",mode8);
}
}
if(!k4 &&(kk!=4)) //
{
kk=4;
if(Val<=1000)
Val++;
MCP4725Write(Val);
printf("%d\r\n",Val);
}
if(!k5 &&(kk!=5)) //
{
kk=5;
if(Val>1)
Val--;
MCP4725Write(Val);
printf("%d\r\n",Val);
}
if(k1 && k2 && k3 && k4 && k5)
{
kk=0;
}
}
if(writedat==1) //寫入24C08 的標志;
{
writedat=0; //清除寫入24C08 的標志;
num1=(uchar)(mode1/256);
num2=(uchar)(mode1%256); //num1和num2是將up的0-65535計算成兩個255分別存儲的變量
num3=(uchar)(mode2/256);
num4=(uchar)(mode2%256); //num3和num4是將down的0-65535計算成兩個255分別存儲的變量
num5=(uchar)(mode3/256);
num6=(uchar)(mode3%256); //num5和num6是將up的0-65535計算成兩個255分別存儲的變量
num7=(uchar)(mode4/256);
num8=(uchar)(mode4%256); //num7和num8是將down的0-65535計算成兩個255分別存儲的變量
num9=(uchar)(mode5/256);
num10=(uchar)(mode5%256); //num9和num10是將up的0-65535計算成兩個255分別存儲的變量
num11=(uchar)(mode6/256);
num12=(uchar)(mode6%256); //num11和num12是將down的0-65535計算成兩個255分別存儲的變量
num13=(uchar)(mode7/256);
num14=(uchar)(mode7%256); //num13和num14是將up的0-65535計算成兩個255分別存儲的變量
num15=(uchar)(mode8/256);
num16=(uchar)(mode8%256); //num15和num16是將down的0-65535計算成兩個255分別存儲的變量
write(0xa0,0x01,num1); //地址1寫入0-255
delay1(10);
write(0xa0,0x02,num2); //地址2寫入0-255
delay1(10);
write(0xa0,0x03,num3); //地址3寫入0-255
delay1(10);
write(0xa0,0x04,num4); //地址4寫入0-255
delay1(10);
write(0xa0,0x05,num5); //地址5寫入0-255
delay1(10);
write(0xa0,0x06,num6); //地址6寫入0-255
delay1(10);
write(0xa0,0x07,num7); //地址7寫入0-255
delay1(10);
write(0xa0,0x08,num8); //地址8寫入0-255
delay1(10);
write(0xa0,0x09,num9); //地址9寫入0-255
delay1(10);
write(0xa0,0x10,num10); //地址10寫入0-255
delay1(10);
write(0xa0,0x11,num11); //地址11寫入0-255
delay1(10);
write(0xa0,0x12,num12); //地址12寫入0-255
delay1(10);
write(0xa0,0x13,num13); //地址13寫入0-255
delay1(10);
write(0xa0,0x14,num14); //地址14寫入0-255
delay1(10);
write(0xa0,0x15,num15); //地址15寫入0-255
delay1(10);
write(0xa0,0x16,num16); //地址16寫入0-255
delay1(10);
}
}
void UartInit(void) //9600bps@11.0592MHz
{
SCON=0X50; //設(shè)置為工作方式1
TMOD=0X21; //設(shè)置計數(shù)器工作方式2
TH1=0XFD; //9600
TL1=0XFD;
TH0=0X3c;
TL0=0Xb0;
ET0=1;
EA=1; //打開總中斷
TR1=1; //打開計數(shù)器
TR0=1;
TI=0;
TI=1;
}
void disss() //595顯示計算
{
switch(mode) //模式
{
case 0: //主顯示
{
diss[0]=52; //顯示千萬位
diss[1]=52;//顯示百萬位
diss[2]=52;//顯示十萬
diss[3]=52;//顯示萬位
diss[4]=52; //顯示千位
diss[5]=52; //顯示百位
diss[6]=52; // 顯示十位
diss[7]=52; //顯示個位
} break;
case 1: //菜單1
{
diss[0]=36; //顯示千萬位
diss[1]=1; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode1/10000; //顯示萬位
diss[4]=mode1%10000/1000; //顯示千位
diss[5]=mode1%1000/100; //顯示百位
diss[6]=mode1%100/10; // 顯示十位
diss[7]=mode1%10; //顯示個位
} break;
case 2: //菜單2
{
diss[0]=36; //顯示千萬位
diss[1]=2; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode2/10000; //顯示萬位
diss[4]=mode2%10000/1000; //顯示千位
diss[5]=mode2%1000/100; //顯示百位
diss[6]=mode2%100/10; // 顯示十位
diss[7]=mode2%10; //顯示個位
} break;
case 3: //菜單3
{
diss[0]=36; //顯示千萬位
diss[1]=3; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode3/10000; //顯示萬位
diss[4]=mode3%10000/1000; //顯示千位
diss[5]=mode3%1000/100; //顯示百位
diss[6]=mode3%100/10; // 顯示十位
diss[7]=mode3%10; //顯示個位
} break;
case 4: //菜單4
{
diss[0]=36; //顯示千萬位
diss[1]=4; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode4/10000; //顯示萬位
diss[4]=mode4%10000/1000; //顯示千位
diss[5]=mode4%1000/100; //顯示百位
diss[6]=mode4%100/10; // 顯示十位
diss[7]=mode4%10; //顯示個位
} break;
case 5: //菜單5
{
diss[0]=36; //顯示千萬位
diss[1]=5; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode5/10000; //顯示萬位
diss[4]=mode5%10000/1000; //顯示千位
diss[5]=mode5%1000/100; //顯示百位
diss[6]=mode5%100/10; // 顯示十位
diss[7]=mode5%10; //顯示個位
} break;
case 6: //菜單6
{
diss[0]=36; //顯示千萬位
diss[1]=6; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode6/10000; //顯示萬位
diss[4]=mode6%10000/1000; //顯示千位
diss[5]=mode6%1000/100; //顯示百位
diss[6]=mode6%100/10; // 顯示十位
diss[7]=mode6%10; //顯示個位
} break;
case 7: //菜單7
{
diss[0]=36; //顯示千萬位
diss[1]=7; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode7/10000; //顯示萬位
diss[4]=mode7%10000/1000; //顯示千位
diss[5]=mode7%1000/100; //顯示百位
diss[6]=mode7%100/10; // 顯示十位
diss[7]=mode7%10; //顯示個位
} break;
case 8: //菜單8
{
diss[0]=36; //顯示千萬位
diss[1]=8; //顯示百萬位
diss[2]=52; //顯示十萬
diss[3]=mode8/10000; //顯示萬位
diss[4]=mode8%10000/1000; //顯示千位
diss[5]=mode8%1000/100; //顯示百位
diss[6]=mode8%100/10; // 顯示十位
diss[7]=mode8%10; //顯示個位
} break;
}
//default: 如果表達式的值和以上的case后面的值都沒有匹配上,那么就執(zhí)行這里的代碼。
// break;
}
void display595out() //595數(shù)碼管輸出
{
display595();
disss();
}
void init() //初始化
{
MCP4725_Init(); //初始化MCP4725
MCP4725Write(0); //掉電不保存數(shù)據(jù)
// MCP4725_Write_data(1000); //掉電后保存當前輸出電壓數(shù)據(jù),并在下一次上電自動設(shè)為上一次輸出數(shù)據(jù)
{
num1 = read(0xa0,0x01,0xa1); //地址1讀出0-255
delay1(10); //適當延時
num2 = read(0xa0,0x02,0xa1); //地址2讀出0-255
delay1(10); //適當延時
num3 = read(0xa0,0x03,0xa1); //地址3讀出0-255
delay1(10); //適當延時
num4 = read(0xa0,0x04,0xa1); //地址4讀出0-255
delay1(10); //適當延時
num5 = read(0xa0,0x05,0xa1); //地址5讀出0-255
delay1(10); //適當延時
num6 = read(0xa0,0x06,0xa1); //地址6讀出0-255
delay1(10); //適當延時
num7 = read(0xa0,0x07,0xa1); //地址7讀出0-255
delay1(10); //適當延時
num8 = read(0xa0,0x08,0xa1); //地址8讀出0-255
delay1(10); //適當延時
num9 = read(0xa0,0x09,0xa1); //地址9讀出0-255
delay1(10); //適當延時
num10 = read(0xa0,0x10,0xa1); //地址10讀出0-255
delay1(10); //適當延時
num11 = read(0xa0,0x11,0xa1); //地址11讀出0-255
delay1(10); //適當延時
num12 = read(0xa0,0x12,0xa1); //地址12讀出0-255
delay1(10); //適當延時
num13 = read(0xa0,0x13,0xa1); //地址13讀出0-255
delay1(10); //適當延時
num14 = read(0xa0,0x14,0xa1); //地址14讀出0-255
delay1(10); //適當延時
num15 = read(0xa0,0x15,0xa1); //地址15讀出0-255
delay1(10); //適當延時
num16 = read(0xa0,0x16,0xa1); //地址16讀出0-255
delay1(10); //適當延時
mode1 = num1*256 + num2; //計算還原成0-65535
mode2 = num3*256 + num4; //計算還原成0-65535
mode3 = num5*256 + num6; //計算還原成0-65535
mode4 = num7*256 + num8; //計算還原成0-65535
mode5 = num9*256 + num10; //計算還原成0-65535
mode6 = num11*256 + num12; //計算還原成0-65535
mode7 = num13*256 + num14; //計算還原成0-65535
mode8 = num15*256 + num16; //計算還原成0-65535
// display595out(); //595數(shù)碼管顯示//讀取要顯示出來的數(shù)
}
UartInit(); //串口初始化
}
void main()
{
init();
printf("初始化完成...\r\n"); //初始化完成后串口發(fā)出
// printf("%d\r\n",mode0); //初始化完成后串口發(fā)出
while(1)
{
KEY(); //按鍵處理
display595out(); //595數(shù)碼管顯示
}
}
//定時器中斷
void time0() interrupt 1 //初始值大概22毫秒
{
uchar time; //亮燈計時
if(time<5)//5x0.22=1.1s
time++;
else
{
time=0;
led=~led;
}
}
仿真程序:
測試.7z
(318.94 KB, 下載次數(shù): 13)
2024-10-20 21:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|