Board logo

標題: 攪左差唔多 2 星期既 KS0108 LCD [打印本頁]

作者: 閒魂    時間: 2007-2-24 08:32     標題: 攪左差唔多 2 星期既 KS0108 LCD


作者: 觀星是答案    時間: 2007-2-24 09:57

幾時可以將塊 Bread Board 轉成 PCB ?
作者: 閒魂    時間: 2007-2-24 10:29

已經轉左了!

第一張一排黃線果塊已經係…有埋 IC,今朝影的…

面包板係 2-13 係 lab 影…
作者: 閒魂    時間: 2007-2-24 10:38

廢機影廢相…
作者: 觀星是答案    時間: 2007-2-24 10:52

o甘係時候簡化 o的線 & 寫個 user friendly 的 program 出來了
作者: Enzo    時間: 2007-2-24 13:13

我而家玩緊bs2
作者: 閒魂    時間: 2007-2-24 23:21

原帖由 觀星是答案 於 2007-2-24 10:52 發表
o甘係時候簡化 o的線 & 寫個 user friendly 的 program 出來了
應該唔會了…
就係 program 佢出個溫度同時間已經寫左 1 星期…

佢係 graphical lcd,入面冇文字的!

因此要好似 php 咁 load ttf 檔用 gd 將文字變成 wbmp 圖,然後再寫多個 program load 個 wbmp 黎 show 圖!
作者: herman    時間: 2007-2-25 00:11

仲咩唔用你部 dslr 影 ???
作者: nissin    時間: 2007-2-25 00:45

塊LCD係邊度買架? 幾$?
作者: 閒魂    時間: 2007-2-25 01:14

華輝 $300
作者: Enzo    時間: 2007-2-25 01:42

原帖由 閒魂 於 25/2/2007 01:14 發表
華輝 $300
同我地粒bs2差唔多
作者: 閒魂    時間: 2007-2-25 03:53

原帖由 Enzo 於 2007-2-25 01:42 發表
同我地粒bs2差唔多
bs2 係咩黎?
作者: nissin    時間: 2007-2-25 03:57

原帖由 閒魂 於 2007-2-25 03:53 發表
bs2 係咩黎?
basic stamp 2
作者: nissin    時間: 2007-2-26 08:18

原帖由 閒魂 於 2007-2-24 23:21 發表
應該唔會了…
就係 program 佢出個溫度同時間已經寫左 1 星期…

佢係 graphical lcd,入面冇文字的!

因此要好似 php 咁 load ttf 檔用 gd 將文字變成 wbmp 圖,然後再寫多個 program load 個 wbmp 黎 show 圖! ...
不如share....
等其他有心人同你改
作者: 閒魂    時間: 2007-2-27 00:10

原帖由 nissin 於 2007-2-26 08:18 發表


不如share....
等其他有心人同你改
呢個係將 192x64 的 wbmp 經 stdin 輸入,再 display 到 lcd 的程式…
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #include "serdisplib/serdisp.h"

  4. int main(int argc, char **argv) {

  5.         char sdcdev[] = "0x378";/* use parallel port */
  6.         char dispname[] = "KS0108";/* display name */
  7.         serdisp_CONN_t* sdcd;
  8.         serdisp_t* dd = 0;
  9.         int i,j,x,y;
  10.         unsigned char b;
  11.         sdcd = SDCONN_open(sdcdev);

  12.         dd = serdisp_init(sdcd, dispname, "width=192;delay=400;invert=yes");
  13.         //serdisp_clear(dd);

  14.         x=0;y=0;

  15.         getchar();getchar();getchar();getchar();getchar();

  16.         for (j=0;j<64;j++) {
  17.                 for (i=0;i<24;i++) {
  18.                         b = getchar();
  19.                         if (b >= 128) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=128;}
  20.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  21.                         if (b >= 64 ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=64;}
  22.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  23.                         if (b >= 32 ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=32;}
  24.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  25.                         if (b >= 16 ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=16;}
  26.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  27.                         if (b >= 8  ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=8;}
  28.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  29.                         if (b >= 4  ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=4;}
  30.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  31.                         if (b >= 2  ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=2;}
  32.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  33.                         if (b >= 1  ) {serdisp_setpixel(dd, x, y, SD_COL_BLACK); b-=1;}
  34.                         else serdisp_setpixel(dd, x, y, SD_COL_WHITE);  x++;
  35.                 } x=0; y++;
  36.         }

  37.         serdisp_setpixel(dd, 191,63,SD_COL_BLACK); // This statement is used to prevent some bugs of libserdisp.
  38.         serdisp_update(dd);

  39.         return(0);
  40. }
複製代碼

作者: 閒魂    時間: 2007-2-27 00:12

