[ บทความ : การเขียนโปรแกรมกับ 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 ที่เราต้องการดาวน์โหลดด้วยนะครับ...