基于stc89c51的示波器制作,自己剛剛做出來的,程序,仿真,原理圖
0.png (44.41 KB, 下載次數(shù): 195)
下載附件
2016-9-1 13:50 上傳
部分程序代碼預覽(完整版本請下載本帖最后的附件)
- #include "lcd12864.h"
- #include "osc.h"
- #include "common.h"
- #include "dots.h"
- unsigned char val_vdiv=2; //Y軸電壓標度索引0~5
- unsigned char val_tdiv=0; //X軸時間標度索引0~5
- unsigned char acdc_flag=0; //交流直流檔切換
- unsigned char run_flag=0; //運行停止切換
- unsigned char pointxA;
- unsigned char pointxB;
- unsigned char pointyA;
- unsigned char pointyB;
- unsigned char xdata da_buffer[DATA_SIZE];
- unsigned char da_finish;
- char movx=0; //水平移動
- char movy=0; //垂直移動
- unsigned char code vdiv [] = {1,2,5,10,20,50};//電壓標度索引是0到5,實際是0.1到5.0
- unsigned char code tdiv [] = {8,10,20,50,100};//掃描時間標度索引是0到5
- void disp_ypoint(void)
- {
- unsigned char dat[ALL_LINE];
- unsigned char j,i;
- for(j=0;j<3;j++) {
- for(i=0;i<7;i++) dat[i] = 0;
- if(j==0) {
- dat[(pointyA-2)/8] |= 0x01<<((pointyA-2)%8);
- dat[(pointyA-1)/8] |= 0x01<<((pointyA-1)%8);
- dat[(pointyA )/8] |= 0x01<<((pointyA )%8);
- dat[(pointyA+1)/8] |= 0x01<<((pointyA+1)%8);
- dat[(pointyA+2)/8] |= 0x01<<((pointyA+2)%8);
-
- dat[(pointyB-2)/8] |= 0x01<<((pointyB-2)%8);
- dat[(pointyB-1)/8] |= 0x01<<((pointyB-1)%8);
- dat[(pointyB )/8] |= 0x01<<((pointyB )%8);
- dat[(pointyB+1)/8] |= 0x01<<((pointyB+1)%8);
- dat[(pointyB+2)/8] |= 0x01<<((pointyB+2)%8);
-
- /*上下平移標志*/
- if(movy== (HEIGHT/2)) {
- dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- }
- else if(movy==-(HEIGHT/2)) {
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
- }
- else {
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- }
- /*寫LCD,刷新顯示*/
- for(i=0;i<ALL_LINE;i++) {
- lcd_cmd_wr(SETY+i,0);
- lcd_cmd_wr(SETX+ZEROX-4,0);
- lcd_data_wr(dat[i],0);
- }
- }
- else if(j==1){
- dat[(pointyA-1)/8] |= 0x01<<((pointyA-1)%8);
- dat[(pointyA )/8] |= 0x01<<((pointyA )%8);
- dat[(pointyA+1)/8] |= 0x01<<((pointyA+1)%8);
- dat[(pointyB-1)/8] |= 0x01<<((pointyB-1)%8);
- dat[(pointyB )/8] |= 0x01<<((pointyB )%8);
- dat[(pointyB+1)/8] |= 0x01<<((pointyB+1)%8);
-
- /*上下平移標志*/
- dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
-
- /*寫LCD,刷新顯示*/
- for(i=0;i<ALL_LINE;i++) {
- lcd_cmd_wr(SETY+i,0);
- lcd_cmd_wr(SETX+ZEROX-3,0);
- lcd_data_wr(dat[i],0);
- }
- }
- else {
- dat[(pointyA)/8] |= 0x01<<((pointyA)%8);
- dat[(pointyB)/8] |= 0x01<<((pointyB)%8);
-
- /*上下平移標志*/
- if(movy==(HEIGHT/2)) {
- dat[(HEIGHT/2+4-movy)/8] |= 0x01<<((HEIGHT/2+4-movy)%8);
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- }
- else if(movy==-(HEIGHT/2)) {
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- dat[(HEIGHT/2+6-movy)/8] |= 0x01<<((HEIGHT/2+6-movy)%8);
- }
- else {
- dat[(HEIGHT/2+5-movy)/8] |= 0x01<<((HEIGHT/2+5-movy)%8);
- }
-
- /*寫LCD,刷新顯示*/
- for(i=0;i<ALL_LINE;i++) {
- lcd_cmd_wr(SETY+i,0);
- lcd_cmd_wr(SETX+ZEROX-2,0);
- lcd_data_wr(dat[i],0);
- }
- }
- }
- }
- //LCD波形顯示區(qū)
- void disp(unsigned char x,unsigned char y,char l)
- {
- unsigned char dat[ALL_LINE],j,k;
- x += ZEROX;
- y = ZEROY-1-y;//1是修正1行空白行
- dat[0] = 0x10;
- dat[1] = 0x0;
- dat[2] = 0x0;
- dat[3] = 0x0;
- dat[4] = 0x0;
- dat[5] = 0x0;
- dat[6] = 0x40;
-
- if((x+1)%5==0) {
- dat[3] |= 0x20; /*水平中心線*/
- dat[pointyA/8] |= 0x01<<pointyA%8; /*水平測量線A*/
- dat[pointyB/8] |= 0x01<<pointyB%8; /*水平測量線B*/
- }
- /*上下邊框格點*/
- //if(((x-ZEROX) ==WIDTH/2-1)||((x-ZEROX)%5==0)||((x-ZEROX) == WIDTH/2+1)) {
- if((x-ZEROX)%5==0) {
- dat[0] |= 0x20;dat[ALL_LINE-1] |= 0x20;
- }
- /*垂直測量線格點和垂直中心線*/
- if(((x-ZEROX) == pointxA)||((x-ZEROX) == pointxB)||((x-ZEROX) == WIDTH/2)) {
- dat[0] |= 0x10;
- dat[1] |= 0x42;
- dat[2] |= 0x08;
- dat[3] |= 0x21;
- dat[4] |= 0x84;
- dat[5] |= 0x10;
- dat[6] |= 0x42;
- }
- /*頂端測量線三角符號*/
- if(x-ZEROX==(pointxA-2)) dat[0] |= 0x01;
- if(x-ZEROX==(pointxA-1)) dat[0] |= 0x03;
- if(x-ZEROX==(pointxA )) dat[0] |= 0x07;
- if(x-ZEROX==(pointxA+1)) dat[0] |= 0x03;
- if(x-ZEROX==(pointxA+2)) dat[0] |= 0x01;
- if(x-ZEROX==(pointxB-2)) dat[0] |= 0x01;
- if(x-ZEROX==(pointxB-1)) dat[0] |= 0x03;
- if(x-ZEROX==(pointxB )) dat[0] |= 0x07;
- if(x-ZEROX==(pointxB+1)) dat[0] |= 0x03;
- if(x-ZEROX==(pointxB+2)) dat[0] |= 0x01;
- /*頂端中點左右平移標志*/
- if(movx == (WIDTH/2-1)) {
- if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x07;
- if(x-ZEROX==WIDTH/2-movx ) dat[0] |= 0x07;
- if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x02;
- }
- else if(movx==-(WIDTH/2-1)) {
- if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x02;
- if(x-ZEROX==WIDTH/2-movx ) dat[0] |= 0x07;
- if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x07;
- }
- else {
- if(x-ZEROX==WIDTH/2-movx-1) dat[0] |= 0x02;
- if(x-ZEROX==WIDTH/2-movx) dat[0] |= 0x07;
- if(x-ZEROX==WIDTH/2-movx+1) dat[0] |= 0x02;
- }
- /*左邊框*/
- if(x==ZEROX) {
- dat[0] = 0xf0;
- dat[1] = 0xff;
- dat[2] = 0xff;
- dat[3] = 0xff;
- dat[4] = 0xff;
- dat[5] = 0xff;
- dat[6] = 0x7f;
- }
- /*左邊框上格點*/
- if(x==ZEROX+1) {
- dat[0] |= 0x10;
- dat[1] |= 0x42;
- dat[2] |= 0x08;
- dat[3] |= 0x21;
- dat[4] |= 0x84;
- dat[5] |= 0x10;
- dat[6] |= 0x42;
- }
- /*右邊框*/
- if(x==ZEROX+WIDTH-1) {
- dat[0] = 0xf0;
- dat[1] = 0xff;
- dat[2] = 0xff;
- dat[3] = 0xff;
- dat[4] = 0xff;
- dat[5] = 0xff;
- dat[6] = 0x7f;
- }
- /*右邊框格點*/
- if(x==ZEROX+WIDTH-2) {
- dat[0] |= 0x10;
- dat[1] |= 0x42;
- dat[2] |= 0x08;
- dat[3] |= 0x21;
- dat[4] |= 0x84;
- dat[5] |= 0x10;
- dat[6] |= 0x42;
- }
- /*波形描點*/
- if(l==0) dat[(y)/8] |= 0x01<<((y)%8);
- else if(l>0) {
- for(j=0;j<l+1;j++) { //+1多描1點,波形更粗壯
- k=((y+j)/8);
- if(k>6) k=6;
- if(k==0) dat[0] |= (0x01<<((y+j)%8))&0xe0;
- else if(k==6) dat[6] |= (0x01<<((y+j)%8))&0x3f;
- else dat[k] |= 0x01<<((y+j)%8);
- }
- }
- else for(j=0;j<(-l)+1;j++) {
- k=((y-j)/8);
- if(k>6) k=6;
- if(k==0) dat[0] |= (0x01<<((y-j)%8))&0xf0;
- else if(k==6) dat[6] |= (0x01<<((y-j)%8))&0x3f;
- else dat[k] |= 0x01<<((y-j)%8);
- }
- /*寫入LCD*/
- if(x<64) {
- for(j=0;j<ALL_LINE;j++) {
- lcd_cmd_wr(SETY+j,0);
- lcd_cmd_wr(SETX+x,0);
- lcd_data_wr(dat[j],0);
- }
- }
- else {
- x-=64;
- for(j=0;j<ALL_LINE;j++) {
- lcd_cmd_wr(SETY+j,1);
- lcd_cmd_wr(SETX+x,1);
- lcd_data_wr(dat[j],1);
- }
- }
- }
- void disp_vdiv(void)
- {
- unsigned int tmp;
-
- tmp = vdiv[val_vdiv];
- /*y軸電壓標度*/
- lcd12864_put_xystr(0,7,4,Num+(tmp/10)*4);
- lcd12864_put_xystr(5,7,1,Num+10*4);
- lcd12864_put_xystr(7,7,4,Num+(tmp%10)*4);
- tmp = tdiv[val_tdiv];
- /*x軸時間標度*/
- if(tmp<100) {
- lcd12864_put_clr(23,7,8);
- lcd12864_put_xystr(23,7,4,Num+(tmp/10)*4);
- lcd12864_put_xystr(28,7,1,Num+10*4);
- lcd12864_put_xystr(30,7,4,Num+(tmp%10)*4);
- }
- else {
- lcd12864_put_clr(23,7,8);
- lcd12864_put_xystr(25,7,4,Num+1*4);
- lcd12864_put_xystr(30,7,4,Num+0*4);
- }
- /*AC,DC標識*/
- lcd12864_put_xystr(47,7,12,ac_dc+acdc_flag*12);//0=ac,1=dc
- /*RUN,PAUSE標識*/
- lcd12864_put_xystr(60,7,17,run_paus+run_flag*17);//0=run,1=paus
-
- tmp=(pointyB-pointyA)*vdiv[val_vdiv];
- tmp/=5;
- if(tmp < 100) {
- /*測量電壓*/
- lcd12864_put_clr(79,7,11);
- lcd12864_put_xystr(79,7,4,Num + (tmp/10)*4);
- lcd12864_put_xystr(84,7,1,Num + 10*4);
- lcd12864_put_xystr(86,7,4,Num + (tmp%10)*4);
- }
- else {
- lcd12864_put_clr(79,7,11);
- lcd12864_put_xystr(79,7,4,Num+ (tmp/100)*4);
- lcd12864_put_xystr(85,7,4,Num+ (tmp/10 %10)*4);
- }
-
- tmp=50000/(pointxB-pointxA)/tdiv[val_tdiv];
- /*測量頻率*/
- lcd12864_put_clr(99,7,20);
- if(tmp<10) {
- lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);
- }
- else if(tmp <100) {
- lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);
- lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);
- } else if(tmp <1000) {
- lcd12864_put_xystr(104,7,4,Num+ (tmp/100)*4);
- lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);
- lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);
- }
- else {
- lcd12864_put_xystr(99,7,4,Num+ (tmp/1000)*4);
- lcd12864_put_xystr(104,7,4,Num+ (tmp/100%10)*4);
- lcd12864_put_xystr(109,7,4,Num+ (tmp/10%10)*4);
- lcd12864_put_xystr(114,7,4,Num+ (tmp%10)*4);
- }
- }
復制代碼
0.png (61.09 KB, 下載次數(shù): 171)
下載附件
2016-9-1 13:52 上傳
|