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

📄 display.c

📁 Avr单片机 At90can32 CAN 总线通信原代码 c语言
💻 C
字号:
#include "display.h"

//=============================================================

const unsigned char CGTAB[64]={ 0x00,0x40,0x37,0x10,0x81,0x61,0x22,0x0A,/*"液"= 80H*/
                               0x16,0x2B,0xE2,0x22,0x22,0x22,0x23,0x22,
                               0x80,0x44,0xFE,0x20,0x20,0x3C,0x44,0x64,
                               0x98,0x48,0x50,0x20,0x50,0x8E,0x04,0x00,
                               0x0F,0x08,0x08,0x0F,0x08,0x08,0x0F,0x08,/*"晶"= 84H*/
                               0x7E,0x42,0x42,0x7E,0x42,0x42,0x7E,0x42,
                               0xE0,0x20,0x20,0xE0,0x20,0x20,0xE0,0x24,
                               0xFE,0x84,0x84,0xFC,0x84,0x84,0xFC,0x84};

const prog_char CCTAB[4][32]={ 0x00,0x02,0xEC,0x08,0xC1,0x06,0xF4,0x10,    // 清
								0xC8,0x44,0xC7,0x44,0xC4,0x44,0x44,0x44,
								0x02,0x12,0x3F,0x02,0x1F,0x02,0x7F,0x10,
								0x3F,0x10,0x1F,0x10,0x1F,0x10,0x14,0x08,
                                0x20,0x20,0x10,0x10,0x18,0x94,0x52,0x10,    // 华
								0x90,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,
								0x02,0x12,0x1A,0x06,0x03,0x02,0x22,0x22,
								0x3C,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,
                                0x20,0xFF,0xA0,0x82,0xCC,0x28,0x80,0x6F,    // 蓬
								0xD8,0x08,0xC8,0x08,0xE8,0x08,0x14,0xE2,
								0x22,0x7F,0x02,0x1F,0x08,0x07,0x18,0x62,
								0x1F,0x02,0x1F,0x02,0x3F,0x02,0x62,0x3F,
                                0x90,0xBF,0x90,0x90,0x90,0x9E,0x82,0xE2,    // 张
								0x82,0x9E,0x90,0x90,0x90,0x90,0x8A,0x84,
								0x00,0x10,0x10,0x08,0x04,0x02,0x20,0x7F,
								0x02,0x02,0x04,0x04,0x08,0x72,0x21,0x00};


unsigned char  DTAB[11]={ 0x37,0x45,0x4c,0x43,0x4f,0x4d,0x45,0x00,0x39,0x4f,0x55};

PGM_P XX ;
//=============================================================

#define  Lcd_CD			PC0
#define  Lcd_REST		PC1
#define  Lcd_CS			PC2
#define  Lcd_WR			PG0
#define  Lcd_RD			PG1
#define LCD_CS_PORT   	PORTC
#define LCD_W_R_PORT	PORTG
//=============================================================

uchar readstate(void)		//读取LCD状态字
{
  uchar lcd_state;
  DDRA=0x00; 
  LCD_CS;    
  sbi(LCD_CS_PORT,Lcd_CD);		// C/D=1  
  cbi(LCD_W_R_PORT,Lcd_RD);		// /RD=0
  lcd_state=PINA&0xff;   // 读取引脚A物理电平
  asm("nop");
  asm("nop");      	
  sbi(LCD_W_R_PORT,Lcd_RD);		// /RD=1
  LCD_CS_OFF;	
  return lcd_state;
}

//判断指令(数据)读写状态
void st01(void)
{
  while((readstate()&0x03)!=3)
    ;   
}

//判断数据自动读状态
void st2(void)
{
  while((readstate()&0x04)!=4)
    ;
}

//判断数据自动写状态
void st3(void)
{
  while((readstate()&0x08)!=8)
    ;
}

//指令写入函数
void writecode(uchar comd0)
{
  st01();
  LCD_CS;
  DDRA=0xff;   //A口方向为输出
  PORTA=comd0;   //送数据到A口寄存器  
  sbi(LCD_W_R_PORT,Lcd_RD);		// /RD=1
  cbi(LCD_W_R_PORT,Lcd_WR);		// /WR=0
  asm("nop");  
  sbi(LCD_W_R_PORT,Lcd_WR);		// /WR=1
  LCD_CS_OFF;
}
 
//数据写入函数
void writedata(uchar onedata)
{
  st01();  
  LCD_CS;
  cbi(LCD_CS_PORT,Lcd_CD);	// C/D=0,数据通道  
  DDRA=0xff;   //A口方向为输出
  PORTA=onedata;  //送数据到A口寄存器
  cbi(LCD_W_R_PORT,Lcd_WR);  	// /WR=0  
  asm("nop");  
  sbi(LCD_W_R_PORT,Lcd_WR);		// /WR=1 
  LCD_CS_OFF;
}

