//本程序在<a href="http://www.study-kit.com/list.asp?ProdId=NO052" target=_blank>http://www.study-kit.com/list.asp?ProdId=NO052</a>上通过测试<br />//HotPower@126.com 2008.4.17 2:28<br /><br />#include "lcd.h"<br /><br />LcdObj::LcdObj(void)<br />{<br /> Init();<br />}<br /><br />void LcdObj::Init(void)<br />{<br /> SendCommand(0x30);//发送功能设定控制命令(8位)<br /> SendCommand(0x30);//发送功能设定控制命令(8位)<br /> SendCommand(0x01);//发送清除显示命令 <br /> SendCommand(0x06);//发送进入点命令0x06 <br /> SendCommand(0x0a);//发送开关显示关光标命令<br /> SendCommand(0x0c);//发送开显示关光标命令<br /> SendCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0<br /> SendCommand(0x17);//游标或显示移位控制<br /> SendCommand(0x80);//发送设定DDRAM地址0x00命令,光标定位到(0,0)<br /> ClearBuffer();//清空LCD显示缓冲区<br /> DisplayBuffer();<br />}<br /><br />void LcdObj::delay(unsigned int t)<br />{<br /> while(t>0)<br /> {<br /> t--;<br /> for (int i = 0; i < 150; i++);<br /> }<br />}<br /><br />void LcdObj::SendCommand(char cCommand)<br />{<br /> LcdComH = cCommand;<br /> LcdComL = cCommand;<br /> if (cCommand == 0x01)//清除显示命令,需要等待时间相对较长<br /> {<br /> delay(1600);//st7920要求等待1.6mS<br />// DSP28x_usDelay(1600);//st7920要求等待1.6mS<br /> }<br /> else<br /> {<br /> delay(72);//st7920要求等待72uS<br />// DSP28x_usDelay(72);//st7920要求等待72uS<br /> }<br />}<br /><br />void LcdObj::SendData(char cData)<br />{<br /> LcdDatH = cData;<br /> LcdDatL = cData;<br /> delay(72);//st7920要求等待72uS<br />// DSP28x_usDelay(72);//st7920要求等待72uS<br />}<br /><br />void LcdObj::ClearBuffer(void)<br />{<br />unsigned char i, j;<br /> for (i = 0;i < 4;i ++) <br /> {<br /> for (j = 0;j < 16; j ++) <br /> {<br /> Buffer[j] = ' ';<br /> }<br /> RowWriteEnable = 1;//允许此行刷新汉字显示<br /> }<br /> Row = 0;<br /> Col = 0;<br />}<br /><br />void LcdObj::DisplayBuffer(void)<br />{<br />unsigned char i, j;<br /> for (i = 0; i < 4; i ++) <br /> {//4行汉字<br /> if (RowWriteEnable) <br /> {//允许此行刷新汉字显示<br /> SendCommand(0x80 + (i & 1) * 16 + (i >> 1) * 8);//移动光标<br /> for (j = 0; j < 16; j ++) <br /> {//每行8个汉字16个字符<br /> SendData(Buffer[j]);//刷新显示字符<br /> }<br /> RowWriteEnable = 0;//过后不允许此行刷新汉字显示<br /> }<br /> }<br />}<br /><br />void LcdObj::SetDisplayPos(unsigned char row, unsigned char col)<br />{<br /> Row = row & 0x03;//4行<br /> Col = col & 0x0f;//16列<br />}<br /><br />void LcdObj::Display(const char *string)<br />{<br />char len, i;<br /> len = strlen(string);<br /> if ((Row < 4) && ((Col + len) <= 16)) <br /> {<br /> if (len == 0) <br /> {<br /> while(Col < 16) <br /> {<br /> Buffer[Row][Col ++] = ' ';<br /> }<br /> }<br /> else<br /> for (i = 0; i < len; i ++) Buffer[Row][Col ++] = string;<br /> RowWriteEnable[Row] = 1;//需要显示刷新<br /> }<br />}<br /><br />#include "main.h"<br /><br />class SystemObj System;<br />class TimerObj Timer;//系统时间类<br />class LcdObj Lcd;<br />class KeyboardObj Keyboard;<br /><br /><br />int main(void)<br />{<br /> Lcd.SetDisplayPos(0, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示12");<br /> Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示34");<br /> Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示56");<br /> Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端<br /> Lcd.Display("汉字显示演示78");<br /><br /> EALLOW;<br />// PieCtrlRegs.PIEACK.all = 0xFFFF;//PIEACK_GROUP1;<br /> PieCtrlRegs.PIEACK.bit.ACK7 = 1;<br /> EDIS;<br /> <br /> EINT; // Enable Global interrupt INTM<br /> ERTM; // Enable Global realtime interrupt DBGM<br /> for(;;)<br /> {<br /> asm(" nop");<br /> // Reset the watchdog counter<br /> KickDog();<br /> }<br />}<br /><br /><br />interrupt void ISRTimer0(void)<br />{<br /> Lcd.DisplayBuffer();//定时刷新LCD显示(只刷新新行字符)<br /> PieCtrlRegs.PIEACK.bit.ACK7 = 1;<br />// PieCtrlRegs.PIEIFR1.bit.INTx7 = 1;<br />// PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;<br />} <br /> 相关链接:<a href='http://www.study-kit.com/list.asp?ProdId=NO052'>http://www.study-kit.com/list.asp?ProdId=NO052</a> |
|