用 gd 將文字轉 wbmp
  1. #include "gd.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <getopt.h>

  5. char *utf2ucs(char *outs, const unsigned char *c);

  6. int main(int argc, char *argv[]) {
  7.         gdImagePtr im;
  8.         int black;
  9.         int white;
  10.         int brect[8];
  11.         int x, y;
  12.         char *err;
  13.         FILE *out;
  14.         int option;
  15.         char *s = "Default string ä½| æ²~Ræ~\~I輸å~E¥ä»»ä½~Uå­~W串";
  16.         double sz = 8.;
  17.         char *z = "      ";
  18.         char *f = "/usr/share/fonts/fireflysung/fireflysung.ttf";

  19.         while ((option = getopt(argc, argv, "s:f:z:")) != EOF) {
  20.                 switch (option) {
  21.                         case 's' : s = strdup(optarg) ; break;
  22.                         case 'f' : f = strdup(optarg) ; break;
  23.                         case 'z' : z = strdup(optarg) ; break;
  24.                 }
  25.         }

  26.         sz = atoi(z);
  27.         if (sz == 0) sz = 8.;

  28.         /*  content of brect[8]

  29.                 6,7             4,5
  30.                  +---------------+
  31.                  |               |
  32.                  |               |
  33.                  +---------------+
  34.                 0,1             2,3      */


  35.         im = gdImageCreate(192,64);

  36.         white = 0; //gdImageColorResolve(im, 255, 255, 255);
  37.         black = 1; //gdImageColorResolve(im, 0, 0, 0);

  38.         x = 0; // - brect[6];
  39.         y = sz+1; // - brect[7];
  40.         /*      char   *gdImageStringFT (
  41.                         gdImagePtr im,
  42.                         int *brect,
  43.                         int fg,
  44.                         char *fontname,
  45.                         double ptsize,
  46.                         double angle,
  47.                         int x, int y,
  48.                         char *string ) */

  49.         err = gdImageStringFT(im,&brect[0],black,f,sz,0.0,x,y,s);
  50.         if (err) {fprintf(stderr,err); return 1;}
  51.         gdImageWBMP(im, white, stdout); // fclose(out);
  52.         gdImageDestroy(im);
  53. }

  54. char *utf2ucs(char *outs, const unsigned char *c) {

  55.         int x, x1, x2, x3;
  56.         int i;

  57.         for (i=0;i<strlen(c);i++) {

  58.                 if (c[i] < 128)
  59.                         sprintf(outs, "%s%c",outs, c[i]);
  60.                 else if (c[i] >= 192 && c[i] < 224) {
  61.                         x1 = c[i] - 192;
  62.                         x2 = c[i+1] - 64;
  63.                         i++;
  64.                         x = x1 * 128 + x2;
  65.                         sprintf(outs, "%s&#%d;",outs, x);
  66.                 } else if (c[i] >= 224 && c[i] < 240) {
  67.                         x1 = c[i] - 224;
  68.                         i++;
  69.                         x2 = c[i] - 128;
  70.                         i++;
  71.                         x3 = c[i] - 128;
  72.                         x = x1 * 4096 + x2 * 64 + x3;
  73.                         sprintf(outs, "%s&#%d;",outs, x);
  74.                 } else printf("Unxpected character\n");
  75.         }

  76.         return outs;
  77. }
複製代碼

作者: nissin    時間: 2007-2-27 00:39

有無for Parallel 行 HD44780 的 program

#include "gd.h"
#include "serdisplib/serdisp.h" <---- 呢2個去邊度搵?
作者: 閒魂    時間: 2007-2-27 09:21

sereach libgd 同 libserdisp 就會有!

hd44780 簡單得多!

lcd.h
  1. //#include <dos.h>
  2. #include <string.h>
  3. //#include <conio.h>
  4. #include <time.h>
  5. #include <stdio.h>
  6. #include <asm/io.h>
  7. #include <unistd.h>

  8. #define PORTADDRESS 0x378 /* Enter Your Port Address Here */

  9. #define DATA PORTADDRESS+0
  10. #define STATUS PORTADDRESS+1
  11. #define CONTROL PORTADDRESS+2

  12. void lcd_init(void);
  13. void lcd_write(char char2write);
  14. void lcd_putch(char char2write);
  15. void lcd_puts(char * str2write);
  16. void lcd_goto(int row, int column);
  17. void lcd_clear(void);
  18. void lcd_home(void);
  19. void lcd_cursor(int cursor);
  20. void lcd_entry_mode(int mode);