//数据自动写入函数
void writeauto(uchar onedata)
{
  st3();
  LCD_CS;
  cbi(LCD_CS_PORT,Lcd_CD);	// C/D=0,数据通道  
  DDRA=0xff;   //A口方向为输出
  PORTA=onedata;  //送数据到A口寄存器
  cbi(LCD_W_R_PORT,Lcd_WR);  	// /WR=0  
  asm("nop");  
  sbi(LCD_W_R_PORT,Lcd_WR);		// /WR=1 
  LCD_CS_OFF;
}

//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
  writedata(onep1);
  writecode(comd1);
}

//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
  writedata(twop1);
  writedata(twop2);
  writecode(comd2);
}

//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
  twoparameter(0x00,0x00,0x40);  //文本显示区域首地址0x0000	
  twoparameter(0x10,0x00,0x41);  //文本显示区域宽度16字节
  twoparameter(0x00,0x08,0x42);  //图形显示区域首地址0x0800	
  twoparameter(0x10,0x00,0x43);  //图形显示区域宽度16字节
  writecode(0xa7);  //光标形状
  writecode(0x80);  //显示方式设置(使用内部CGROM,逻辑或合成)
  writecode(0x9c);  //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}
//清除屏幕(清所有8K存储空间)
void lcd_clear(void)
{ 
  uint cl_count;
  twoparameter(0x00,0x00,0x24);  //设置显示存储器首地址
  writecode(0xb0);  //设置自动写状态
  for(cl_count=8192;cl_count>0;cl_count--)
    writeauto(0x00);
  writecode(0xb2);  //关闭自动写状态  
}

//西文字符写入函数
//x_asc:0~29;  y_asc:0~15
void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
{
  uint address;
  address=y_asc*16+x_asc;
  twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址
  oneparameter(code_asc,0xc4);  //装入字符代码,写入数据,地址不变
}
//汉字写入函数
//x_hz:0~29;  y_hz:0~127
void writehz(uchar x_hz,uchar y_hz,uchar code_hz,PGM_P LL)
{
  uchar i_hz;
  uint zx;
  uint address,addr_hz;
  PGM_P LL1;
  address=y_hz*16+x_hz+0x0800;  //计算显示存储器地址
  address=0x13ff-address-1;		//计算显示存储器地址
  addr_hz=0;  //计算汉字字模地址(cctab的下标)
  for(i_hz=0;i_hz<16;i_hz++)  //计数值16
    {
   twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址
//   oneparameter((pgm_read_byte(LL)),0xc0);//CCTAB[code_hz][addr_hz],0xc0);  //写入汉字字模左部
	LL1=LL;
   oneparameter((pgm_read_byte(16+LL++)),0xc0); //CCTAB[code_hz][16+addr_hz++]),0xc0);  //写入汉字字模右部
   oneparameter((pgm_read_byte(LL1)),0xc0);//CCTAB[code_hz][addr_hz],0xc0);  //写入汉字字模左部
	address=address-16;
//  address+=16;  //修改显示存储器地址,显示下一列(共16列)
 }
}

//显示一个点函数
//x:0~239;  y:0~127(消除点)128~255(显示点)
void writepoint(uchar x,uchar y)
{
  uchar x_pt,y_pt;
  uint address;
  x_pt=x;  
  y_pt=y;
  address=(y_pt&0x7f)*32+x_pt/8+0x0800;  //计算显示存储器地址
  twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址
  x_pt=(~(x_pt%8))&0x07;
  y_pt=((y_pt&0x80)>>4)|0xf0;
  writecode(x_pt|y_pt);  //写入数据
}

void China(PGM_P XX,uchar gs,uchar Line)
{
	uchar i;
	for(i =0;i<gs;i++)
	{
		writehz(i*2,Line*16,i,XX+i*32);
	}
}

void Xs(void)
{
	uchar gs,line;
	switch(Pin)
	{
		case 1:{
					XX = CCTAB;
					gs = 4;
					line = 1;
					goto Chia_Disp;
				}

		case 2:{
					lcd_clear();
					XX = CCTAB;
					gs = 2;
					line = 0;
					goto Chia_Disp;
				}
		case 3: {
					lcd_clear();
				//	XX = PAGE3;
					goto Chia_Disp;
				 }
		case 4: {
					lcd_clear();
				//	XX = PAGE4;
					goto Chia_Disp;
				}
		case 5: {
					lcd_clear();
				//	XX = PAGE5;
					goto Chia_Disp;
				}
		case 6: {
					lcd_clear();
				//	XX = PAGE6;
					goto Chia_Disp;
				}
		
		Chia_Disp: China(XX,gs,line);
				break;
	}
}

⌨️ 快捷键说明

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