#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xdp512" #define LCDData PORTB //lcd显示数据传送口 #define LCDData_D DDRB //数据口方向寄存器 #define LCDCtrl PORTK //lcd控制信号传送口 #define LCDCtrl_D DDRK //控制口方向寄存器 #define LCDRS 0 //lcd寄存器选择信号PTM2 #define LCDRW 1 //读写信号接PTM3 #define LCDE 2 //lcd使能信号接PTM6 void MCUInit(void); //芯片初始化函数声明 void LCDInit(void); //液晶显示初始化 void LCDShow(unsigned char str[]); //在HD44780显示屏上显示数据 void LCD_Command(unsigned char cmd); //执行给定的cmd命令 //主函数 void main(void) { //定义初始显示缓存并赋初值 const unsigned char *g_DispalyInit = "yiqiqingzhu.....Beijing20080808!"; asm sei //禁止总中断 // 芯片初始化 MCUInit(); // 模块初始化 LCDInit(); // 键盘初始化 //开放总中断 asm cli // LCD显示初始化 LCDShow((unsigned char *)g_DispalyInit); //程序总循环入口 for(;;) {} } void MCUInit(void)//芯片初始化(了解更多请阅读S12在线开发相关章节介绍) { asm sei REFDV=0x01; // initiate PLL clock SYNR =0x02; // system clock 24M while (!(CRGFLG & 0x08)){} //CRGFLG的D3=1则稳定,并且可做为系统时钟 CLKSEL=0x80; // 选定所相环时钟 FCLKDIV=0x49; //使FLASH 和 EEPROM // 的擦除操作工作频率在200HZ左右 ECLKDIV=0x49; } void LCDInit(void) //LCDInit:初始化LCD函数 { unsigned int i; //定义数据口(PTB0-7)为输出 LCDData_D = 0xFF; //数据口为输出 //定义控制口(PTC0-2)为输出 LCDCtrl_D |= (1<1.6ms LCD_Command(0X06); LCD_Command(0x14); //光标右移一个字符位,AC自动加1 LCD_Command(0x0C); //开显示,关光标显示,不闪烁 } void LCDShow(unsigned char str[])//LCDShow:在HD44780显示屏上显示数据 { unsigned char i; // LCD初始化 LCDInit(); // 显示第1行16个字符 //设置显示首地址 LCDCtrl &= ~(1 << LCDRS); //RS,R/W = 00(写的是指令) LCDCtrl &= ~(1 << LCDRW); LCD_Command(0x80); //后7位为DD RAM地址(0x00) //写16个数据到DD RAM LCDCtrl |= 1 << LCDRS; //RS,R/W = 10(写的是数据) LCDCtrl &= ~(1 << LCDRW); //将要显示在第1行上的16个数据逐个写入DD RAM中 for (i = 0;i < 16;i++) { LCD_Command(str[i]); } // 显示第2行16个字符 //设置显示首地址 LCDCtrl &= ~(1 << LCDRS); //RS,R/W = 00(写的是指令) LCDCtrl &= ~(1 << LCDRW); LCD_Command(0xC0); //后7位为DD RAM地址(0x40) //再写16个数据到DD RAM LCDCtrl |= 1 << LCDRS; //RS,R/W = 10(写的是数据) LCDCtrl &= ~(1 << LCDRW); //将要显示在第2行上的16个数据逐个写入DD RAM中 for (i = 16;i < 32;i++) { LCD_Command(str[i]); } } void LCD_Command(unsigned char cmd) //LCD_Command:执行给定的cmd命令 { unsigned char i; //延时等待 for (i=0; i<200; i++); for (i=0; i<200; i++); for (i=0; i<200; i++); for (i=0; i<200; i++); //数据送到LCD的数据线上 LCDData = cmd; //给出E信号的下降沿,使数据写入LCD LCDCtrl |= (1<