⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jhdavrtest.c

📁 JHD529液晶的驱动程序,AVR单片机中使用GCC-AVRStudio
💻 C
字号:
#include <avr/io.h>
//#include <intrins.h>
#include <string.h>
/*
//本程序为ST7920驱动
sbit RST = P2^0;//RESET
sbit EN  = P2^1;//E
sbit RW  = P2^2;//R/W
sbit RS  = P2^3;//RS
#define  DATA   P0
*/
#define JHD_IO PORTC
#define JHD_PIN PINC
#define JHD_IODDR DDRC

#define JHD_Ctrl PORTD
#define JHD_RST PD0
#define JHD_EN PD1
#define JHD_RW PD2
#define JHD_RS PD3

unsigned char adch,adcl;
unsigned int adc;
unsigned int VolShow;
unsigned int CurShow;
unsigned char str1[]="--开关稳压电源--";
unsigned char str2[]="输出电压:      V";
unsigned char str3[]="输出电流:      A";


/*
#define clr_LCD12864_RST LCD12864_Ctrl &= ~_BV(LCD12864_RST);
#define set_LCD12864_RST LCD12864_Ctrl |= _BV(LCD12864_RST);
#define clr_LCD12864_EN  LCD12864_Ctrl &= ~_BV(LCD12864_EN);
#define set_LCD12864_EN  LCD12864_Ctrl |= _BV(LCD12864_EN);
#define clr_LCD12864_RW  LCD12864_Ctrl &= ~_BV(LCD12864_RW);
#define set_LCD12864_RW  LCD12864_Ctrl |= _BV(LCD12864_RW);
#define clr_LCD12864_DIN LCD12864_Ctrl &= ~_BV(LCD12864_DIN);
#define set_LCD12864_DIN LCD12864_Ctrl |= _BV(LCD12864_DIN);
*/
#define clr_RST JHD_Ctrl &= ~_BV(JHD_RST);
#define set_RST JHD_Ctrl |= _BV(JHD_RST);
#define clr_EN  JHD_Ctrl &= ~_BV(JHD_EN);
#define set_EN  JHD_Ctrl |= _BV(JHD_EN);
#define clr_RW  JHD_Ctrl &= ~_BV(JHD_RW);
#define set_RW  JHD_Ctrl |= _BV(JHD_RW);
#define clr_RS  JHD_Ctrl &= ~_BV(JHD_RS);
#define set_RS  JHD_Ctrl |= _BV(JHD_RS);

unsigned char LCD_addr[4][8]=
{
{0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87},
{0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97},
{0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f},
{0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f}
};


void InitLcd(void);
void WriteData(unsigned char ch);
void WriteCmd(unsigned char ch);
void ShowASC(unsigned char x,unsigned char *p);
void ShowChinese(unsigned char x,unsigned char *p);
void ShowStr(unsigned char x,unsigned char y,unsigned char *p);
void ShowChar(unsigned char x,unsigned char y,unsigned char ch);
unsigned char ReadRAM(unsigned char x,unsigned char y);
void ClrDGRAM(void);
void PaintPoint(unsigned char x,unsigned  char y);

/////////////////////////////////////////////////////////////////////////////////////
#define Snd_dian 11
#define Snd_V	12
#define Snd_A 13


#define setPlaySnd PORTB |= _BV(PB0);//播放语音1
#define clrPlaySnd PORTB &= ~_BV(PB0);//播放语音0


void PlaySound(unsigned char index)
{
	unsigned char j;
	unsigned int i;
	setPlaySnd;	
	PORTD &= 0x0f;	//高四位清0
	PORTD |=(index<<4);	
	clrPlaySnd; 	
	//for(i=0;i<33000;i++);
	for(j=0;j<8;j++)
	for(i=0;i<34780;i++);
}
///////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
	 unsigned int i;
	 unsigned int de;
	 DDRC=0xff;
	 PORTC=0xff;
	 DDRD=0xff;
	 PORTD=0xff;
	 PORTB=0xff;
	 
	 DDRB=0xff;
	 DDRB &= ~_BV(PB1); //按键
	 InitLcd();		  
	 //ClrDGRAM();
	
//	ClrDGRAM();
	 //WriteCmd(0x34);
