[ บทความ : การเขียนโปรแกรมกับ 68HC11- icc11 ] ตอนที่ 2 jr6811 กับ LCD


ซอฟท์แวร์ :
1. ImageCraft icc11 Version 5 for Windows
2. ETT jr-6811

ฮาร์ดแวร์ :
ETT jr-6811

จุดประสงค์ :
1. ทดลองติดตั้งตัวแปรระบบ เพื่อใช้กับ icc11
2. ทดลองแปลภาษาซี ให้เป็นไฟล์ฐานสิบหกของ โมโตโรลา (Motorola HEX)

ให้เขียนโปรแกรมเป็นภาษาซีชื่อ LCD4b.c ดังนี้

    //
    // Filename : LCD4b.c
    // Platform : jr6811 LCD port
    // Compiler : ICC11 Version 5 for Windows
    //

    #include <stdio.h>
    #include <hc11.h>

    /*
 	JR6811 LCD port
	PORTB.0 = RS
	PORTB.1 = E
	PORTB.4 = D4
	PORTB.5 = D5
	PORTB.6 = D6
	PORTB.7 = D7
     */

    void  LCD4_busy(void)
    {
        unsigned char in_loops;
        for (in_loops = 0; in_loops < 0x32; in_loops++) ;
    }

    void LCD4_goto(unsigned char data)
    {
	PORTB = (data & 0xF0) | 0x82;
	LCD4_busy();
	PORTB &= 0xFC;
	LCD4_busy();
	PORTB = (data << 4) | 0x02;
	LCD4_busy();
	PORTB &= 0xFC;
	LCD4_busy();
    }

    void LCD4_write_instruct(unsigned char command)
    {
	PORTB = (command & 0xF0) | 0x02;
    	LCD4_busy();
	PORTB &= 0xFC; 
    	LCD4_busy();
	PORTB = (command << 4) | 0x02;
    	LCD4_busy();
	PORTB &= 0xFC;
    	LCD4_busy();
    }

    void LCD4_putc(unsigned char ascii)
    {
	PORTB = (ascii & 0xF0) | 0x03;
	LCD4_busy();
	PORTB &= 0xFD;
	LCD4_busy();
	PORTB = (ascii << 4) | 0x03;
	LCD4_busy();
	PORTB &= 0xFD;
	LCD4_busy();
    }

    void LCD4_puts(char *lcd_string)
    {
    	while (*lcd_string) LCD4_putc(*lcd_string++);
    }

    void LCD4_CLS(void)
    {
    	LCD4_write_instruct(0x01);
    }

    void LCD4_init(void)
    {
    	LCD4_write_instruct(0x33);
    	LCD4_write_instruct(0x32);
    	LCD4_write_instruct(0x28);	// DL=0 4Bit,N=1 2Line,F=0 5X7
    	LCD4_write_instruct(0x0C);
    	LCD4_write_instruct(0x06);
    	LCD4_CLS();
    }

    void main(void)
    {
    	unsigned char data;

    	LCD4_init();
	setbaud(BAUD9600);
	puts("DoboINT > Hello 68HC11 world! and LCD4bit/n");
    	LCD4_puts("DoboINT projectI");
    	while (1) {
        		data = (unsigned char)getchar();
        		putchar(data);
    	}
    }

    #include "vectors.c"

ต่อไปนี้เป็นไฟล์ vectors.c ซึ่งเอาไว้ใช้กับบอร์ด jr-6811

    /* As is, all interrupts except reset jumps to 0xffff, which is most  likely not going to useful. To replace an 
     * entry, declare your function,  and then change the corresponding entry in the table. For example,
     * if you have a SCI handler (which must be defined with 
     * #pragma interrupt_handler ...) then in this file:
     * add
     *	extern void SCIHandler();
     * before th table.
     * In the SCI entry, change:
     *	DUMMY_ENTRY,
     * to
     *  SCIHandler, 
     */
    extern void _start(void);	/* entry point in crt??.s */

    #define DUMMY_ENTRY	(void (*)(void))0xFFFF
    #ifdef _HC12
    #pragma abs_address:0xffd0
    #else	/* HC11 */
    #pragma abs_address:0xffd6
    #endif

    /* change the above address if your vector starts elsewhere
     */
    void (*interrupt_vectors[])(void) = 
	{
	/* to cast a constant, say 0xb600, use
	   (void (*)())0xb600
	 */
    #ifdef _HC12
	/* 812A4 vectors starts at 0xff80, but most entries are not used 
	   if you use Key Wakeup H, change the start address to 0xffCE and
	   add one entry to the beginning */
	DUMMY_ENTRY,	/* BDLC */		/* Key Wakeup J */
	DUMMY_ENTRY,	/* ATD */		/* ATD */
	DUMMY_ENTRY,	/* RESERVED */		/* SCI 1 */
    #endif
	DUMMY_ENTRY,	/* SCI */
	DUMMY_ENTRY,	/* SPI */
	DUMMY_ENTRY,	/* PAIE */
	DUMMY_ENTRY,	/* PAO */
	DUMMY_ENTRY,	/* TOF */
	DUMMY_ENTRY,	/* TOC5 */		/* HC12 TC7 */
	DUMMY_ENTRY,	/* TOC4 */		/* TC6 */
	DUMMY_ENTRY,	/* TOC3 */		/* TC5 */
	DUMMY_ENTRY,	/* TOC2 */		/* TC4 */
	DUMMY_ENTRY,	/* TOC1 */		/* TC3 */
	DUMMY_ENTRY,	/* TIC3 */		/* TC2 */
	DUMMY_ENTRY,	/* TIC2 */		/* TC1 */
	DUMMY_ENTRY,	/* TIC1 */		/* TC0 */
	DUMMY_ENTRY,	/* RTI */
	DUMMY_ENTRY,	/* IRQ */
	DUMMY_ENTRY,	/* XIRQ */
	DUMMY_ENTRY,	/* SWI */
	DUMMY_ENTRY,	/* ILLOP */
	DUMMY_ENTRY,	/* COP */
	DUMMY_ENTRY,	/* CLM */
	_start	/* RESET */
	};
    #pragma end_abs_address

หลังจากนั้นก็ทำการคอมไพล์โปรแกรมตามตัวอย่างที่ 1 [ ... อ่านตอนที่ 1 ... ] แล้วก็ทำการโหลดลงบอร์ดด้วยโปรแกรม DL ที่ มากับชุดพัฒนาของ jr6811 ครับ แต่ที่ต้องระวังก็คือ โปรแกรม DL จะต้องอยู่ที่เดียวกับไฟล์ .S19 ที่เราต้องการดาวน์โหลดด้วยนะครับ...


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๓๐ พ.ค. พ.ศ. ๒๕๔๓, ๑๗ ส.ค. ๒๕๔๓