|
發布時間: 2015-6-8 07:18
正文摘要:求助:用adc0809采集電位器信號,并在12864液晶屏上顯示,但是12864老是出現亂碼,我的P0口分時復用,既做了ADC0809的數據口又做了12864液晶屏的數據口,請問這個問題怎么解決啊?原理圖: |
| 12864本來就有CS端的啊。。。 |
lxa0 發表于 2015-6-8 19:44 您好!12864怎么有CS端啊? |
admin 發表于 2015-6-8 11:59 程序上面的就是,求大神指點啊! |
|
P0口分時復用時 還要控制0809和12864片選( CS) |
| 把程序發上來看看 |
|
下面是我的程序: #include<reg52.h> #include<absacc.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int #define ADC0809 XBYTE[0xFBF8] /* 12864端口定義*/ #define LCD_data P0 //帶字庫液晶12864數據口 sbit LCD_RS = P2^3; //寄存器選擇輸入 sbit LCD_RW = P2^7; //液晶讀/寫控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^5; //并口控制 sbit RES=P2^4; sbit R=P1^7; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; _nop_(); _nop_(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /* */ /*寫指令數據到LCD */ /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delay(1); LCD_EN = 1; delay(1); LCD_EN = 0; } /*******************************************************************/ /* */ /*寫顯示數據到LCD */ /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */ /* */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; _nop_(); _nop_(); LCD_EN = 1; delay(1); LCD_EN = 0; } /*******************************************************************/ /* */ /* LCD初始化設定 */ /* */ /*******************************************************************/ void lcd_init() { P0=0xFF; delay(40); PSB=1; //并口方式。 delay(1); RES=0; delay(1); RES=1; lcd_wcmd(0x30); lcd_wcmd(0x30); lcd_wcmd(0x08); lcd_wcmd(0x10); lcd_wcmd(0x0C); //顯示開,關光標 lcd_wcmd(0x01); //清除LCD的顯示內容 lcd_wcmd(0x06); delay(100); LCD_EN = 0; } /*********************************************************/ /* */ /* 設定顯示位置 */ /* */ /*********************************************************/ void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==0) {X=0x80;} else if (X==1) {X=0x90;} else if (X==2) {X=0x88;} else if (X==3) {X=0x98;} pos = X+Y ; lcd_wcmd(pos); //顯示地址 } void main() { uint adc_data; int disi,disan,dier,diyi; lcd_init(); while(1) { uchar i; R=0; //蜂鳴器 ADC0809=i; delay(1000); adc_data=ADC0809; adc_data=adc_data*19.61; disi=adc_data/1000; disan=(adc_data%1000)/100; dier=(adc_data%1000%100)/10; diyi=adc_data%1000%100%10; delay(10000); delay(10000); delay(1000); lcd_pos(0,0); lcd_wdat(disi+0x30); lcd_wdat(disan+0x30); lcd_wdat(dier+0x30); lcd_wdat(diyi+0x30); } } 求大神指點!謝謝啦~~ |