//	WriteCmd(0x05);
//	WriteCmd(0x30);
	VolShow=123;
	CurShow=201;

	str2[10]='3';
	str2[11]='6';
	str2[12]='.';
	str2[13]='0';

	str3[10]='2';
	str3[11]='.';
	str3[12]='0';
	str3[13]='1';
	
	
	ADMUX |= _BV(REFS1) + _BV(REFS0) /*+ _BV(ADLAR)*/ ;//使用片内2.56V基准电压,数据左对齐
	ADCSRA |= _BV(ADEN) +/* _BV(ADSC) + _BV(ADIE)+  */_BV(ADPS1) + _BV(ADPS2) ;//AD使能,中断使能,64分频 125KHz,转换时间:1.5*8+13*8=116us,启动首次转换



	
     while(1)
	 {	 	 
	 	
		

	//	WriteCmd(0x06);
	//	WriteCmd(0x07);
	ADMUX &= ~_BV(MUX0);//通道0
	ADCSRA |= _BV(ADSC);//启动转换
	while(!(ADCSRA & _BV(ADIF)));//转换结束不?
	ADCSRA |= _BV(ADIF);//清0
	adcl=ADCL;
	adch=ADCH;
	adc=adch*256+adcl;
	
	VolShow=adc/2;

	str2[10]=(VolShow/100)%10+'0';
	str2[11]=(VolShow/10)%10+'0';
	str2[12]='.';
	str2[13]=VolShow%10+'0';



	ADMUX |= _BV(MUX0);//通道1
	ADCSRA |= _BV(ADSC);//启动转换
	while(!(ADCSRA & _BV(ADIF)));//转换结束不?
	ADCSRA |= _BV(ADIF);//清0
	adcl=ADCL;
	adch=ADCH;
	adc=adch*256+adcl;

	CurShow=adc*1.748;///2/*/0.143*/;


	str3[10]=(CurShow/100)%10+'0';
	str3[11]='.';
	str3[12]=(CurShow/10)%10+'0';
	str3[13]=CurShow%10+'0';

	ShowStr(0,0,str1);
	ShowStr(0,1,str2);
	ShowStr(0,2,str3);
		
		//ShowStr(0,1,str2);
		if(adc>=65535)ShowStr(0,3,"电压超出范围");
		else ShowStr(0,3,"                ");
		 for(i=0;i<60000;i++);	
		 
		 if(!(PINB & 0x02))	 //有键盘按下
		 {
		 	for(de=0;de<10000;de++);
			if(!(PINB & 0x02))	 //有键盘按下
		 	{
				while(!(PINB & 0x02));
			//	for(de=0;de<16;de++)
			//	{
			//		PlaySound(de);
			//	}

				if((VolShow/100)%10 !=0)
				{
					PlaySound((VolShow/100)%10);
					PlaySound(10);
				}
				if((VolShow/10)%10 !=0)PlaySound((VolShow/10)%10);
				PlaySound(Snd_dian);
				PlaySound(VolShow%10);
				PlaySound(Snd_V);
				for(de=0;de<1000;de++);

				PlaySound((CurShow/100)%10);
				PlaySound(Snd_dian);
				PlaySound((CurShow/10)%10);				
				PlaySound(CurShow%10);
				PlaySound(Snd_A);
		 	}
		 } 
	 }
}

void InitLcd(void)
{     
     clr_RST;
    // wait_5ms();
	 set_RST;
	 //wait_5ms();
	 //wait_5ms();
	 WriteCmd(0x30);	//功能设定,8位接口,基本指令集
	 //WriteCmd(0x34);	//功能设定,8位接口,基本指令集
	 WriteCmd(0x0c);   //开显示
	 WriteCmd(0x01);   //清屏
     WriteCmd(0x02);   //进入设定点
	
	// WriteCmd(0x80);
}
void LCDBusy(void)
{	
	JHD_IODDR=0x00;//输入
	while(1)
	{
		
		clr_RS;
		set_RW;
		set_EN;		
		if(!(JHD_PIN & 0x80))break; 
		clr_EN;
	}
	JHD_IODDR=0xff;
}

void WriteData(unsigned char ch)
{
     LCDBusy();
     //EN = 0;
     set_RS;  	//写数据
     clr_RW;
    // _nop_();
     set_EN;
     JHD_IO = ch;
	 //_nop_();
     clr_EN;
     clr_RS;
}


void WriteCmd(unsigned char ch)
{
     LCDBusy();
     //EN = 0;
     clr_RS;
     clr_RW;
  //   _nop_();
     set_EN;
     JHD_IO = ch;
//	 _nop_();
     clr_EN;
}


void ShowStr(unsigned char x,unsigned char y,unsigned char *p)
{
	unsigned char i;
	i=strlen(p);
	i/=2;
	while(i--)
	{	
		if(x>=8)
		{
			y++;
			x=0;
		}
		if(y>=4)break;
		WriteCmd(LCD_addr[y][x]);
		WriteData(*p);
		p++;
		WriteData(*p);
		p++; 
		x++;
				
	}
}
void ClrDGRAM(void)
{

         unsigned char i,j;
        
         WriteCmd(0x34);
		 		 WriteCmd(0x36);
         for(i=0;i<32;i++)  
         {		 
                 WriteCmd(0x80|i);
                 WriteCmd(0x80);  
                 for(j=0;j<16;j++)    
                 {   
				 	 //WriteCmd(0x34);                  
                     WriteData(0);
                     WriteData(0); 
					 //WriteCmd(0x36);
                 }
         }
		 //WriteCmd(0x36);
		 WriteCmd(0x30);
}
void PaintPoint(unsigned char y,unsigned char x)
{
		//WriteCmd(0x01);
		unsigned char col,row;
		unsigned char temp;
		unsigned char dat1,dat2;
		if(y<32)
		{
			row=y;
			col=x;
			temp=(col+16)%16;
		}else if(y>=32)
			{
				row=y-32;
				col=x+128;
				temp=col%16;	
			}
		
		col/=16;
		if(dat1<8)
		{
			dat2=0x80>>temp;
			dat1=0;
		}else 
			{
				dat2=0;
				dat1=0x80>>(temp-8);
			}

		WriteCmd(0x34);
		WriteCmd(0x36);

		WriteCmd(0x80+row);
		WriteCmd(0x80+col);
		
		WriteData(dat1);
		WriteData(dat2);
		WriteCmd(0x36);

		WriteCmd(0x30);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -