我用AVR单片机控制HT1621驱动LCD,程序烧写后LCD只能全屏都显示,不能够通过更改显存数组中的值来控制LCD中某一段的显示的内容,也不能清屏,请给位帮我看看这个程序是否有问题,谢谢!<br /><br /><br /><br /><br />#include <iom48v.h> //AVR头文件<br /><br />typedef unsigned char uint8;<br />typedef unsigned int uint16;<br />typedef unsigned long int uint32;<br />typedef signed char sint8;<br />typedef signed int sint16; <br />typedef signed long int sint32; <br /><br /><br />//Lcd显示定义 <br /><br />//HT1621的WR引脚对应AVR的PORT口的PIN位置,在具体应用中要修改X<br />#define LCD_wr 3 <br /><br />//HT1621的DATA引脚对应AVR的PORT口的PIN位置,在具体应用中要修改X <br />#define LCD_data 4 <br /><br />//HT1621的CS引脚对应AVR的PORT口PIN的位置,在具体应用中要修改X <br />#define LCD_cs 2 <br /><br />//HT1621的WR引脚对应AVR的PORT口, 在具体应用中要修改X <br />#define LCDWRPORT PORTC <br /><br />//HT1621的DATA引脚对应于AVR的PORT口,在具体应用中要修改X<br />#define LCDDATAPORT PORTC <br /><br /> //HT1621的CS引脚对应于AVR的PORT口,在具体应用中要修改X<br />#define LCDCSPORT PORTC <br /><br /> //定义LCD显示缓冲区的空间<br />#define BuffSize 32 <br /><br />#define SYSEN 0x01<br />#define LCDOFF 0x02<br />#define LCDON 0x03<br />#define BAIS1_2 0X28<br />#define BAIS1_3 0X29<br />#define RC256K 0x18<br />#define TONEON 0x09<br />#define TONEOFF 0x08<br />#define TONE4K 0x40<br />#define TONE2K 0x60 <br /><br />#define NOP #asm("nop") <br /><br />//将DATA的高X位写入HT1621<br /> void SendHBit1621(uint8 data,uint8 x); <br /><br />//将DATA的低X位写入HT1621<br /> void SendLBit1621(uint8 data,uint8 x); <br /><br />//写入命令<br /> void PutLcdCommand(uint8 Command); <br /><br />//写入1个地址<br /> void PutLcdOnedata(uint8 ADD,uint8 DATA); <br /><br />//显示LCD缓冲区内容 从start~~end<BuffSize<br /> void PutLcdAllData(uint8 start,uint8 end); <br /><br />//对LCD缓冲区写相同数<br /> void PutLcdClear(uint8 start,uint8 end,uint8 x); <br /><br />//LCD初始化 <br /> void LCDInit(void); <br /><br />//LCD缓冲区<br />// uint8 LcdBuff[BuffSize]; <br /><br />uint8 LcdBuff[BuffSize]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0,0,0,0,0,0,0,0,0,0,<br /> 0,0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF}; <br /> <br /> <br />//------------------------------------------------------------------------------ <br />//DATA的高X位写入HT1621<br />void SendHBit1621(uint8 data,uint8 x)<br /> {<br /> uint8 i;<br /> for (i=0;i<x;i++)<br /> {<br /> //LCDWRPORT&=(0<<LCD_wr);<br /> LCDWRPORT&=~(1<<LCD_wr);<br /> NOP;//<br /> NOP;//<br /> NOP;//<br /> if ((data&0x80)==0){LCDDATAPORT&=~(1<<LCD_data);}<br /> else {LCDDATAPORT|=(1<<LCD_data);}<br /> NOP;<br /> <br /> NOP;//<br /> NOP;//<br /> LCDWRPORT|=(1<<LCD_wr);<br /> NOP;<br /> <br /> NOP;//<br /> NOP;//<br /> data<<=1;<br /> NOP;//<br /> NOP;//<br /> } <br /> } <br />//------------------------------------------------------------------------------<br />//将DATA的低X位写入HT1621<br />void SendLBit1621(uint8 data,uint8 x)<br /> {<br /> uint8 i;<br /> for (i=0;i<x;i++)<br /> {<br /> LCDWRPORT&=~(1<<LCD_wr);<br /> NOP;//<br /> NOP;//<br /> NOP//<br /> if ((data&0x01)==0){LCDDATAPORT&=~(1<<LCD_data);}<br /> else{LCDDATAPORT|=(1<<LCD_data);}<br /> NOP;<br /> <br /> NOP;//<br /> NOP;//<br /> LCDWRPORT|=(1<<LCD_wr);<br /> NOP;<br /> <br /> NOP;//<br /> NOP;//<br /> data>>=1;<br /> NOP;//<br /> NOP;//<br /> }<br /> } <br />//------------------------------------------------------------------------------<br />//写入命令<br />void PutLcdCommand(uint8 Command)<br /> {<br /> LCDCSPORT&=~(1<<LCD_cs); //LCD数据命令有效 <br /> NOP;//<br /> NOP;//<br /> SendHBit1621(0x80,3); //写入标志码"100"<br /> SendHBit1621(Command,9);//写入9位数据,前8位为Command命令<br /> //后一位任意 <br /> NOP;//<br /> NOP;// <br /> LCDCSPORT|=(1<<LCD_cs); //LCD数据命令无效<br /> NOP;//<br /> NOP;//<br /> } <br />//------------------------------------------------------------------------------<br />//写入1个地址<br />void PutLcdOnedata(uint8 ADD,uint8 DATA)<br /> {<br /> LCDCSPORT&=~(1<<LCD_cs); //LCD数据命令有效 <br /> NOP;//<br /> NOP;//<br /> SendHBit1621(0xa0,3); //写入标志码"101"<br /> SendHBit1621(ADD<<2,6); //写入6位地址<br /> SendLBit1621(DATA,4); //写入4位数据 <br /> NOP;//<br /> NOP;//<br /> LCDCSPORT|=(1<<LCD_cs); //LCD数据命令无效<br /> NOP;//<br /> NOP;//<br /> } <br />//------------------------------------------------------------------------------<br />//显示LCD缓冲区内容 Disp_LcdBuff[starts]~Disp_LcdBuff[end]<br />void PutLcdAllData(uint8 start,uint8 end)<br /> { <br /> uint8 i;<br /> LCDCSPORT&=~(1<<LCD_cs); //LCD数据命令有效<br /> NOP;//<br /> NOP;//<br /> SendHBit1621(0xa0,3); //写入标志码"101"<br /> SendHBit1621(0x00,6); //写入6位起始地址<br /> for (i=start;i<=end;i++){<br /> SendLBit1621(LcdBuff,4);}//写入4位数据<br /> NOP;//<br /> NOP;// <br /> LCDCSPORT|=(1<<LCD_cs); //LCD数据命令无效<br /> NOP;//<br /> NOP;//<br /> } <br />//------------------------------------------------------------------------------<br />//对LCD缓冲区写相同数<br />void PutLcdClear(uint8 start,uint8 end,uint8 x)<br /> { <br /> uint8 i;<br /> for (i=start;i<=end;i++)<br /> {LcdBuff=x;}<br /> } <br />//------------------------------------------------------------------------------<br />//LCD初始化 <br />void LCDInit(void)<br /> { <br /> PutLcdCommand(RC256K);<br /> PutLcdCommand(SYSEN); //打开系统振荡器<br /> PutLcdCommand(BAIS1_3); //设置偏压和占空比,BAIS1_3为1/3偏压4个公共口<br /> PutLcdCommand(TONE4K); <br /> PutLcdCommand(LCDON); //打开偏压发生器 LCDON<br /> } <br /><br />//------------------------------------------------------------------------------<br /> //端口初始化<br />void port_init(void)<br />{<br />PORTC = (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6);<br /> DDRC = (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(0<<PC6);<br />} <br />//------------------------------------------------------------------------------<br /> <br />void main(void)<br /> {<br /> //AVR_CPU初始化函数<br /> port_init();<br /> LCDInit();//HT1621初始化 <br /> while(1)<br /> {<br /> //缓冲器赋值函数<br /> PutLcdAllData(0,BuffSize);//显示LCD缓冲器内容<br /> }<br /> } <br /> |
|