複製代碼
lcd.c
  1. #include "lcd.h"


  2. void lcd_init()
  3. {

  4. //    outb(CONTROL, inb(CONTROL) & 0xDF);
  5.     outb(inb(CONTROL) & 0xDF, CONTROL);
  6.     //config data pins as output

  7. //    outb(CONTROL, inb(CONTROL) | 0x08);
  8.     outb(inb(CONTROL) | 0x08, CONTROL);
  9.     //RS is made high: control (register select)

  10.     lcd_write(0x0f);
  11.     usleep(20000);
  12.     lcd_write( 0x01);
  13.     usleep(20000);
  14.     lcd_write( 0x38);
  15.     usleep(20000);

  16. }

  17. void lcd_write(char char2write)
  18. {

  19.     outb(char2write,DATA);
  20.     outb(inb(CONTROL) | 0x01 ,CONTROL); /* Set Strobe */
  21.     usleep(200);
  22.     outb(inb(CONTROL) & 0xFE, CONTROL); /* Reset Strobe */
  23.     usleep(200);

  24. }

  25. void lcd_putch(char char2write)
  26. {

  27.     outb(inb(CONTROL) & 0xF7, CONTROL);
  28.     //RS=low: data
  29.     lcd_write(char2write);

  30. }

  31. void lcd_puts(char *str2write)
  32. {

  33.     outb(inb(CONTROL) & 0xF7, CONTROL);
  34.     //RS=low: data
  35.     while(*str2write)
  36.         lcd_write(*(str2write++));

  37. }

  38. void lcd_goto(int row, int column)
  39. {

  40.     outb(inb(CONTROL) | 0x08, CONTROL);
  41.     if(row==2) column+=0x40;
  42.     /* Add these if you are using LCD module with 4 columns
  43.     if(row==2) column+=0x14;
  44.     if(row==3) column+=0x54;
  45.     */
  46.     lcd_write(0x80 | column);

  47. }

  48. void lcd_clear()
  49. {

  50.     outb(inb(CONTROL) | 0x08, CONTROL);
  51.     lcd_write(0x01);

  52. }

  53. void lcd_home()
  54. {

  55.     outb(inb(CONTROL) | 0x08, CONTROL);
  56.     lcd_write(0x02);

  57. }

  58. void lcd_entry_mode(int mode)
  59. {

  60.     /*
  61.     if you dont call this function, entry mode sets to 2 by default.
  62.     mode: 0 - cursor left shift, no text shift
  63.     1 - no cursor shift, text right shift
  64.     2 - cursor right shift, no text shift
  65.     3 - no cursor shift, text left shift
  66.     */
  67.     outb(inb(CONTROL) | 0x08, CONTROL);
  68.     lcd_write(0x04 + (mode%4));

  69. }

  70. void lcd_cursor(int cursor)
  71. {

  72.     /*
  73.     set cursor: 0 - no cursor, no blink
  74.     1 - only blink, no cursor
  75.     2 - only cursor, no blink
  76.     3 - both cursor and blink
  77.     */


  78.     outb(inb(CONTROL) | 0x08, CONTROL);
  79.     lcd_write( 0x0c + (cursor%4));

  80. }
複製代碼
clock.c (sample program)
  1. #include "lcd.h"

  2. int main(void)
  3. {

  4.         if (ioperm(PORTADDRESS, 3, 1)) {perror("ioperm"); return(1);}

  5.         time_t t;
  6.         struct tm *tm;
  7.         char msg[20];
  8.         char ft[20];
  9.         lcd_init();
  10.         lcd_goto(1,0);

  11.         t = time(NULL);
  12.         tm = localtime(&t);

  13.         strftime(ft, 20, "   %Y-%m-%d", tm);
  14.         lcd_puts(ft);


  15.         while (1) {
  16.                 lcd_goto(2,0);
  17.                 t = time(NULL);
  18.                 tm = localtime(&t);
  19.                 strftime(ft, 20, "    %H:%M:%S     ", tm);
  20.                 sprintf(msg, "%s", ft);
  21.                 lcd_puts(msg);
  22.                 usleep(200000);
  23.         }

  24. }
複製代碼
Makefile
  1. default:        lcd

  2. lcd: main.o lcd.o
  3.         gcc main.o lcd.o -o lcd

  4. main.o: main.c
  5.         gcc -O -c main.c

  6. lcd.o: lcd.c lcd.h
  7.         gcc -O -c lcd.c

  8. clean :
  9.         - rm -f *.o
  10.         - rm -f lcd
  11.         - rm -f *~
複製代碼

作者: nissin    時間: 2007-2-27 10:33

用windows + visual studio 有無問題 ???
CLCD also buy in 華輝? How much?
作者: 閒魂    時間: 2007-2-27 14:24

CLCD 係 W Core 問呀蛇拎的!

上面全部 source 都係 complied from linux gcc and for linux
CLCD 果個可以試下改改佢…應該可以用 VS Compile!
另外 WinXP 唔比用 Program 直接 access hardware…
作者: nissin    時間: 2007-2-27 16:35

原帖由 閒魂 於 2007-2-27 14:24 發表
CLCD 係 W Core 問呀蛇拎的!

上面全部 source 都係 complied from linux gcc and for linux
CLCD 果個可以試下改改佢…應該可以用 VS Compile!
另外 WinXP 唔比用 Program 直接 access hardware… ...
我都知WinXP




歡迎光臨 PC Infinity (http://pcinhk.com/discuz/) Powered by Discuz! 7.0.0