LCD如何顯示亂數 |
答題得分者是:scott123
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
最近要做專題 剛接觸C語言 很多東西都不太懂 使用8051
請問如果想把ranX的值顯示在LCD上 有大大可以提供方法嗎?? int ranX ranX=rand()P 1; // 1~50------------------------------------------------------------- 我在網路上有看到用 printf(s,"%d",ranX); 顯示出來是亂碼 我的部份程式碼: char MSG1[]=s; char MSG2[]="WELCOME"; WriteString(7,MSG2); while(1) { KeyScan(); if(KeyData!=0xff) { WriteIns(0x01); /* clear DD RAM */ if(KeyData==0) WriteString(2,MSG1); 編輯記錄
qwerty1789 重新編輯於 2012-06-04 03:22:58, 註解 無‧
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
不是一定要用中斷
只是開啟中斷之後,TL0和TH0會一直累加 當你按下KEY之後,可以把這兩個運算後當亂數 當然,產生亂數方法很多種 個人覺得這一個方法得到的亂數較真 16X2 LCM顯示方法很簡單 如果只是要應付專題,google,很多程式可以直接copy 如果想要學點東西,可以寫出目前卡在什麼地方,我們再幫忙提示 ===================引 用 qwerty1789 文 章=================== 我是用8051打的 16X2的LCM 請問一定要用中斷的方式嗎?? ranX在8051上不能用嗎? LCM顯示很簡單嗎?? 可以提供方法嗎? 現在只會顯示字串 |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
可以
===================引 用 qwerty1789 文 章=================== 所以用那個方法可以用4X4測定範圍嗎 假如初始值是1~50 那可以用按鍵改範圍 例:3~48 |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
看樣子你應該卡在LCD顯示和鍵盤掃描
看過書了嗎,8051的書都有範例 不想買的話,可以到學校圖書館借 ===================引 用 qwerty1789 文 章=================== 可以提供一下方法嗎?? 還有LCD顯示變數 還是找不到 //****************************************************************************** // MSP430G2452 MSP430G2452 // ----------------- ----------------- // /|\| XIN|- /|\| XIN|- // | | | | | | // --|RST XOUT|- --|RST XOUT|- // | | | | // >---| P3.0|-->DB0 >---| | // >---| P3.1|-->DB1 >---| | // >---| P3.2|-->DB2 >---| | // >---| P3.3|-->DB3 >---| | // >---| P3.4|-->DB4 >---| P3.0|-->DB4 // >---| P3.5|-->DB5 >---| P3.1|-->DB5 // >---| P3.6|-->DB6 >---| P3.2|-->DB6 // >---| P3.7|-->DB7 >---| P3.3|-->DB7 // >---| P2.0|-->RS >---| P2.0|-->RS // >---| P2.1|-->RW >---| P2.1|-->RW // >---| P2.2|-->EN >---| P2.2|-->EN // 8bit 4bit // //****************************************************************************** /******************************************************* Input: output:void description: *******************************************************/ void lcd_init(void) { _NOP(); _NOP(); delay(10000); _NOP(); write_command(0x38); //8位元 雙列 5x10點矩陣 write_command(0x38); //8位元 雙列 5x10點矩陣 delay(100); write_command(0x0C); //字幕顯示 游標不顯示 不閃爍 delay(100); write_command(0x01); //清除螢幕 delay(100); write_command(0x02); //游標歸零 delay(100); write_command(0x06); //游標右移 字幕不動 delay(100); } /******************************************************* Input: output:void description: *******************************************************/ void write_data(unsigned char value) { LCD_EN_0; LCD_RS_1; delay(10); LCD_RW_0; delay(10); LCD_DB_P=value; delay(10); LCD_EN_1; delay(10); LCD_EN_0; delay(10); } /******************************************************* Input: output:void description: *******************************************************/ void write_command(unsigned char value) { LCD_EN_0; LCD_RS_0; delay(10); LCD_RW_0; delay(10); LCD_DB_P=value; delay(10); LCD_EN_1; delay(10); LCD_EN_0; delay(10); } |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
我看的書 可是他都像我上面打的 用char MSG[] 來顯示
請問你的程式顯示變數是哪一段呢?? 好像沒看到 (還是我看不懂) 我的程式碼 不過我用printf 顯示出來是亂碼 那要怎嚜改LCD才會正常顯示呢 #include "reg51.h" #include "stdlib.h" #include "stdio.h" #define RS P2_0 #define RW P2_1 #define Enable P2_2 sbit P2_0=0xa0; sbit P2_1=0xa1; sbit P2_2=0xa2; void delay(void); void InitialLCD(void); void WriteIns(char); void WriteData(char); void WriteString(char,char *); void CheckBusy(void); void KeyScan(void); char one=0; char zero=0; int KeyData=0xff; int KeyTemp=0xff; int ranX; char s[5]; main() { char MSG0[]="WELCOME"; char MSG1[]="1"; char MSG2[]=s; ranX=(rand()P) 1; printf(s,"%d",ranX); InitialLCD(); WriteString(7,MSG0); while(1) { KeyScan(); if(KeyData!=0xff) { WriteIns(0x01); /* clear DD RAM */ if(KeyData==0) WriteString(7,MSG0); else if(KeyData==1) WriteString(1,MSG1); else if(KeyData==2) WriteString(1,MSG2); KeyData=0xff; } } } /* main */ void InitialLCD(void) { WriteIns(0x38); WriteIns(0x38); WriteIns(0x38); WriteIns(0x38); WriteIns(0x08); /* off display */ WriteIns(0x01); /* clear buffer */ WriteIns(0x0e); /* on display */ WriteIns(0x06); /* set input mode */ } /* InitialLCD */ void WriteIns(char instruction) { RS=0; RW=0; Enable=1; P0=instruction; Enable=0; CheckBusy(); } /* WriteIns */ void WriteData(char i) { RS=1; RW=0; Enable=1; P0=i; Enable=0; CheckBusy(); } /* WriteData */ void WriteString(count,MSG) char count; char MSG[]; { char i; for(i=0;i } /* WriteString */ void CheckBusy(void) { char i=0x80; while(i&0x80) { RS=0; RW=1; Enable=1; i=P0; Enable=0; delay(); } } /* CheckBusy */ void delay(void) { int i; for(i=0;i<500;i ) ; } /* delay */ void KeyScan(void) { char col,row; char ScanLine=0x08; int key=0; int KeyStatus; for(col=0;col<5;col ) { P1=~ScanLine; KeyStatus=~P1; KeyStatus&=0xf0; for(row=0;row<4;row ) { if(KeyStatus==0x80) { one=0; if(KeyTemp!=key) { KeyTemp=key; zero=1; } else { if(zero!=5) { zero =1; if(zero==5) KeyData=KeyTemp; } } } key =1; KeyStatus<<=1; } /* row */ ScanLine>>=1; } /* col */ one =1; if(one==5) { zero=0; KeyTemp=0xff; KeyData=0xff; } } /* KeyScan */ |
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
如果是這樣要怎麼轉呢
不太會用DEBUG 是這樣嗎 不過我看不太懂 char MSG2[]=s; C:0x0D91 782C MOV R0,#0x2C C:0x0D93 7C00 MOV R4,#0x00 C:0x0D95 7D00 MOV R5,#0x00 C:0x0D97 7BFF MOV R3,#0xFF C:0x0D99 7A10 MOV R2,#s(0x10) C:0x0D9B 7937 MOV R1,#0x37 C:0x0D9D 7E00 MOV R6,#0x00 C:0x0D9F 7F01 MOV R7,#0x01 C:0x0DA1 120C2C LCALL C?COPY(C:0C2C) printf(s,"%d",ranX); C:0x0DB7 7530FF MOV 0x30,#0xFF C:0x0DBA 753110 MOV 0x31,#s(0x10) C:0x0DBD 75322A MOV 0x32,#0x2A C:0x0DC0 F533 MOV 0x33,A C:0x0DC2 850934 MOV 0x34,0x09 C:0x0DC5 7B00 MOV R3,#0x00 C:0x0DC7 7A00 MOV R2,#0x00 C:0x0DC9 7910 MOV R1,#s(0x10) C:0x0DCB 120862 LCALL PRINTF(C:0862)
編輯記錄
qwerty1789 重新編輯於 2012-06-07 08:27:44, 註解 無‧
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
查一下lcd datasheet的字體表,如果沒有的話,請用ascii表代替,重要的字元都會一樣 輸入0x30=0 輸入0x40=a 輸入0x60=A 你可能是沒有字型轉換 所以你應該把0x35轉成可以輸出3和5的值 看一下ascii表,假設你的亂數是64,但你沒有做轉換就直接輸入的話,它會輸出 @ /******************************************************* Input: output:void description:把接收到的值轉成ascii,顯示到LCM *******************************************************/ void showasc2hex(unsigned char value) { unsigned char temp; temp = value; temp = temp >> 4; temp = temp 0x30; if(temp > 0x39) temp = temp 0x07; write_data(temp); temp = value; temp = temp & 0x0F; temp = temp 0x30; if(temp > 0x39) temp = temp 0x07; write_data(temp); } ===================引 用 qwerty1789 文 章=================== 我都接完了 就剩程式 就是那個亂數顯示出來是亂碼 不是數字 |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
判斷你已經可以點亮LCD了
再來就是了解LCD的運作 寫入LCD有分兩種,一種是COMMAND,一種是DATA 首先你COMMAND先下0X80 再下DATA 0X30 你就會看在第一行的第一格顯示0 再來就是COMMAND先下0XC2 再下DATA 0X40 你就會看在第二行的第三格顯示A 以上兩個都可以顯示的話,你應該知道怎麼修改了 WriteIns(0x80); WriteData(0x30); WriteIns(0xC2); WriteData(0x40); ===================引 用 qwerty1789 文 章=================== 可以解釋怎麼使用嗎??
編輯記錄
scott123 重新編輯於 2012-06-09 19:39:21, 註解 無‧
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
控制LCD這一個問題先把它解決了吧
先可以在LCD任意點顯示我們要的值,這是目前要先解決的 中斷開啟的時後,TL0和TH0會快速累加,所以我們可以利用這個來產生亂數 ===================引 用 qwerty1789 文 章=================== 我在網路上看到別人說rand 會重複 8051又沒有"time.h" 那該怎麼做 之前提到的計時器可以做嗎?? 看不太懂怎麼用 |
tick228
高階會員 發表:1 回覆:47 積分:104 註冊:2003-11-03 發送簡訊給我 |
您好, 提供幾點建議, 參考看看:
1. rand() 都是以一個種子(RandSeed)來當計算基值, 再由計算後的值當種子; 所以程式若未指定種子, 就會使用內定值; 程式每次重新執行, rand() 就會取得相同的值; 一般要使用 rand() 前, 都會在程式一開 始時, 就執行 srand(x) 來指定種子, x 就是種子值, 可取 TL0 及 TH0 來計算當種子. 2. 一般要將 printf() 的值傳給 char array, 不是用 sprintf() 嗎? printf(s,"%d",ranX); ==> sprintf(s,"%d",ranX); 3. WriteString(char,char *) 的使用方式不太好, 必須要指定字元數, 若可改成下列方式, 用指標 char* 即可 ///////////////////////////////// void WriteString(char *pMsg) { while( *pMsg ) WriteData( *pMsg ); } ///////////////////////////////// 4. 因應 3, char [] 需改用 char* 改為下列方式: ///////////////////////////////// char *MSG0="WELCOME"; char *MSG1="1"; char *MSG2=s; ///////////////////////////////// 呼叫 WriteString( ) 也改成下列方式: ///////////////////////////////// WriteString(MSG0); WriteString(MSG1); WriteString(MSG2); ///////////////////////////////// 5. 若是不改 printf(s,"%d",ranX); ==> printf(s,"-",ranX); WriteString(2, s); 謝謝!! qwerty1789 文 章=================== 我都接完了 就剩程式 就是那個亂數顯示出來是亂碼 不是數字 |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
感謝大大分享 之前還在困擾如果用變數不知道打幾位元
請問TH0當種子那個 程式碼的使用方法可以教我嗎?? 因為那個看了書還是不懂
編輯記錄
qwerty1789 重新編輯於 2012-06-11 05:23:32, 註解 無‧
|
tick228
高階會員 發表:1 回覆:47 積分:104 註冊:2003-11-03 發送簡訊給我 |
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
乾脆你把你的硬體電路po上來,我寫個程式給你測
===================引 用 qwerty1789 文 章=================== 請問可以教我嗎?? 因為第一個是英文網站 用GOOGLE翻譯 還是看不太懂 好像沒有提到如何寫 第二個文件是組合語言 我對組合語言很陌生看不太懂 |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
http://delphi.ktop.com.tw/download.php?download=upload/4fd6dc2c67260_test.rar
抱歉不知道怎麼直接連接下載,只好給載點了 先簡單說明一下 先把RS RW EN改成P2.5 P2.6 P2.7 我沒有4x4key,只有一個P1.0key,如果需要,可以自已增加 程式開始先做開始初使化設定後 首先在第一行第1格位置顯示123 然後在第二行第1格位置顯示ABC 然後如果偵測到KEY按下,則取TL0和TH0做相加,除10取餘數,然後經過轉換後,顯示在LCD上 void main(void) { lcm_init(); SerialInt_Init(); SystemInit(); _nop_(); print_command(clear_display); //清除螢幕 print_command(0x80); print_data(0x31); // print_data(0x32); // print_data(0x33); // print_command(0xC0); print_data(0x41); // print_data(0x42); // print_data(0x43); // delay1ms(60000); delay1ms(60000); while(1) { if(SW1==0) //如果按鈕被按下 { print_command(0x01); //清除螢幕 print_command(0x80); //顯示在第一行第1格 temp=TL0 TH0; //取TL0加TH0 temp=temp; //取除以10之後的餘數 0~9 asc2hex(temp); //經過轉換之後顯示在LCD上 delay1ms(60000); delay1ms(60000); } } }
編輯記錄
scott123 重新編輯於 2012-06-12 00:16:55, 註解 無‧
|
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
有試過嗎^^?
前輩的熱情可能很快就會被你澆熄了^^| ===================引 用 qwerty1789 文 章=================== 請問如果要把範圍改成1~50 temp=temp; 直接把10換成50就好了嗎?? 還是其他的也要改 例如: asc2hex(temp); void SerialInt_Init(void) |
scott123
中階會員 發表:19 回覆:66 積分:52 註冊:2011-08-11 發送簡訊給我 |
你的專題快要變成是我做的了,別忘了在專題報告後面感謝曾經在網路上解答過你問題的人
A%B是指 取A除以B之後餘數 先試看看我的程式可不可行,回覆一下 ===================引 用 qwerty1789 文 章=================== 請問如果要把範圍改成1~50 temp=temp; 直接把10換成50就好了嗎?? 還是其他的也要改 例如: asc2hex(temp); void SerialInt_Init(void) |
qwerty1789
一般會員 發表:1 回覆:21 積分:4 註冊:2012-06-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |